以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  excel导入效率问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=178076)

--  作者:z769036165
--  发布时间:2022/6/16 21:10:00
--  excel导入效率问题
Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls*" \'设置筛选器
Dim tb As DataTable = DataTables("表A")
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    tb.LoadFilter = ""
    tb.Load
    tb.ReplaceFor("状态",False)
    Dim zdw As new List(of Integer)
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Dim zd As New Dictionary(Of Integer, String)
    For n As Integer = 0 To sheet.Cols.Count - 1
        If zd.ContainsValue(sheet(0,n).value.trim()) Then
            MessageBox.Show("存在重复列" & sheet(0,n).value.trim())
            Return
        Else
            zd.Add(n,sheet(0,n).value.trim())
        End If
    Next
    Dim s  As New List(Of Integer)
    For Each k As Integer In zd.Keys \'显示所有键及其对应的值
        If tb.DataCols.Contains(zd(k)) = False Then
            s.Add(k)
        End If
    Next
    For Each q As Integer In s
        zd.Remove(q)
    Next
    If zd.Count = 0 Then
        MessageBox.Show("不存在与导入表相符的列!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        Return
    End If
    Dim r As DataRow
    
    For n As Integer = 1 To Sheet.Rows.Count -1
        r =  tb.Find("编号 = \'" & sheet(n,0).value & "\'")
        If r Is Nothing Then
            zdw.Add(n)
            Continue For
        End If
        For Each k As Integer In zd.Keys \'显示所有键及其对应的值
            If sheet(n,k).value = r(zd(k)) Then
            Else
                r(zd(k)) = sheet(n,k).value
            End If
        Next
        r("状态") = True
    Next
    Dim tbq As Integer = tb.DataRows.Count
    tb.AddNew(zdw.Count)
    For Each n As Integer In zdw
        r = tb.DataRows(tbq)
        r("状态") = True
        For Each k As Integer In zd.Keys \'显示所有键及其对应的值
            If sheet(n,k).value = r(zd(k)) Then
            Else
                r(zd(k)) = sheet(n,k).value
            End If
        Next
        tbq += 1
    Next
End If
\'tb.Save

请问这个excel导入发现7000行的效率都很低,问题出现在r("状态") = True这个上面,理论上7000行,对行进行修改应该很快啊,这个居然需要3~5分钟才能执行完,我需要记录这个状态列,将删除的行,删除掉
[此贴子已经被作者于2022/6/16 21:16:43编辑过]

--  作者:有点蓝
--  发布时间:2022/6/16 21:16:00
--  
试试停止绘制并屏蔽事件

DataTables("表A").StopRedraw
systemready=false
1楼的代码
systemready=true
DataTables("表A").ResumeRedraw


--  作者:z769036165
--  发布时间:2022/6/16 21:19:00
--  
不行,不知道是不是表加载多了的问题,但是每个表加载的数据量不是很大
--  作者:有点蓝
--  发布时间:2022/6/16 21:43:00
--  
是不是表加载多了的问题,新建一个项目测试对比看看