【问题标题】:Do we have to open excel file EVERYTIME we write in it with Python?我们每次用 Python 写的时候都必须打开 excel 文件吗?
【发布时间】:2016-07-12 22:02:54
【问题描述】:

我必须使用 Python 编写 Excel 文件。我用win32com来做。

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

但是如果我在每次写之前都不打开文件,我会收到这个错误信息:

pywintypes.com_error:(-2146827864,'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

这里的代码只有在我取消注释区域时才有效。

【问题讨论】:

  • 您是Close 工作簿,也是Quit 循环内的应用程序。如果您这样做,当然您必须重新实例化 Excel,然后重新打开工作簿...请参阅下面的答案

标签: python excel pyodbc pywin32


【解决方案1】:

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

是的,因为如果您没有要写入的文件对象,您还期望发生什么?

您正在循环中执行wb.Close() 调用,因此,因为您关闭了它,如果您想再次写入(或从中读取),您还必须重新打开它。您在循环中关闭/打开文件两次,并且您还在循环内执行 excel.Quit 操作,这要求您在每次交互时重新实例化它更好的方法是在循环之外实例化 excel循环(以及后来的Quit循环终止后)。

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

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

cursor = connection.cursor()
wb, ws = None, None
filePath = '//Srvaktct-bur02/Copie de vide.xlsx'
# Get a handle on Excel application:
excel = win32.gencache.EnsureDispatch('Excel.Application')
# Open the file outside of the loop, too:
wb = excel.Workbooks.Open(filePath)
ws=wb.Worksheets(date_onglet)
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)))
            ws.Cells(ligne_cumul,10).Value=temps_log
    ws.Cells(ligne_cumul,2).Value=NomTA
    ws.Cells(ligne_cumul,3).Value=Equipe
    ligne_cumul += 1
# Don't close wb or Quit Excel inside the loop!
wb.Close(True)
excel.Application.Quit()

【讨论】:

  • 感谢您的回答!我做错了,它实际上是同一个文件!对不起!
  • @amiraayadi 我做了一些修改来解决这个问题。我仍然认为你在重复你的一些逻辑,而且是不必要的。我也会修改我的答案......
  • 当我开始编写代码时,我做了类似的事情(我小心地在循环之前打开并在循环之后关闭文件)但我发现我没有使用所有 Excel 文件!以文件“.XLSM”为例,如果我想在上面写,我必须运行我的方法。即使你的回答也没有用。这里的错误消息:pywintypes.com_error: (-2147352567, 'Une exception s'est produite.', (0, None, None, None, 0, -2147352565), None)
  • 错误是否只发生在 .XLSM 文件中(而不是 .XLSX 文件?如果是这样,请检查 Excel 中的宏安全设置,这可能会阻止启用 XLSM 宏的文件打开.
  • 它适用于 .XLSX 文件。我可以打开 .XLSM 文件,但前提是每次在循环中都打开它,否则会出现错误消息。你还以为是Excel里面的宏安全设置吗?即使我可以在每次循环打开 xlsm 文件时打开它?
【解决方案2】:

因为您在每次循环迭代时都打开文件。

你应该移动线条

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

到循环之前,因此您无需在每次迭代中关闭并重新打开文件。

【讨论】:

  • OP 还需要取消注释其他行(并分配给 wbws 不同的 名称),以便写入其他文件( s)。
  • OP 在 Excel 应用程序的一个实例中尝试打开具有相同文件名的两个文件时也会遇到潜在问题。也许这就是循环内关闭/打开的原因。
  • 我已经尝试在循环之前移动它。这里的错误消息:“pywintypes.com_error:(-2146827864,'OLE 错误 0x800a01a8',无,无)”我这样做只是因为如果我先删除打开它,它就不起作用。但是执行时间很重要,我没时间每次循环都打开
  • @DavidZemens,对不起,这里是同一个文件!我只是忘记更改文件名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2016-11-04
相关资源
最近更新 更多