Foxtable(狐表)用户栏目专家坐堂 → 自选excel位置添加导入数据


  共有856人关注过本帖树形打印复制链接

主题:自选excel位置添加导入数据

美女呀,离线,留言给我吧!
采菊东篱下
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/14 14:52:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xls" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("基本信息").StopRedraw()
    Dim nms() As String = {"棋赛名称", "棋赛副名", "编号", "姓名", "身份"}
    Dim i1 As Integer = Array.Indexof(nms, "棋赛名称")
    Dim i2 As Integer = Array.Indexof(nms, "编号")
    Dim i3 As Integer = Array.Indexof(nms, "姓名")
    For n As Integer = 1 To Sheet.Rows.Count - 1
        Dim bh1 As String = sheet(n, i1).Text
        Dim bh2 As Integer = val(sheet(n, i2).Value)
        Dim bh3 As String = sheet(n, i3).Text
        Dim dr As DataRow
        If bh2 = 0 Then
            dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [编号] is null And [姓名] = '" & bh3 & "' And [身份] <> '参赛人'")
        Else
            dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [编号] =" & bh2 & " And [姓名] = '" & bh3 & "' And [身份] = '参赛人'")
        End If
        If dr Is Nothing Then '如果基本信息表不存在同一棋赛名称、编号、姓名的行
            dr = DataTables("基本信息").AddNew()
        End If
        For m As Integer = 0 To nms.Length - 1
            If Sheet(n, m).text > "" Then
                dr(nms(m)) = Sheet(n, m).Value
            Else
                dr(nms(m)) = Nothing
            End If
        Next
    Next
    Tables("基本信息").ResumeRedraw()
End If

安这代码导入依然报错,
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2022.8.18.1
错误所在事件:表,基本信息,DataColChanging
详细错误信息:
调用的目标发生了异常。
从字符串“”到类型“Double”的转换无效。
输入字符串的格式不正确。
 

问题应该在于红色标注的代码,代码中的Excel表能不能不用列序识别,改用列名,因为只要关健数据代入,基本信息表中还有其他列如性别、手机号码、备注等等,不一定对数组中的个数,所以以数组第几个对应Excel表列序或基本信息表中的列序都不对的,因此导入报错。
[此贴子已经被作者于2024/3/14 19:45:37编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107014 积分:544295 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/3/14 15:07:00 [只看该作者]

参考这种,使用字典记录列名之间的关系:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=102185

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/14 23:14:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xls;*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim App As New MSExcel.Application
    Try
        Dim Wb As MSExcel.Workbook = App.WorkBooks.Open(dlg.FileName)
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
        Tables("基本信息").StopRedraw()
        Dim nms() As String = {"棋赛名称", "棋赛副名", "编号", "姓名", "身份"}
        Dim dict As New Dictionary(Of String, Integer)
        Dim dict2 As New Dictionary(Of String, Integer)
        Dim Rg As MSExcel.Range = Ws.UsedRange
        Dim ary = rg.value
        For c As Integer = 1 To rg.Columns.Count
            If array.Indexof(nms, ary(1, c)) >= 0 Then
                dict.add(ary(1, c), c)
            End If
            If Tables("基本信息").Cols.Contains(ary(1, c)) Then
                dict2.add(ary(1, c), c)
            End If
        Next
        Dim newcount As Integer = 0
        Dim Modifycount As Integer = 0
        For n As Integer = 2 To rg.Rows.count
            Dim bh1 As String = ary(n, 1)
            Dim bh2 As String = ary(n, 2)
            Dim bh3 As String = ary(n, 3)
            Dim bh4 As String = ary(n, 4)
            Dim dr As DataRow
            If bh2 = 0 Then
                If bh3 = 0 Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] = '" & bh3 & "' And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            ElseIf bh2 <> 0 Then
                If bh3 = 0 Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] Is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] =" & bh3 & " And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            End If
            If dr Is Nothing Then '如果基本信息表不存在同一棋赛名称、编号、姓名的行
                dr = DataTables("基本信息").AddNew()
                For Each key As String In dict2.Keys
                    dr(key) = ary(n, dict2(key))
                Next
                newcount += 1
            Else
                For Each key As String In dict.Keys
                    dr(key) = ary(n, dict(key))
                Next
                Modifycount += 1
            End If          
        Next
        Tables("基本信息").ResumeRedraw()
    Catch ex As exception
        app.quit
    End Try
End If

见有数据导入了,这是Excel表上的数据:


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20240314230137.png
图片点击可在新窗口打开查看

