2010-04-21 9 views
12

Utilisation du module python xlwt, écrivant à la même cellule jette deux fois une erreur:tentative Python XLWT pour écraser solution cellulaire

Message File Name Line Position  
Traceback    
    <module> S:\******** 
    write C:\Python26\lib\site-packages\xlwt\Worksheet.py 1003   
    write C:\Python26\lib\site-packages\xlwt\Row.py 231  
    insert_cell C:\Python26\lib\site-packages\xlwt\Row.py 150  
Exception: Attempt to overwrite cell: sheetname=u'Sheet 1' rowx=1 colx=12 

avec l'extrait de code

def insert_cell(self, col_index, cell_obj): 
     if col_index in self.__cells: 
      if not self.__parent._cell_overwrite_ok: 
       msg = "Attempt to overwrite cell: sheetname=%r rowx=%d colx=%d" \ 
        % (self.__parent.name, self.__idx, col_index) 
       raise Exception(msg) #row 150 
      prev_cell_obj = self.__cells[col_index] 
      sst_idx = getattr(prev_cell_obj, 'sst_idx', None) 
      if sst_idx is not None: 
       self.__parent_wb.del_str(sst_idx) 
     self.__cells[col_index] = cell_obj 

On dirait que le code « augmenter est une exception qui interrompt tout le processus. Est-ce que supprimer le terme 'raise' suffit pour permettre l'écrasement des cellules? J'apprécie l'avertissement de xlwt, mais je pensais que la façon pythonique est de supposer "nous savons ce que nous faisons". Je ne veux rien casser d'autre en touchant le module.

Répondre

42

Le problème est que des données de réécriture feuille de calcul est désactivée par défaut dans xlwt. Vous devez autoriser explicitement, comme ceci:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True) 
+1

+1 documenté ici: http://groups.google.com/group/python-excel/browse_thread/thread/c0def68185c7b85e – bernie

+0

juste ce que j'ai besoin, et merci pour le lien – PPTim

+1

Merci pour en fait donner la réponse; beaucoup plus pratique que d'être pointé dans une direction générale ... – araisbec

1

Vous devriez entrer en contact avec l'auteur du module. Enlever simplement un raise a peu de chance de bien fonctionner. Je suppose que cela entraînerait d'autres problèmes plus tard. Par exemple, le code postérieur peut supposer qu'une cellule donnée n'est qu'une fois dans la représentation intermédiaire.

5

Ce que Ned B. a écrit est précieux conseils - à l'exception du fait que xlwt est une fourchette de pyExcelerator, « auteur du module » est mal défini ;-)

... et Kaloyan Todorov a mis le doigt sur la tête.

Voici quelques autres conseils:

(1) Notez la ligne suivante dans le code que vous avez cité:

if not self.__parent._cell_overwrite_ok: 

et rechercher le code pour _cell_overwrite_ok et vous devriez venir à la conclusion de Kaloyan.

(2) Poser des questions sur (et rechercher dans les archives de) python-excel google-groupe

(3) Commander this site qui donne des indications sur le groupe Google et un tutoriel. Contexte: le problème était que certaines personnes ne savaient pas ce qu'elles faisaient (et dans au moins un cas étaient heureuses d'apprendre cela), et le comportement hérité de pyExcelerator par xlwt était d'écrire aveuglément deux (ou plus)) enregistrements de la même cellule, ce qui a conduit non seulement à déposer ballonnement mais aussi la confusion, car Excel se plaindrait et montrer la première communication écrite et OpenOffice et Gnumeric montrerait en silence le dernier écrit. Suppression de toute trace des anciennes données de la table de chaîne partagée de sorte qu'il ne serait pas gaspiller de l'espace ou (pire) soit visible dans le fichier était un PITA.

La saga est enregistrée dans le groupe Google. Le tutoriel comprend une section sur les cellules d'écrasement.

+0

merci pour les liens et infos, très instructif. Donc, à partir de là, je suppose que l'écrasement de trop de la table était encore une mauvaise idée car les données écrasées sont toujours contenues dans le dossier? – PPTim

+1

Si vous vous réunissez ainsi, vous vous réunissez incorrectement; voir ci-dessus "Enlever toute trace ... était [passé]" et/ou lire le fil sur le lien qu'Adam Bernier vous a donné, croyez-le ou exécutez le script de 6 lignes dans le troisième message du fil, inspectez le fichier de sortie avec un dumper char/hex (ou le fichier xlrd-runxlrd.py avec la commande biff_dump), & notez que, comme annoncé, il n'y a aucune trace des données d'origine. –

2

Si vous:

  • ne veulent pas mettre toute la feuille de calcul pour pouvoir être écrasé dans le constructeur, et
  • encore attrapez l'exception au cas par cas

...essayez ceci:

try: 
    worksheet.write(row, col, "text") 
except: 
    worksheet._cell_overwrite_ok = True 
    # do any required operations since we found a duplicate 
    worksheet.write(row, col, "new text") 
    worksheet._cell_overwrite_ok = False