我必须使用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
此处代码仅在取消注释注释区域时才有效。
答案 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