簡體   English   中英

win32com 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM