Foxtable(狐表)用户栏目专家坐堂 → [求助]关于合并导入Excel代码优化


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

主题:[求助]关于合并导入Excel代码优化

帅哥哟,离线,有人找我吗?
neha
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:317 积分:2631 威望:0 精华:0 注册:2012/11/28 19:35:00
[求助]关于合并导入Excel代码优化  发帖心情 Post By:2014/4/4 8:18:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    e.Sender.Text = "导入中……"
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    'Tables("入库明细表").StopRedraw()
    '注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"窑号","窑洞","数量","单位","出窑人","担当","录入时间","验收时间","商品名"}
    Application.DoEvents
    '注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = "窑号 ='" & sheet(n,0).Text & "' and 窑洞 = " & sheet(n,1).Text & " and 数量 = " & sheet(n,3).Text & " and 出窑人 = '" & sheet(n,5).Text & "' and 验收时间 = #" & sheet(n,6).Text & "# and 商品名 = '" & sheet(n,2).Text & "'"
        If DataTables("入库明细表").sqlFind(bh) Is Nothing Then '如果不存在同编号的订单
            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
    e.Sender.Text = "导入"
    Tables("入库明细表").ResumeRedraw()
    
    
    
    
    'Dim dtb As New DataTableBuilder("导入临时表")
    'dtb.AddDef("窑号", Gettype(String), 5)
    'dtb.AddDef("窑洞", Gettype(Short))
    'dtb.AddDef("商品名", Gettype(String), 8)
    'dtb.AddDef("数量", Gettype(Integer))
    'dtb.AddDef("单位", Gettype(String), 2)
    'dtb.AddDef("出窑人", Gettype(String), 5)
    'dtb.AddDef("验收时间", Gettype(Date))
    'dtb.AddDef("录入时间", Gettype(Date))
    'dtb.AddDef("担当", Gettype(String), 5)
    'dtb.TableVisible=False
    'dtb.Build
    '
    'Dim mg As New Merger
    'mg.SourcePath = dlg.FileName
    'mg.Format = "excel" '指定格式
    'mg.SourceTableName = "导出的临时数据$" '指定要合并的表
    'mg.DataTableName = "入库明细表" '指定接收数据的表
    'mg.Merge() '开始合并
    '
    ''Dim f As  New Filler
    ''f.SourceTable = DataTables("导入临时表") '指定数据来源
    ''f.DataTable = DataTables("入库明细表") '指定数据接收表
    ''f.ExcludeExistValue = True
    ''f.Fill() '填充数据
    '
    
End If

这段代码如何优化,现在是运行代码就要很长时间

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/4 8:27:00 [只看该作者]

大量的并且多条件的 sqlFind 效率肯定不会高

如果是外部数据源,可以设置一下索引看看.

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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2014/4/4 9:26:00 [只看该作者]

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    e.Sender.Text = "导入中……"
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    'Tables("入库明细表").StopRedraw()
    '注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"窑号","窑洞","数量","单位","出窑人","担当","录入时间","验收时间","商品名"}
    Application.DoEvents
    '注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
Dim arrTemp As object = Sheet.UsedRange.value
dim cmd as new sqlcommand 
cmd.commandtext = "Select distinct 窑号,窑洞,数量,出窑人 ,验收时间 ,商品名 from 入库明细表"
dim dt as datatable =  cmd.ExecuteReader
    For n As Integer = 0 To arrTemp.Length -1
        Dim bh As String = "窑号 ='" & arrTemp(n,0).Text & "' and 窑洞 = " & arrTemp(n,1).Text & " and 数量 = " & arrTemp(n,3).Text & " and 出窑人 = '" & arrTemp(n,5).Text & "' and 验收时间 = #" & arrTemp(n,6).Text & "# and 商品名 = '" & arrTemp(n,2).Text & "'"
'如果以下这段还需要很多时间,就先用一个数组保存,然后一起添加行addnew(XX)再循环
        If dt.Find(bh) Is Nothing Then '如果不存在同编号的订单
            Dim r As Row = Tables("入库明细表").AddNew() ' 最耗时的是这句
            For m As Integer = 0 To nms.Length - 1
                r(nms(m)) = arrTemp(n,m).Value
            Next
        End If
    Next
    e.Sender.Text = "导入"
    Tables("入库明细表").ResumeRedraw()
    