导入基本信息表后基本信息表上的身份变成性别,因为上面的数组没有性别,而性别列在身份列前,造成取数有误,身份被性别取替,是否所有有数据的列,数组上都要有名称?这样数组岂不是很长?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107014 积分:544295 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/3/14 23:22:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xls;*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim App As New MSExcel.Application
    Try
        Dim Wb As MSExcel.Workbook = App.WorkBooks.Open(dlg.FileName)
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
        Tables("基本信息").StopRedraw()
        Dim dict2 As New Dictionary(Of String, Integer)
        Dim Rg As MSExcel.Range = Ws.UsedRange
        Dim ary = rg.value
        For c As Integer = 1 To rg.Columns.Count
            If Tables("基本信息").Cols.Contains(ary(1, c)) Then
                dict2.add(ary(1, c), c)
            End If
        Next
        Dim dr As DataRow
        For n As Integer = 2 To rg.Rows.count
            Dim bh1 As String = ary(n, dict2("棋赛名称"))
            Dim bh2 As String = ary(n, dict2("棋赛副名"))
            Dim bh3 As String = ary(n, dict2("编称"))
            Dim bh4 As String = ary(n, dict2("姓名"))
            If bh2 = "0" OrElse bh2 = "" Then
                If bh3 = "0" OrElse bh3 = "" Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] = '" & bh3 & "' And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            Else
                If bh3 = "0" OrElse bh3 = "" Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] Is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] =" & bh3 & " And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            End If
            If dr Is Nothing Then '如果基本信息表不存在同一棋赛名称、编号、姓名的行
                dr = DataTables("基本信息").AddNew()
            End If
            For Each key As String In dict2.Keys
                dr(key) = ary(n, dict2(key))
            Next
        Next
        Tables("基本信息").ResumeRedraw()
    Catch ex As exception
        app.quit
        Tables("基本信息").ResumeRedraw()
    End Try
End If

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/14 23:54:00 [只看该作者]

无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”。此操作失败的原因是对 IID 为“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 库没有注册。 (异常来自 HRESULT:0x8002801D (TYPE_E_LIBNOTREGISTERED))。

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/15 0:22:00 [只看该作者]

之前也有这样的提示,但基本信息表有数据导入,如今完全没数据导入。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107014 积分:544295 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/3/15 8:57:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xls;*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Try
        Dim Book As New XLS.Book(dlg.FileName)
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Tables("基本信息").StopRedraw()
        Dim dict2 As New Dictionary(Of String, Integer)
        For c As Integer = 0 To Sheet.Cols.Count - 1
            If Tables("基本信息").Cols.Contains(Sheet(1, c).Value) Then
                dict2.add(Sheet(1, c).Value, c)
            End If
        Next
        Dim dr As DataRow
        For n As Integer = 1 To Sheet.Rows.Count - 1
            Dim bh1 As String = Sheet(n, dict2("棋赛名称")).Value
            Dim bh2 As String = Sheet(n, dict2("棋赛副名")).Value
            Dim bh3 As String = Sheet(n, dict2("编称")).Value
            Dim bh4 As String = Sheet(n, dict2("姓名")).Value
            If bh2 = "0" OrElse bh2 = "" Then
                If bh3 = "0" OrElse bh3 = "" Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] is null And [编号] = '" & bh3 & "' And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            Else
                If bh3 = "0" OrElse bh3 = "" Then
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] Is null And [姓名] = '" & bh4 & "' And [身份] <> '参赛人'")
                Else
                    dr = DataTables("基本信息").SQLFind("[棋赛名称] = '" & bh1 & "' And [棋赛副名] = '" & bh2 & "' And [编号] =" & bh3 & " And [姓名] = '" & bh4 & "' And [身份] = '参赛人'")
                End If
            End If
            If dr Is Nothing Then '如果基本信息表不存在同一棋赛名称、编号、姓名的行
                dr = DataTables("基本信息").AddNew()
            End If
            For Each key As String In dict2.Keys
                dr(key) = Sheet(n, dict2(key)).Value
            Next
        Next
        Tables("基本信息").ResumeRedraw()
    Catch ex As exception
        Tables("基本信息").ResumeRedraw()
    End Try
End If

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/15 10:18:00 [只看该作者]

你的代码:
Tables("基本信息").ResumeRedraw()
    Catch ex As exception
        Tables("基本信息").ResumeRedraw()
    End Try
End If
我改为:
    Catch ex As exception
        Tables("基本信息").ResumeRedraw()
    End Try
End If
导入时没错误弹窗,但一个数据也没导入。
[此贴子已经被作者于2024/3/15 10:21:21编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107014 积分:544295 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/3/15 10:23:00 [只看该作者]

请上传实例说明

 回到顶部
美女呀,离线,留言给我吧!
采菊东篱下
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1881 积分:10368 威望:0 精华:0 注册:2019/4/6 8:45:00
  发帖心情 Post By:2024/3/15 11:14:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:象棋排赛2024315.rar

密码:888888
按菜单拦中的数据导出导入下的Excel导入基本信息按钮,导入下面的excel数据
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:模板.xls



 回到顶部
总数 28 上一页 1 2 3 下一页