我将我的脚本结果导出到Excel电子表格中。一切正常,我将大量数据放入SpreadSheet,但有时会发生错误:
File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 550, in __setattr__
self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)
pywintypes.com_error: (-2147352567, 'Exception.', (0, None, None, None, 0, -2146777998), None)***
我想这不是输入数据格式的问题。我放了几种不同类型的数据字符串,整数,浮点数,列表,它工作正常。当我第二次运行sript它工作正常 - 没有错误。发生了什么事?
PS。这是生成错误的代码,奇怪的是错误不会始终发生。假设30%的运行导致错误。 :
import win32com.client
def Generate_Excel_Report():
Excel=win32com.client.Dispatch("Excel.Application")
Excel.Workbooks.Add(1)
Cells=Excel.ActiveWorkBook.ActiveSheet.Cells
for i in range(100):
Row=int(35+i)
for j in range(10):
Cells(int(Row),int(5+j)).Value="string"
for i in range(100):
Row=int(135+i)
for j in range(10):
Cells(int(Row),int(5+j)).Value=32.32 #float
Generate_Excel_Report()
对我来说最奇怪的是,当我使用相同的代码运行脚本,多次输入相同的输入时,有时会发生错误,有时则不会。
答案 0 :(得分:2)
这很可能是同步COM访问错误。有关原因和解决方法的详细信息,请参阅我对Error while working with excel using python的回答。
我不明白为什么文件格式/扩展会有所作为。你会以任何一种方式调用相同的COM对象。我对这个错误的体验是,它或多或少是随机的,但是你可以在脚本运行时通过与Excel交互来增加它发生的可能性。
答案 1 :(得分:0)
编辑:它不会改变一件事。发生错误,但经常出现问题。一次进行10次模拟,同时使用.xlsx文件进行3次模拟。请帮忙
问题在于我正在打开的文件。它是.xlsx
,而我已将其保存为.xls
,问题就消失了。 请注意,不要在.xlsx
使用COM接口,否则会遇到麻烦!
答案 2 :(得分:0)
在这样做的时候,你应该能够擅长互动。
import win32com.client
def Generate_Excel_Report():
Excel=win32com.client.Dispatch("Excel.Application")
#you won't see what happens (faster)
Excel.ScreenUpdating = False
#clics on the Excel window have no effect
#(set back to True before closing Excel)
Excel.Interactive = False
Excel.Workbooks.Add(1)
Cells=Excel.ActiveWorkBook.ActiveSheet.Cells
for i in range(100):
Row=int(35+i)
for j in range(10):
Cells(int(Row),int(5+j)).Value="string"
for i in range(100):
Row=int(135+i)
for j in range(10):
Cells(int(Row),int(5+j)).Value=32.32 #float
Excel.ScreenUpdating = True
Excel.Interactive = True
Generate_Excel_Report()
此外,您可以这样做以提高代码性能:
#Construct data block
string_line = []
for i in range(10)
string_line.append("string")
string_block = []
for i in range(100)
string_block.append(string_line)
#Write data block in one call
ws = Excel.Workbooks.Sheets(1)
ws.Range(
ws.Cells(35, 5)
ws.Cells(135,15)
).Values = string block
答案 3 :(得分:0)
在使用xlwings与Excel交互时,我遇到了相同的错误。 xlwings在后端也使用win32com客户端。 经过一番调试后,我意识到,只要执行代码并且未关注excel文件(包含数据),就会弹出此错误。为了解决该问题,我只需选择要处理的文件并运行代码,该文件始终对我有用。