以文本方式查看主题 - 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=187935) |
-- 作者:creastzh -- 发布时间:2023/8/22 8:22:00 -- 从excel中交换数据 我每日需要大量交换Excel的数据,因此我使用了合并方式、数组方式,临时表导入方式Excel 数据,最后发现数据的方式可能要快一些,但每次需要交换约2w行数据,交换的过程感觉很慢,一些行数据没有变化就不交换,一旦行内任一数据发生了改变就需要按新的数据写入, 目前数据运算是否变更及写入差不多需要5~6分钟,关键是有时候运行到一定时候还会出现“超出系统资源”错误提示,不知是否有更好的办法, 谢谢! 代码如下: \'导入 生产计划 Import_WeeklyMachineSchedule If User.Type = UserTypeEnum.Developer Then Dim TableN As String = "WeeklyMachineSchedule" If Not DataTables.Contains(TableN) Then DataTables(TableN).LoadFilter = "" DataTables(TableN).Load End If Dim fp As String = "P:\\General documents\\Worktime Data\\Fox Data\\Query\\" Dim ff = "Weekly Machine Schdule.xlsx" Dim fpf As String = fp & ff If filesys.FileExists(fpf) Then DataTables(TableN).StopRedraw \'停止屏幕刷新 Dim cn As String \'列名称 Dim i As Integer Dim App As New MSExcel.Application App.DisplayAlerts = False App.visible = True Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(fpf) Dim s1 As Date = Date.Now Wb.RefreshAll Dim s2 As Date = Date.Now Dim s3 As TimeSpan = s2 - s1 Output.Show(s1 & " -- " & s2 & " 经过时间s:" & s3.TotalSeconds) \'MessageBox.Show(s3.TotalSeconds) Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1) Dim Rg As MSExcel.Range = Ws.UsedRange Dim ary = Rg.value Dim cs As Integer = Rg.Columns.Count \'cs =5 s2 = Date.Now s3 = s2 - s1 \'MessageBox.Show(s3.TotalSeconds) SystemReady = False \'停止所有其它程序 Dim bh As Boolean Try Dim i1 As Integer = 0 Dim Filter As String For i = 2 To Rg.Rows.Count If ary(i, 2) > "" AndAlso ary(i, 19) IsNot Nothing Then \'WO OP均存在的情形下 Filter = "[WO] = \'" & ary(i, 5) & "\' and [OP] = " & ary(i, 22) \'PN号 Dim dr As DataRow = DataTables(TableN).Find(Filter) If dr Is Nothing Then \'新增数据行 Dim ro As Row = Tables(TableN).AddNew For c As Integer = 1 To cs cn = ary(1, c) \'列名 If cn = "Process_Competed" Then If Len(ary(i, c)) > 0 Then ro(cn) = True Else ro(cn) = False End If ElseIf cn = "OnProcess" Then If Len(ary(i, c)) > 0 Then ro(cn) = True Else ro(cn) = False End If ElseIf cn = "NPI" Then If Len(ary(i, c)) <= 3 Then ro(cn) = True Else ro(cn) = False End If ElseIf cn = "Setup_Need" Then If ary(i, c) = "Y" Then ro(cn) = True Else ro(cn) = False End If ElseIf cn = "Setup_Status" Then If ary(i, c) = "OK" Then ro(cn) = True Else ro(cn) = False End If Else ro(cn) = ary(i, c) End If Next i1 = i1 + 1 ‘Output.Show("新增:" & i1) Else \'已经存在的数据行,须判断是否有修改,简化操作改为直接重写 For c As Integer = 1 To cs cn = ary(1, c) \'列名 bh = False \'初始值 If cn = "Process_Competed" Then If Len(ary(i, c)) > 0 Then bh = True \'变化 End If If dr(cn) <> bh Then dr(cn) = bh \'Output.Show(dr("WO") & "|" & dr("OP") & " " & cn & ":" & i) End If ElseIf cn = "OnProcess" Then If Len(ary(i, c)) > 0 Then bh = True \'变化 End If If dr(cn) <> bh Then dr(cn) = bh \'Output.Show(dr("WO") & "|" & dr("OP") & " " & cn & ":" & i) End If ElseIf cn = "NPI" Then If Len(ary(i, c)) <= 3 Then bh = True \'变化 End If If dr(cn) <> bh Then dr(cn) = bh \'Output.Show(dr("WO") & "|" & dr("OP") & " " & cn & ":" & i) End If ElseIf cn = "Setup_Need" Then If ary(i, c) = "Y" Then bh = True \'变化 End If If dr(cn) <> bh Then dr(cn) = bh \'Output.Show(dr("WO") & "|" & dr("OP") & " " & cn & ":" & i) End If ElseIf cn = "Setup_Status" Then If ary(i, c) = "OK" Then bh = True \'变化 End If If dr(cn) <> bh Then dr(cn) = bh \'Output.Show(dr("WO") & "|" & dr("OP") & " " & cn & ":" & i) End If ElseIf cn = "Cycle_Time_Mins" Or cn = "Reqd_Time_Hrs" Then If dr(cn) - ary(i, c) > 0.03 Then \'循环时间差0.18秒(数据精度引起) dr(cn) = ary(i, c) End If Else If dr(cn) <> ary(i, c) Then \'Output.Show( i & ": " & dr("WO") & "|" & dr("OP") & " " & cn & "变换内容:" & dr(cn) & "--->" & ary(i, c)) dr(cn) = ary(i, c) i1 = i1 + 1 End If End If Next End If End If \'If i > 100 Then GoTo 1 Next If i1 > 0 Then DataTables(TableN).Save \'Forms("Developer").Controls("Label_Time").Text = "最后更新:" & Format(Date.Now, "G") Catch ex As exception msgbox(ex.message) \'MessageBox.Show("Weekly Machine Schdule.xlsx 导入过程出现问题的行:" & i & ",对应的列名为:" & cn) \'MessageBox.Show("导入失败!", "通知!") End Try 1: SystemReady = True App.quit End If If DataTables.Contains("Data") = False Then DataTables.Load("Data") End If Dim dt1 As DataTable = DataTables("Data") Dim dr1 As DataRow = DataTables("Data").Find("文件更新_文件名 = \'" & ff & "\'") If dr1 Is Nothing Then Dim dr1a As DataRow = DataTables("Data").AddNew dr1a("文件更新_文件名") = ff dr1a("文件更新_时间") = Date.Now dr1a.Save Else dr1("文件更新_时间") = Date.Now dr1.Save End If DataTables(TableN).ResumeRedraw \'屏幕恢复刷新 Tables(TableN).Sort = "PartNumber" Tables("Data").Sort = "文件更新_时间 Desc" End If |
-- 作者:有点蓝 -- 发布时间:2023/8/22 8:42:00 -- 试试使用数据源的方式读取execl数据:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=52744 |
-- 作者:creastzh -- 发布时间:2023/8/23 5:47:00 -- 这个是使用SQL操作Excel 填写数据到Excel,我想要的是高速从Excel 将数据读入Foxtable表 以下是引用有点蓝在2023/8/22 8:42:00的发言:
试试使用数据源的方式读取execl数据:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=52744 |
-- 作者:有点蓝 -- 发布时间:2023/8/23 8:29:00 -- 这个就是可以使用sql读取execl数据导入Foxtable。有测试过吗? |
-- 作者:creastzh -- 发布时间:2023/8/24 5:55:00 -- 这两天我仔细测试一下,谢谢 |