[英]win32com MemoryError: CreatingSafeArray attempting to insert data into excel
[英]win32com Excel data input error
我正在將腳本的結果導出到 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 時,它運行良好 - 沒有錯誤。 這是怎么回事?
附注。 這是產生錯誤的代碼,奇怪的是錯誤並不總是發生。 假設 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()
對我來說最奇怪的是,當我使用相同的代碼、相同的輸入多次運行腳本時,有時會出現錯誤,有時不會。
這很可能是同步 COM 訪問錯誤。 有關原因和解決方法的詳細信息,請參閱我對使用 python 處理 excel 時出錯的回答。
我不明白為什么文件格式/擴展名會有所作為。 無論哪種方式,您都會調用相同的 COM 對象。 我對這個錯誤的經驗是它或多或少是隨機的,但是您可以通過在腳本運行時與 Excel 交互來增加它發生的機會。
編輯:它不會改變任何事情。 出現錯誤,但經常出現 leff。 10 次模擬中一次,而 .xlsx 文件則為 3 次模擬中一次。 請幫忙
問題出在我打開的文件上。 它是.xlsx
,而我將它保存為.xls
問題消失了。 所以當心,永遠不要使用帶有.xlsx
COM 接口,否則你會遇到麻煩!
在執行此操作時,您應該禁用 excel 交互性。
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
我在使用 xlwings 與 Excel 交互時遇到了同樣的錯誤。 xlwings 還在后端使用 win32com 客戶端。 經過一些調試,我意識到每當執行代碼並且excel文件(包含數據)不在焦點時會彈出此錯誤。 為了解決這個問題,我只需選擇正在處理的文件並運行代碼,它總是對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.