1

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

4 回答 4

2

这很可能是同步 COM 访问错误。有关原因和解决方法的详细信息,请参阅我对使用 python 处理 excel时出错的回答。

我不明白为什么文件格式/扩展名会有所不同。无论哪种方式,您都会调用相同的 COM 对象。我对这个错误的经验是它或多或少是随机的,但是您可以通过在脚本运行时与 Excel 交互来增加它发生的机会。

于 2013-01-17T21:49:29.657 回答
0

编辑:它不会改变任何事情。错误发生,但经常发生。10 次模拟一次,而 .xlsx 文件 3 次模拟一次。请帮忙

问题出在我打开的文件上。它是.xlsx,而我已经保存它,因为.xls问题消失了。所以当心,永远不要使用 COM 接口,.xlsx否则你会遇到麻烦!

于 2010-06-07T09:15:03.933 回答
0

我在使用 xlwings 与 Excel 交互时遇到了同样的错误。xlwings 还在后端使用 win32com 客户端。经过一番调试,我意识到每当执行代码并且excel文件(包含数据)不在焦点时就会弹出这个错误。为了解决这个问题,我只需选择正在处理的文件并运行代码,它总是对我有用。

于 2020-11-02T05:21:08.833 回答
0

您应该在执行此操作时禁用 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
于 2015-10-12T13:41:57.213 回答