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