Devons-nous ouvrir le file excel QUELQUE QUE nous écrivons avec Python?

Je dois écrire sur un file Excel en utilisant Python. J'utilise Win32com pour le faire.

Je veux l'ouvrir avant de faire quelques choses puis écrire dans mon file, faire plus de choses et écrire à nouveau dans le file.

mais si je n'ouvre pas le file chaque fois avant d'écrire, j'ai ce message d'erreur:

pywintypes.com_error: (-2146827864, 'OLE error 0x800a01a8', None, None)

ici mon code:

connection = pypyodbc.connect('Driver={SQL Server};' 'Server=SRVAKTCT-SQL\TCTSQL;' 'Database=K;' 'uid=Y;pwd=x') cursor = connection.cursor() for log, TA in zip(listID,ListeTA): NomTA=TA[0] Equipe=TA[1] if log: #doing stuff results = something time_log=results[0] print(time_log) if time_log is not None: time_log=str(datetime.timedelta(seconds=int(time_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=time_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 

Ici, le code fonctionne uniquement si je décompose la région de commentaires.

Si je n'ouvre pas le file chaque fois avant d'écrire, j'ai ce message d'erreur:

Eh bien, parce que si vous n'avez pas d'object de file à écrire, qu'est-ce que vous attendez d'autre chose?

Vous faites un appel wb.Close() dans la boucle, de sorte que, comme vous le fermez, vous devez également le rouvrir si vous souhaitez y écrire à nouveau (ou lire à nouveau). Vous fermez / ouvrez le file deux fois dans la boucle, et vous effectuez également l'opération excel.Quit dans la boucle, ce qui nécessite que vous l'instanciiez à chaque interation. Une meilleure approche consiste à instancier excel dehors de la boucle ( et plus tard Quit le après la fin de la boucle).

Non testé, mais voyez si cela aidera ( révisé parce que vous mentionnez qu'il s'agit du même file )

 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(listID,ListeTA): NomTA=TA[0] Equipe=TA[1] if log: #doing stuff results = something time_log=results[0] print(time_log) if time_log is not None: time_log=str(datetime.timedelta(seconds=int(time_log))) ws.Cells(ligne_cumul,10).Value=time_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() 

Parce que vous ouvrez le file chaque itération de la boucle.

Vous devriez déplacer les lignes

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

avant la boucle, vous n'avez donc pas besoin de fermer et de rouvrir le file dans chaque itération.