Python xlwt tentative d'écraser le travail des cellules

en utilisant le module python xlwt, en écrivant à la même cellule deux fois envoie une erreur:

Message File Name   Line    Position    
Traceback               
    <module>    S:******** 
    write   C:Python26libsite-packagesxlwtWorksheet.py 1003        
    write   C:Python26libsite-packagesxlwtRow.py   231     
    insert_cell C:Python26libsite-packagesxlwtRow.py   150     
Exception: Attempt to overwrite cell: sheetname=u'Sheet 1' rowx=1 colx=12   

avec le code snippet

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

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

12
demandé sur PPTim 2010-04-21 04:00:25

4 réponses

le problème est que l'écrasement des données de feuille de travail est désactivé par défaut dans xlwt . Vous devez l'autoriser explicitement, comme suit:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)
42
répondu ktdrv 2010-04-21 00:44:57

ce que Ned B. a écrit est un conseil précieux -- excepté le fait que xlwt est une fourchette de pyExcelerator , "auteur du module" est mal défini; -)

... et Kaloyan Todorov a touché le clou sur la tête.

Voici d'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) Posez des questions sur (et recherchez dans les archives de) le python-excel google-group

(3) Consultez ce site qui donne des pointeurs vers le groupe google et Vers un tutoriel.

contexte: le problème était que certaines personnes ne savaient pas ce qu'elles faisaient (et dans au moins un cas étaient heureux d'être dit), et le comportement que xlwt hérité de pyExcelerator était de écrire deux (ou plus) enregistrements pour la même cellule, ce qui a conduit non seulement au bloat de fichier, mais aussi à la confusion, parce que Excel se plaindrait et montrerait le premier écrit et OpenOffice et Gnumeric montrerait silencieusement le dernier écrit. Enlever toute trace des anciennes données de la table de chaîne partagée pour qu'elle ne gaspille pas d'espace ou (pire) ne soit pas visible dans le fichier était une PITA.

toute la saga est enregistrée dans le groupe google. Le tutoriel comprend une section sur les cellules de réécriture.

5
répondu John Machin 2010-04-21 01:27:00

si vous:

  • Je ne veux pas mettre la feuille de travail entière pour pouvoir être écrasée dans le constructeur, et
  • encore attraper 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
3
répondu Anton 2015-08-17 19:38:06

vous devez entrer en contact avec l'auteur du module. Retirant simplement une raise est peu probable. Je suppose qu'il pourrait mener à d'autres problèmes par la suite. Par exemple, le code plus tard peut supposer que n'importe quelle cellule donnée est seulement dans la représentation intermédiaire une fois.

1
répondu Ned Batchelder 2010-04-21 00:29:56