以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]导入EXCEL表格更新原有数据的方法  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=106860)

--  作者:jjjeyes
--  发布时间:2017/9/16 22:56:00
--  [求助]导入EXCEL表格更新原有数据的方法
有个SQL数据源的表A,各列为“学号”,“姓名”,“性别”,“班级”,数据内容也有10000条。
因为数据内容有更新,设置了个“导入”按钮,准备从外部导入EXCEL表格(表123)更新原有数据内容。
请问,如何写这个“导入”按钮的代码。请指教!
注:1、表A的数据可能是10000条,外部EXCEL表格(表123)的数据可能是10000+10条。
     2、表A和表123可能就是部分学生的班级发生了变化。学生的学号不会变动。
     3、表123也有“学号”,“姓名”,“性别”,“班级”这几列
[此贴子已经被作者于2017/9/16 23:00:25编辑过]

--  作者:有点甜
--  发布时间:2017/9/17 15:07:00
--  

参考 http://www.foxtable.com/webhelp/scr/2334.htm

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=101056&skin=0

 


--  作者:jjjeyes
--  发布时间:2017/9/17 22:18:00
--  
我试过用下面的代码做:

Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    Dim c As Integer = 0
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("班级信息表").StopRedraw()
    \'注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"班级编号","班级名称","学院","学制","培养层次","年级","素质导师","备注"}
    \'注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = sheet(n,0).Text
        If DataTables("班级信息表").Find("班级编号 = \'" & bh & "\'") Is Nothing Then \'如果不存在同编号的订单
            c = c + 1
            Dim r As Row = Tables("班级信息表").AddNew()
            For m As Integer = 0 To nms.Length - 1
                r(nms(m)) = Sheet(n,m).Value
            Next
        End If
    Next
    Tables("班级信息表").ResumeRedraw()
    DataTables("班级信息表").Save
    MessageBox.Show("导入完成,共导入" & c & "条记录")
End If

但是试用过后又有个问题,以上代码可以对原有数据进行增加,不能对原有数据做修改!所以还是达不到我的要求。
我现在有个思路:就是将EXCEL数据先导入到临时表中,然后再用临时表和现有数据做比对用跨表引用的方式更新数据,请问这个办法可否?

--  作者:有点甜
--  发布时间:2017/9/17 23:04:00
--  

修改代码

 

Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    Dim c As Integer = 0
    Dim x As Integer = 0
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("班级信息表").StopRedraw()
    \'注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"班级编号","班级名称","学院","学制","培养层次","年级","素质导师","备注"}
    \'注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = sheet(n,0).Text
        dim fdr as datarow = DataTables("班级信息表").Find("班级编号 = \'" & bh & "\'")
        If fdr Is Nothing Then \'如果不存在同编号的订单
            c = c + 1
            fdr = dataTables("班级信息表").AddNew()
        else
            x = x + 1
        End If
        For m As Integer = 0 To nms.Length - 1
            fdr(nms(m)) = Sheet(n,m).Value
        Next
    Next
    Tables("班级信息表").ResumeRedraw()
    DataTables("班级信息表").Save
    MessageBox.Show("导入完成,共导入" & c & "条记录,修改" & x & "条记录")
End If


--  作者:jjjeyes
--  发布时间:2017/9/18 0:43:00
--  
非常感谢,虽然有些地方还没有看懂。但是已基本达到要求了。
不过后面的“修改x条信息”,不管导入多少条,只要是导入的不管和原先有没有不同,都记为修改了的。把原来相同的数据也记做了修改的条目

--  作者:有点甜
--  发布时间:2017/9/18 8:46:00
--  
以下是引用jjjeyes在2017/9/18 0:43:00的发言:
不过后面的“修改x条信息”,不管导入多少条,只要是导入的不管和原先有没有不同,都记为修改了的。把原来相同的数据也记做了修改的条目

 

变量n记录的是导入的新增的条数;变量x记录的是修改原来表的数据的条数。这两个数据不正确吗?


--  作者:jjjeyes
--  发布时间:2017/9/18 10:18:00
--  
打个比方,原数据有10000条,导入数据也有同样学号的10000条,只是有2条数据的班级和原班级不同,导入后显示为“导入0条,修改10000条”,按道理应是“导入0条,修改2条”才对!
--  作者:有点甜
--  发布时间:2017/9/18 10:41:00
--  

Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    Dim c As Integer = 0
    Dim x As Integer = 0
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("班级信息表").StopRedraw()
    \'注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"班级编号","班级名称","学院","学制","培养层次","年级","素质导师","备注"}
    \'注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = sheet(n,0).Text
        Dim fdr As DataRow = DataTables("班级信息表").Find("班级编号 = \'" & bh & "\'")
        If fdr Is Nothing Then \'如果不存在同编号的订单
            c = c + 1
            fdr = DataTables("班级信息表").AddNew()
        Else
            For m As Integer = 0 To nms.Length - 1
                If fdr(nms(m)) <> Sheet(n,m).Value
                    x = x + 1
                    Exit For
                End If
            Next
        End If
       
        For m As Integer = 0 To nms.Length - 1
            fdr(nms(m)) = Sheet(n,m).Value
        Next
    Next
    Tables("班级信息表").ResumeRedraw()
    DataTables("班级信息表").Save
    MessageBox.Show("导入完成,共导入" & c & "条记录,修改" & x & "条记录")
End If

[此贴子已经被作者于2017/9/18 10:42:06编辑过]

--  作者:jjjeyes
--  发布时间:2017/9/18 22:00:00
--  
非常感谢,对以上代码慢慢解读,终于有所明白!


另外还想询问一下,在导入Excel表格时,如何判别导入的EXCEL表格是否按原格式,每一列的位置没有变化!
我想这个也很重要,在很多时候也会用到,可是帮助文件也没有讲到。

--  作者:有点蓝
--  发布时间:2017/9/18 22:20:00
--  
列位置是可以不一样的,使用一个字典记住即可

帮助不是万能的,帮助是帮助学习基础的,进阶就要靠自己了