win32com Excel数据输入错误

时间:2010-06-05 01:21:20

标签: python excel com win32com

我将我的脚本结果导出到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()

对我来说最奇怪的是,当我使用相同的代码运行脚本,多次输入相同的输入时,有时会发生错误,有时则不会。

4 个答案:

答案 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文件(包含数据),就会弹出此错误。为了解决该问题,我只需选择要处理的文件并运行代码,该文件始终对我有用。