End If

这段代码如何优化,现在是运行代码就要很长时间



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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/4 9:32:00 [只看该作者]

主要耗时应该在FIND条件上.尝试
dt.find("窑号 =''")
Dim bh As String = "窑号 ='" & arrTemp(n,0).Text & "' and 窑洞 = " & arrTemp(n,1).Text & " and 数量 = " & arrTemp(n,3).Text & " and 出窑人 = '" & arrTemp(n,5).Text & "' and 验收时间 = #" & arrTemp(n,6).Text & "# and 商品名 = '" & arrTemp(n,2).Text & "'"
f dt.Find(bh) Is Nothing Then '如果不存在同编号的订单

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


加好友 发短信
等级:小狐 帖子:317 积分:2631 威望:0 精华:0 注册:2012/11/28 19:35:00
  发帖心情 Post By:2014/4/4 9:56:00 [只看该作者]

---------------------------
错误
---------------------------
编译错误:“UsedRange”不是“XLS.Sheet”的成员。



错误代码:Dim arrTemp As object = Sheet.UsedRange.value
---------------------------
确定   
---------------------------


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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/4 9:58:00 [只看该作者]

试试4楼的方案.

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


加好友 发短信
等级:小狐 帖子:317 积分:2631 威望:0 精华:0 注册:2012/11/28 19:35:00
  发帖心情 Post By:2014/4/4 13:44:00 [只看该作者]

好了
sqlfind 和 find 差距那么大吗
Dim st As Date = Date.Now
'要测试耗时的代码
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog

dlg.Filter= "Excel文件|*.xls" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    e.Sender.Text = "导入中……"
    Dim count As Integer
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Application.DoEvents
    Tables(e.Form.name & "_明细表").StopRedraw
    Tables("入库明细表").StopRedraw()
    '注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
    Dim nms() As String = {"窑号","窑洞","商品名","数量","单位","出窑人","验收时间","录入时间","担当"}
    Dim cmd As new sqlcommand
    cmd.C
    cmd.commandtext = "Select distinct 窑号,窑洞,数量,出窑人,验收时间,商品名 from {入库明细表}"
    Dim dt As DataTable =  cmd.ExecuteReader
    
    '注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = "窑号 ='" & sheet(n,0).Text & "' and 窑洞 = " & sheet(n,1).Text & " and 数量 = " & sheet(n,3).Text & " and 出窑人 = '" & sheet(n,5).Text & "' and 验收时间 = #" & sheet(n,6).Text & "# and 商品名 = '" & sheet(n,2).Text & "'"
        Output.Show(bh)
        If dt.Find(bh) Is Nothing Then '如果不存在同编号的订单
            Dim r As Row = Tables("入库明细表").AddNew()
            For m As Integer = 0 To nms.Length - 1
                r(nms(m)) = Sheet(n,m).Value
            Next
            count = count + 1
        End If
        
    Next
    e.Sender.Text = "导入"
    Tables(e.Form.name & "_明细表").ResumeRedraw()
    Tables("入库明细表").ResumeRedraw()
    Tables("入库明细表").DataTable.Save
    MessageBox.Show("导入成功!" & vbcrlf & "总共导入" & count & "条数据 耗时: " & (Date.Now - st).TotalSeconds & "秒")
    
End If

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/4/4 13:51:00 [只看该作者]

 sqlfind 的话,一般是在使用频率不高的情况下使用的。因为每次连接数据库都需要开销

 

 如果需要多次查询的话,最好先把所有数据都拿出来,再查找


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


加好友 发短信
等级:小狐 帖子:317 积分:2631 威望:0 精华:0 注册:2012/11/28 19:35:00
  发帖心情 Post By:2014/4/4 17:25:00 [只看该作者]

为什么导入到狐表以后,2014-04-04 08:39变成2014-04-04 00:00了怎么得到正确的导入




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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/4 17:27:00 [只看该作者]

狐表里的时间格式正确吗?

Sheet(n,m).Value  取值的时候弹出来看看是否正常,

自己分析不出,就上个例子看看.

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