2010-06-05 11 views
0

J'exporte les résultats de mon script dans une feuille de calcul Excel. Tout fonctionne très bien, je mets de grands ensembles de données dans SpreadSheet, mais parfois une erreur se produit:Erreur d'entrée de données win32com Excel

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

Je suppose que ce n'est pas un problème de format de données d'entrée. J'ai mis plusieurs types de chaînes de données, ints, flottants, listes et cela fonctionne bien. Quand je lance le script pour la deuxième fois, ça fonctionne très bien - pas d'erreur. Que se passe-t-il?

PS. C'est un code qui génère une erreur, ce qui est étrange, c'est que l'erreur ne se produit pas toujours. Supposons que 30% des analyses entraînent une erreur. :

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

Le plus étrange pour moi est que quand je lance le script avec le même code, la même entrée plusieurs fois, alors parfois une erreur se produit, parfois pas.

+0

Si possible, un morceau de code que les gens peuvent courir et recréer l'erreur serait très utile. Si ce n'est pas le cas, affichez au moins le morceau incriminé de votre code qui provoque cette erreur, et un exemple d'entrée réel (avec des valeurs et sans commentaires mélangés à l'intérieur). – taleinat

+0

Il ne répond pas à votre question, mais j'ai eu de la chance avec les modules 'xlrd' et' xlwt': http://www.python-excel.org. – FMc

+0

taleinat - J'ai édité la question - J'ai ajouté un morceau de code – Rafal

Répondre

0

edit: Cela ne change rien. Une erreur se produit, mais souvent. Une fois sur 10 simulations avec fichier .xlsx une fois en 3 simulations. S'il vous plaît aider

Le problème était avec le fichier que j'ouvrais. C'était .xlsx, alors que je l'ai enregistré comme .xls le problème a disparu. Alors faites attention, n'utilisez jamais l'interface COM avec .xlsx ou vous aurez des ennuis!

+0

J'utilise l'interface COM avec .xlsx au travail tous les jours, nous avons 15 fichiers générés chaque jour qui contient des milliers d'enregistrements. Je ne reçois pas d'erreurs. –

1

Il s'agit très probablement d'une erreur d'accès COM synchrone. Voir ma réponse à Error while working with excel using python pour plus de détails sur pourquoi et une solution de contournement.

Je ne vois pas pourquoi le format/extension de fichier ferait une différence. Vous appeleriez le même objet COM de toute façon. Mon expérience avec cette erreur est que c'est plus ou moins aléatoire, mais vous pouvez augmenter les chances de se produire en interagissant avec Excel pendant que votre script est en cours d'exécution.

0

Vous devriez pouvoir exceler l'interactivité tout en faisant cela.

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

Aussi, vous pouvez faire pour augmenter les performances de votre code:

#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