我们是否必须打开我们用Python编写的excel文件EVERYTIME?

时间:2016-07-12 13:04:49

标签: python excel pyodbc pywin32

我必须使用Python在Excel文件上编写。我使用win32com来做到这一点。

我想首先打开它做一些事情,然后在我的文件中写下更多的东西并再次写入文件。

但是如果我在写作之前没有每次都打开文件,我会收到以下错误消息:

pywintypes.com_error:( - 214608264,' OLE错误0x800a01a8',无,无)

这里是我的代码:

connection = pypyodbc.connect('Driver={SQL Server};'
                'Server=SRVAKTCT-SQL\TCTSQL;'
                'Database=K;'
                'uid=Y;pwd=x')

cursor = connection.cursor()

for log, TA in zip(listeID,ListeTA):
    NomTA=TA[0]
    Equipe=TA[1]
    if log:

        #doing stuff
        results = something
        temps_log=results[0]
        print(temps_log)
        if temps_log is not None:
            temps_log=str(datetime.timedelta(seconds=int(temps_log)))

        excel = win32.gencache.EnsureDispatch('Excel.Application')
        wb = excel.Workbooks.Open('//Srvaktct-bur02/Copie de vide.xlsx')
        ws=wb.Worksheets(date_onglet)
        ws.Cells(ligne_cumul,10).Value=temps_log
        #wb.Close(True)
    #wb = excel.Workbooks.Open('//Srvaktct-bur02/Copie de vide.xlsx')
    #ws=wb.Worksheets(date_onglet)
    ws.Cells(ligne_cumul,2).Value=NomTA
    ws.Cells(ligne_cumul,3).Value=Equipe

    wb.Close(True)
    excel.Application.Quit()
    ligne_cumul += 1

此处代码仅在取消注释注释区域时才有效。

2 个答案:

答案 0 :(得分:2)

因为你是在循环的每次迭代中打开文件。

你应该移动线

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('//Srvaktct-bur02/Copie de vide.xlsx')
ws = wb.Worksheets(date_onglet)

到循环之前,所以你不需要在每次迭代中关闭并重新打开文件。

答案 1 :(得分:1)

  

如果我在写入之前没有每次都打开文件,我会收到以下错误消息:

嗯,是的,因为如果你没有一个文件对象来写,你还会发生什么呢?

你正在循环中进行wb.Close()调用,所以,因为你关闭它,如果你想再次写入(或从中读取),你还必须重新打开它。你在循环中关闭/打开文件两次,你也在循环中进行excel.Quit操作,这需要你在每次交互时重新实例化。更好的方法是实例化{{1}在循环外部(以及循环结束后的excel)。

未经测试,但看看它是否会有所帮助(修改,因为你提到它是同一个文件

Quit