Ошибка ввода данных win32com Excel

Я экспортирую результаты своего скрипта в электронную таблицу 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)***

Я полагаю, что это не проблема формата входных данных. Я добавляю несколько разных типов строк данных, целых чисел, чисел с плавающей запятой, списков, и все работает нормально. Когда я запускаю скрипт во второй раз, он работает нормально - без ошибок. В чем дело?

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()

Самое странное для меня то, что когда я много раз запускаю скрипт с одним и тем же кодом, одним и тем же вводом, то иногда возникает ошибка, иногда нет.


person Rafal    schedule 05.06.2010    source источник
comment
Если возможно, фрагмент кода, который люди могут запустить и воссоздать ошибку, был бы очень полезен. Если нет, по крайней мере опубликуйте оскорбительный фрагмент вашего кода, который вызывает эту ошибку, и фактический пример ввода (со значениями и без комментариев, смешанных внутри).   -  person taleinat    schedule 05.06.2010
comment
Это не отвечает на ваш вопрос, но мне повезло с модулями xlrd и xlwt: python-excel.org .   -  person FMc    schedule 05.06.2010
comment
taleinat - я отредактировал вопрос - я добавил кусок кода   -  person Rafal    schedule 06.06.2010
comment
Ничего общего с вашей проблемой, но почему вы делаете int(foo), где foo уже int???   -  person John Machin    schedule 06.06.2010
comment
Джон Мачин: Я просто пытался выяснить, где может быть ошибка, но ее там не было. Int(Int)=Int, так что на самом деле это ничего не меняет.   -  person Rafal    schedule 06.06.2010
comment
Вы пытались установить Excel.Visible = True? Возможно, какой-то код графического интерфейса (ожидание обновления экрана?) вызывает зависание Excel.   -  person Ryan Ginstrom    schedule 07.06.2010
comment
Excel.Visible=True ничего не меняет. На самом деле, после помещения нескольких сотен строк, целых чисел и чисел с плавающей запятой Excel говорит стоп: xb9tek.', (0, Нет, Нет, Нет, 0, -2146777998), Нет) `   -  person Rafal    schedule 07.06.2010


Ответы (4)


Скорее всего, это синхронная ошибка доступа к COM. См. мой ответ на Ошибка при работе с excel с использованием python для получения подробной информации о причинах и обходном пути.

Я не понимаю, почему формат/расширение файла имеет значение. В любом случае вы будете вызывать один и тот же COM-объект. Мой опыт работы с этой ошибкой заключается в том, что она более или менее случайна, но вы можете увеличить вероятность ее возникновения, взаимодействуя с Excel во время работы вашего скрипта.

person tpdorsey    schedule 17.01.2013

редактировать: это ничего не меняет. Ошибка возникает, но leff часто. Один раз в 10 симуляциях, а с файлом .xlsx — один раз в 3 симуляциях. Пожалуйста помоги

Проблема была с файлом, который я открывал. Это было .xlsx , пока я сохранил его как .xls проблема исчезла. Так что будьте осторожны, никогда не используйте COM-интерфейс с .xlsx, иначе у вас будут проблемы!

person Rafal    schedule 07.06.2010
comment
Я использую COM-интерфейс с .xlsx на работе каждый день, у нас каждый день создается 15 файлов, содержащих тысячи записей. Я не получаю ошибок. - person sliders_alpha; 12.10.2015

При этом вы должны отключить интерактивность 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
person sliders_alpha    schedule 12.10.2015

У меня была такая же ошибка при использовании xlwings для взаимодействия с Excel. xlwings также использует клиентов win32com в серверной части. После некоторой отладки я понял, что эта ошибка появляется всякий раз, когда код выполняется, а файл excel (содержащий данные) не находится в фокусе. Чтобы решить проблему, я просто выбираю обрабатываемый файл и запускаю код, и он всегда работает для меня.

person Rahib    schedule 02.11.2020