【问题标题】:Python 3 - xlwt save Workbook errorPython 3 - xlwt 保存工作簿错误
【发布时间】:2017-06-21 13:12:24
【问题描述】:

我正在用 Python 3.6 编写一个小程序,它读取一个 excel 文件,然后修改单元格的格式。我想在同一个单元格中使用多种格式,所以我使用xlwtwrite_rich_text

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

在写入 excel 文件之前一切正常,但在保存工作簿时出现错误 TypeError: must be str, not bytes

完全错误:

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

我一直在寻找解决此问题的方法,但那里的答案似乎无法解决我的问题:

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

Python code, not able to write into xls

然后我发现这个问题可能与 Python 3 和 Python 2 中处理字符串的方式有关,并且我可能在某处得到了导致错误的字节字符串。

我查看了text_cellstr 的类型,我尝试省略seg1seg2 中的字体,但它仍然不起作用。 最后,我在 Python 2.7 上运行了同样的脚本,它成功了!

坏消息是我需要代码在 Python 3 中工作,因为运行它的服务器只有 Python 3 并且无法更改。

任何人都知道可能导致问题的原因吗?

【问题讨论】:

  • 哈维尔,你的“编辑”应该是一个“答案” :) 你可以在 StackOverflow 上回答你自己的问题!
  • 我不知道!谢谢
  • 别担心!您还可以将您的答案标记为已接受。欢迎来到 SO。

标签: python excel python-3.x xlwt unicode-string


【解决方案1】:

显然这是上个月修复的 xlwt 中的一个已知问题!我更新了包,现在它就像一个魅力。

https://github.com/python-excel/xlwt/issues/89

【讨论】:

    【解决方案2】:

    一年多后我遇到了同样的问题 使用来自faker 的(fake.address().split('\n'))[1].split(',') 作为我的输入,当您尝试将列表(在我的情况下是两个字符串的列表)输入到单个单元格时,似乎也会发生此错误。

    尝试将它们分开,在我的情况下,以下应该可行:

    temp =(fake.address().split('\n'))[1].split(',')
    input = temp[0] + temp[1]
    sheet.write(0, 0, input)
    

    为了更通用,如果您遇到这种情况,请尝试连接您的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多