以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 自定义函数运行错误 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=188403) |
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/19 5:19:00 -- 自定义函数运行错误 .NET Framework 版本:4.0.30319.42000 Foxtable 版本:2022.8.18.1 错误所在事件:自定义函数,Import_WorkOrderStatus 详细错误信息: Exception has been thrown by the target of an invocation. Insufficient memory to continue the execution of the program. 通过定时任务调用内部函数运行或者在命令窗口通过执行函数时均出现上述错误提示 但将指令直接拷贝到命令窗口运行时又是正常的,但有时又出现如下信息: --------------------------- 版本:2022.8.18.1 --------------------------- 代码执行出错,错误信息: System.OutOfMemoryException: Insufficient memory to continue the execution of the program. at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Range.get_Value(Object RangeValueDataType) at UserCode.Test() --------------------------- OK --------------------------- 我的程序指令如下,通过设置断点确认,出现问题的指令行是:Dim ary = Rg.value, \'Import_WorkOrderStatus 20230911 \'文件路径P: \\ General documents \\ Worktime Data \\ Fox Data \\ Query \\ Work Order Status.xlsx,真正的源数据为 Work Order Status.xlsm Dim idate1 As Date = Date.Now Dim t As Integer Dim gx As Boolean = False Dim App As New MSExcel.Application App.DisplayAlerts = False App.visible = True Dim TableN As String = "WorkOrderStatus" If DataTables.Contains(TableN) = False Then DataTables.Load(TableN) End If If DataTables.Contains("Data") = False Then DataTables.Load("Data") End If Tables(TableN).StopRedraw \'DataTables(TableN).DeleteFor("") \'删除表内所有数据 Dim fp As String = "P:\\General documents\\Worktime Data\\Fox Data\\Query\\" Dim ff = "Work Order Status.xlsx" Dim fpf As String = fp & ff If Not filesys.FileExists(fpf) Then Return Nothing Dim inf As New FileInfo(fpf) \'Dim idate1 As Date = inf.LastWriteTime Dim cn As String \'列名称 Dim i As Integer Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(fpf) Wb.RefreshAll MessageBox.Show(1) Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1) MessageBox.Show(1.1) Dim Rg As MSExcel.Range = Ws.UsedRange MessageBox.Show(1.2) Dim ary = Rg.value MessageBox.Show(1.3) Dim cs As Integer = Rg.Columns.Count output.Show(rg.Rows.Count & "R|C:" & cs) cs = 26 MessageBox.Show(2) Dim dic1 As New Dictionary(Of String, DataRow) \'存储原始时间(WOStatus),wop==>Row Dim dic2 As New Dictionary(Of DataRow, Integer) \'Row==>iRw# Dim wop As String For Each dr As DataRow In DataTables("WorkOrderStatus").DataRows wop = dr("WO") & "|" & dr("op") If Not dic1.ContainsKey(wop) Then dic1.Add(wop, dr) End If Next MessageBox.Show(3) For i = 2 To rg.Rows.Count If ary(i, 2) > "" AndAlso ary(i, 19) > 0 Then wop = ary(i, 2) & "|" & ary(I, 19) If dic1.ContainsKey(wop) Then Dim dr1a As DataRow dr1a = dic1(wop) If ary(i, 13) <> dr1a("GoodQty") OrElse ary(i, 15) <> dr1a("BadQty") Then dic2.Add(dr1a, i) \'现有表中存在发生扫描出数量改变时,需要重新写入数据行信息 End If Else \'现有表中不存在数据行,须新增数据行 Dim dr1n As DataRow = DataTables("WorkOrderStatus").AddNew dic2.add(dr1n, i) End If End If Next MessageBox.Show(4) t = dic2.Count If t = 0 Then \' Return Nothing gx = True \' Output.Show("无新增/修订数据行") Else Dim i1 As Integer = 0 Output.Show(t & "行数据更新") gx = True For Each dr2 As DataRow In dic2.Keys \'i1 = i1 + 1 i = dic2(dr2) For c As Integer = 1 To cs cn = ary(1, c) \'列名 \'Output.Show(i1 & ":" & i & "," & cn & ": " & ary(i, c)) dr2(cn) = ary(i, c) Next Next DataTables(TableN).Save Tables(TableN).Sort = "WO,OP" gx = True End if App.quit App.displayalerts = True Dim dr1 As DataRow = DataTables("Data").Find("文件更新_文件名 = \'" & ff & "\'") dr1("文件更新_时间") = Date.Now If gx = True Then dr1("UpdatinTip") = "成功" Else dr1("UpdatinTip") = "更新失败" End If dr1.Save Tables("Data").Sort = "文件更新_时间 Desc" Tables(TableN).ResumeRedraw Dim s2 As Date = Date.Now Dim s3 As TimeSpan = s2 - idate1 Output.Show(idate1 & "-----" & s2 & ",程序Import_WorkOrderStatus经历时间" & s3.TotalSeconds) 恳请帮助解决,谢谢! |
||||||||||||
-- 作者:有点蓝 -- 发布时间:2023/9/19 8:41:00 -- 错误提示是内存溢出,应该是文档数据太多。 1、分割文档后在导入,比如几万行数据一个文档 2、如果不想分割,考虑使用第三方组件处理,比如:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100317&replyID=&skin=1
|
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/23 9:28:00 -- 老师,我正在尝试使用您提供的这个OpenXml方式进行数据导入, 不知道怎么情况,导入完成后出现如下空白页面, 但数据是实际存在的,我需要关闭项目后重新打开才能看到完整的数据.请问如何处理? 谢谢! |
||||||||||||
-- 作者:有点蓝 -- 发布时间:2023/9/23 9:44:00 -- 正常,这个例子是直接把数据导入后台数据库的。前台不会显示数据,要显示,自己添加代码加载数据即可 |
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/23 10:00:00 -- 重新加载表后能看到了,但有一个问题,这个数据实际上没有增加, 我将源数据删除了绝大部分仅保留20行, 通过执行指令, 没有出现行新增,源数据有25000左右,是不是我的操作有什么问题? 运行时间倒就3秒钟左右.
[此贴子已经被作者于2023/9/23 10:01:01编辑过]
|
||||||||||||
-- 作者:有点蓝 -- 发布时间:2023/9/23 10:13:00 -- 先仔细过一遍这个组件的用法。 其次检查列名是否符合格式:http://www.foxtable.com/webhelp/topics/2280.htm,标题行只能有一行
|
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/23 10:20:00 --
我的Excel格式没有错误, 您能否帮看一下,谢谢!
|
||||||||||||
-- 作者:有点蓝 -- 发布时间:2023/9/23 11:58:00 -- 2个原因: 1、需要指定导入的sheet名称,比如 _execl.ReadToDataTable(DataTables("WorkOrderStatus").Basetable, "List" , , 0 , 2000) |
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/23 15:54:00 -- 我按照要求全部重新确认了格式, 写入内部函数: Dim _execl As New ExOpenXml.ExOXExecl() _execl.Open("P:\\General documents\\Worktime Data\\Fox Data\\Query\\Work Order Status.xlsx", True) _execl.ReadToDataTable(DataTables("List").BaseTable, "List" , , 0 , 30000) _execl.Dispose() 还是没有通过测试,系统报错: .NET Framework 版本:4.0.30319.42000 Foxtable 版本:2022.8.18.1 错误所在事件:自定义函数,ImportLargeDataFromExecl 详细错误信息: Exception has been thrown by the target of an invocation. Conversion from type \'Decimal\' to type \'Date\' is not valid. 问题是Decimal格式数据没有被制定为日期格式的列, 实在是查不出问题所在. [此贴子已经被作者于2023/9/23 16:05:40编辑过]
|
||||||||||||
-- 作者:creastzh -- 发布时间:2023/9/23 16:07:00 --
|