2017-06-21 10 views
2

J'écris un petit programme en Python 3.6 qui lit un fichier Excel puis modifie le format d'une cellule. Je veux plusieurs formats dans la même cellule, donc je suis en utilisant xlwt avec write_rich_text:Python 3 - xlwt save Erreur de classeur

import xlrd 
import xlwt 
from xlutils.copy import copy 

col = 0 
row = 0 

rb = xlrd.open_workbook('test.xls', formatting_info=True) 

r_sheet = rb.sheet_by_index(0) 
text_cell = r_sheet.cell_value(row, col) 

book = copy(rb) 
first_sheet = book.get_sheet(0) 

font1 = xlwt.easyfont('struck_out true, color_index red') 
font2 = xlwt.easyfont('color_index green') 

seg1 = (text_cell[0:10], font1) 
seg2 = (text_cell[10:], font2) 


first_sheet.write_rich_text(row, col, [seg1, seg2]) 

book.save('test.xls') 

Tout fonctionne bien au point d'écrire sur le fichier Excel, mais je reçois l'erreur TypeError: must be str, not bytes lors de l'enregistrement du classeur.

erreur complète:

File "test.py", line 91, in <module> 
book.save('test.xls') 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\Workbook.py", line 710, in save 
doc.save(filename_or_stream, self.get_biff_data()) 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\Workbook.py", line 674, in get_biff_data 
shared_str_table = self.__sst_rec() 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\Workbook.py", line 636, in __sst_rec 
return self.__sst.get_biff_record() 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\BIFFRecords.py", line 79, in get_biff_record 
self._add_rt_to_sst(s) 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\BIFFRecords.py", line 108, in _add_rt_to_sst 
rt_str, rt_fr = upack2rt(rt, self.encoding) 

File "C:\Users\...\AppData\Local\Continuum\Anaconda2\envs\py36\lib\site-packages\xlwt\UnicodeUtils.py", line 86, in upack2rt 
fr += pack('<HH', offset, fontx) 

TypeError: must be str, not bytes 

J'ai cherché une solution à ce problème, mais les réponses il ne semble pas résoudre mon problème:

xlwt book.save TypeError: must be str, not bytes

Python code, not able to write into xls

Ensuite, j'ai trouvé que ce problème pourrait être lié à la façon dont les chaînes sont traitées dans Python 3 vs Python 2 et que je pourrais b Obtenir une chaîne d'octets quelque part qui cause l'erreur.

J'ai regardé le type de text_cell et est str, j'ai essayé ommiting la police dans seg1 et seg2 mais il ne fonctionne toujours pas. Enfin, j'ai exécuté ce même script sur Python 2.7 et cela a fonctionné!

La mauvaise nouvelle est que j'ai besoin du code pour travailler en Python 3 puisque le serveur sur lequel il s'exécutera seulement a Python 3 et ne peut pas être changé.

Quelqu'un at-il une idée de ce qui pourrait causer le problème?

+0

Javier, votre « modifier » devrait être une « réponse » à la place :) Vous êtes autorisé à répondre à votre propre question ici sur StackOverflow! –

+0

Je ne savais pas! Merci –

+0

Pas de soucis! Vous êtes également autorisé à marquer votre réponse comme acceptée. Bienvenue à SO. –

Répondre