我正在尝试将大约1500个Excel文件导入我的系统。 代码正在循环中工作,我可以打开并导入大约600个Excel文件。之后我收到一条错误消息:在第55行打开外部对象函数时出错......
我真的坚持这个问题,如果有人能提供帮助,那将会很感激。
回复评论中的代码:
For ll_LoopCnt = 1 To Dw_1.rowcount( )
Ls_File_Name = Dw_1.getitemstring( ll_LoopCnt, "file_name")
Ls_Path =Dw_1.getitemstring( ll_LoopCnt, "file_path")
ll_Sr_No= Dw_1.getitemNumber( ll_LoopCnt, "sr_no")
ldt_File_Date= Dw_1.getitemDateTime( ll_LoopCnt, "file_date")
Excel.Application.DisplayAlerts = "False"
Excel.WorkBooks.Open( Ls_Path )
Excel.Application.Visible = False
Excel.windowstate = 2 // 1 : Normal, 2 : Minimize, 3 : Maximize
Excel.Application.CutCopyMode = False
Lb_sheet_rtn = excel.worksheets(7).Activate
Ls_ClipBoard = clipboard()
Excel.Application.ActiveWorkbook.Save()
Excel.Worksheets(7).UsedRange.Copy
ll_cnt = ds_1.importclipboard()
IF ll_cnt <= 1 THEN
Messagebox("Error", "Could not find.")
Else
Dw_1.Scrolltorow( ll_LoopCnt )
Dw_1.SetItem( ll_LoopCnt, "status", 'Success')
For ll_Inner_LoopCnt = 1 To Ds_1.RowCount( )
Ds_1.Object.file_path[ll_Inner_LoopCnt] = Ls_Path
Ds_1.Object.file_name[ll_Inner_LoopCnt] = Ls_File_Name
Ds_1.Object.file_sr_no[ll_Inner_LoopCnt] = ll_Sr_No
Ds_1.Object.file_date[ll_Inner_LoopCnt] = ldt_File_Date
Next
END IF
Clipboard(ls_ClipBoard)
Ds_1.Reset( ) //Reset the data store
Excel.Application.ActiveWorkbook.Save()
Excel.Application.ActiveWorkbook.Close(False);
Excel.Application.Quit
Excel.Application.CutCopyMode = False
IF ll_LoopCnt = ll_Excel_Cnt Then //--->> After 100 files reset the memmory
ll_Excel_Cnt = ll_LoopCnt + 100
Excel.DisConnectObject()
DESTROY excel
DESTROY TEst_Excel
GarbageCollect ( )
Excel = Create OLEObject
Test_Excel = Create OLEObject
Li_rtn = excel.ConnectToNewObject("excel.application")
IF li_rtn <> 0 THEN
MessageBox('Excel error','can not run Excel Program')
DESTROY Excel
RETURN 0
END IF
End IF
Next
Excel.displayalerts = False
Excel.Application.Quit
Excel.displayalerts = True
Excel.DisConnectObject()
DESTROY Excel
DESTROY Test_Excel /* This is the code i written i dont think the OLE is crashing i think the connnectto the OLE is getting lost after some time, but stile its going fine for almost 600 records.. */
答案 0 :(得分:1)
看到代码行会有所帮助,但是这个错误消息通常(在OLE的上下文中,我猜这是这里的情况)来自PowerBuilder进行OLE主机拒绝的OLE调用。根据您提供的信息,无法判断OLE主机是否已崩溃并且不再响应,或者您是否已将OLE主机置于这些函数不再适用的状态,或者OLE对象已经变得无效,或者是什么。
如果是我,并且它始终如一地发生,我将在调试器中运行应用程序以进入错误即将发生的状态(您可以在断点中设置高级属性以使每个断点都没有激活它被传递的时间)并尝试询问OLE对象。我希望你也必须输入一些测试代码,因为我不相信你想要测试的所有内容都可供调试器使用。
2月21日新
我还会更改正在处理的文件集,以便我可以判断崩溃的关键字是特定文件还是处理的文件数量。例如,如果你摆脱了前100个文件,它仍然会在第600个文件(相同数量)或第500个文件(同一个文件)上崩溃吗?
一种可能性是你的内存不足。 OLE引用中的每个“点”(属性访问,方法调用)在内存中创建一个对象,在垃圾收集之前不会被销毁。您发布的代码片段永远不会进入调用GarbageCollect()的块(ll_Excel_Cnt永远不会被初始化),因此您可能希望确保该部分正常工作。我也摆脱了不必要的电话。例如,当只需要调用一次时,你有几个调用在循环中保持Excel的状态(例如Excel.Application.Visible)。我也不清楚代码片段为什么你需要调用Save(),无论是时间;这也可以是消耗品。这种清理也应该使您的代码运行得更快。
特里
答案 1 :(得分:0)
第30行你有
Excel.Application.ActiveWorkbook.Save()
Excel.Application.ActiveWorkbook.Close(False);
Excel.Application.Quit
你不应该在那里打电话给Excel.Application.Quit
。另外,我总是建议在Try..Catch块中放置任何使用OLE的东西并捕获OleRuntimeError和RuntimeError。