以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]如何优化excel表中取值代码 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=171373) |
||||||||
-- 作者:332595 -- 发布时间:2021/8/27 17:46:00 -- [求助]如何优化excel表中取值代码 300个excel文件读入数据特别慢,基本上是1秒1条,CPU占用率高达48%,麻烦大家给点优化建议。 以下内容为程序代码: 1 \'打开excel文件 2 \'循环前50行,30列各单元格是否包含 工作总量 关键字 3 \'如果包含则增加一行,然后循环查找数组中的值与excel文件各单位比对,找到后取出该傎对应的数值 4 5 6 For Each file As String In filesys.GetFiles("E:\\360极速浏览器下载\\工作量") 7 If file.EndsWith(".xls") Then 8 Dim filename = file.SubString(file.Length-14,10) 9 Dim Book As New XLS.Book(file) 10 Dim Sheet As XLS.Sheet = Book.Sheets(0) 11 For i As Integer = 20 To 50 \'行 12 For k As Integer = 1 To 30 \'列 13 Dim jbbg As String = sheet(i,k).Value \'查找 工作总量 关键字 14 If jbbg.Contains("工作总量") Then \'找到关键字后开始循环取出数组中的各项数据 15 Dim dr As Row =Tables("表A").AddNew 16 Dim cs() As String = {"值班日期","工作总量","访问量","责任人","工作平台"} 17 For m As Integer = 0 To cs.Length - 1 18 \'MessageBox.Show("这是从数组中取的第" & m & "次循环值是:" & cs(m)) 19 For n As Integer = 20 To 50 \'从行开始循环 20 For o As Integer = 0 To 40 \'从列开始循环 21 Dim gjj As String = sheet(n,o).value \'查找关键字 22 If gjj.StartsWith(cs(m)) Then 23 If m =0 Or m=6 Or m=7 Or m=9 Or m=10 Or m=12 Or m=13 Then 24 dr(cs(m)) = sheet(n,o+1).Text 25 ElseIf m =1 Or m=8 Or m=11 Or m=14 Or m=15 Or m=16 Or m=17 Or m=18 Then 26 dr(cs(m)) = sheet(n,o+2).Text 27 Else 28 dr(cs(m)) = sheet(n,o+3).Text 29 End If 30 Exit For 31 Else \'因为部分表中没有表头部分的日期,无法取出日期则需要将文件名日期引用进来 32 dr(cs(0)) = filename 33 End If 34 Next 35 Next 36 Next 37 Exit For 38 End If 39 Next 40 Next 41 End If 42 Next 43 MessageBox.Show("数据导入成功.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information) |
||||||||
-- 作者:332595 -- 发布时间:2021/8/27 17:48:00 -- \'打开excel文件 \'循环前50行,30列各单元格是否包含 工作总量 关键字 \'如果包含则增加一行,然后循环查找数组中的值与excel文件各单位比对,找到后取出该傎对应的数值 For Each file As String In filesys.GetFiles("E:\\360极速浏览器下载\\工作量") If file.EndsWith(".xls") Then Dim filename = file.SubString(file.Length-14,10) Dim Book As New XLS.Book(file) Dim Sheet As XLS.Sheet = Book.Sheets(0) For i As Integer = 20 To 50 \'行 For k As Integer = 1 To 30 \'列 Dim jbbg As String = sheet(i,k).Value \'查找 工作总量 关键字 If jbbg.Contains("工作总量") Then \'找到关键字后开始循环取出数组中的各项数据 Dim dr As Row =Tables("表A").AddNew Dim cs() As String = {"值班日期","工作总量","访问量","责任人","工作平台"} For m As Integer = 0 To cs.Length - 1 \'MessageBox.Show("这是从数组中取的第" & m & "次循环值是:" & cs(m)) For n As Integer = 20 To 50 \'从行开始循环 For o As Integer = 0 To 40 \'从列开始循环 Dim gjj As String = sheet(n,o).value \'查找关键字 If gjj.StartsWith(cs(m)) Then If m =0 Or m=6 Or m=7 Or m=9 Or m=10 Or m=12 Or m=13 Then dr(cs(m)) = sheet(n,o+1).Text ElseIf m =1 Or m=8 Or m=11 Or m=14 Or m=15 Or m=16 Or m=17 Or m=18 Then dr(cs(m)) = sheet(n,o+2).Text Else dr(cs(m)) = sheet(n,o+3).Text End If Exit For Else \'因为部分表中没有表头部分的日期,无法取出日期则需要将文件名日期引用进来 dr(cs(0)) = filename End If Next Next Next Exit For End If Next Next End If Next MessageBox.Show("数据导入成功.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
|
||||||||
-- 作者:有点蓝 -- 发布时间:2021/8/28 9:06:00 -- 上传2个execl文件看看 |
||||||||
-- 作者:332595 -- 发布时间:2021/8/30 10:17:00 --
[此贴子已经被作者于2021/8/30 10:17:27编辑过]
|
||||||||
-- 作者:有点蓝 -- 发布时间:2021/8/30 10:42:00 -- 如果是格式不固定,这些数据可能出现在任意单元格,也只能这样了 For Each file As String In filesys.GetFiles("E:\\360极速浏览器下载\\工作量") If file.EndsWith(".xls") Then Dim filename = file.SubString(file.Length-14,10) Dim Book As New XLS.Book(file) Dim Sheet As XLS.Sheet = Book.Sheets(0) Dim bb As Boolean For i As Integer = 20 To 50 \'行 For k As Integer = 1 To 30 \'列 Dim jbbg As String = sheet(i,k).Value \'查找 工作总量 关键字 If jbbg.Contains("工作总量") Then \'找到关键字后开始循环取出数组中的各项数据 Dim dr As Row =Tables("表A").AddNew Dim cs() As String = {"值班日期","工作总量","访问量","责任人","工作平台"} For m As Integer = 0 To cs.Length - 1 \'MessageBox.Show("这是从数组中取的第" & m & "次循环值是:" & cs(m)) For n As Integer = 20 To 50 \'从行开始循环 For o As Integer = 0 To 40 \'从列开始循环 Dim gjj As String = sheet(n,o).value \'查找关键字 If gjj.StartsWith(cs(m)) Then If m =0 Or m=6 Or m=7 Or m=9 Or m=10 Or m=12 Or m=13 Then dr(cs(m)) = sheet(n,o+1).Text ElseIf m =1 Or m=8 Or m=11 Or m=14 Or m=15 Or m=16 Or m=17 Or m=18 Then dr(cs(m)) = sheet(n,o+2).Text Else dr(cs(m)) = sheet(n,o+3).Text End If Exit For Else \'因为部分表中没有表头部分的日期,无法取出日期则需要将文件名日期引用进来 dr(cs(0)) = filename End If Next Next Next bb = True Exit For End If Next If bb = True Then Exit For Next End If Next MessageBox.Show("数据导入成功.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information) |
||||||||
-- 作者:332595 -- 发布时间:2021/8/30 11:16:00 -- 测试之后发现只能导入第一个文件呢。 感觉速度快起来了。
|
||||||||
-- 作者:有点蓝 -- 发布时间:2021/8/30 11:34:00 -- Dim bb As Boolean 改为 Dim bb As Boolean = false
|