Python XLWT尝试覆盖单元格的解决方法
使用Python的xlwt模块时,如果尝试在同一个单元格里写入两次,就会出现错误:
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
这里有一段代码示例
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
看起来这段代码会“抛出”一个异常,这会让整个程序停止运行。那是不是只要去掉“raise”这个词,就可以允许覆盖单元格了呢?我很感激xlwt给出的警告,但我以为Python的编程方式是要相信“我们知道自己在做什么”。我不想在修改这个模块时破坏其他东西。
4 个回答
3
如果你:
- 不想在构造函数中把整个工作表都设置为可以被覆盖,
- 还想根据具体情况来捕捉异常,
...可以试试这个:
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
5
Ned B. 写的建议很有价值,除了一个问题,就是 xlwt
是 pyExcelerator
的一个分支,所以“模块的作者”这个说法有点模糊 ;-)
... 而 Kaloyan Todorov 则说得非常准确。
这里还有一些额外的建议:
(1) 注意你引用的代码中的以下一行:
if not self.__parent._cell_overwrite_ok:
然后在代码中搜索 _cell_overwrite_ok
,你应该能理解 Kaloyan 的结论。
(2) 在 python-excel 的 Google 组上提问(也可以搜索一下以前的讨论)。
(3) 查看 这个网站,它提供了 Google 组的链接和一个教程。
背景:问题在于有些人不知道自己在做什么(至少有一个人很高兴有人告诉他),而 xlwt
从 pyExcelerator
继承的行为是盲目地为同一个单元格写入两个(或更多)记录,这不仅导致文件变得庞大,还造成了混淆,因为 Excel 会报错并显示第一个写入的记录,而 OpenOffice 和 Gnumeric 则默默地显示最后一个写入的记录。要从共享字符串表中删除旧数据,以免浪费空间或(更糟糕的是)在文件中可见,真是麻烦。
整个过程都记录在 Google 组里。教程中有一部分专门讲解如何覆盖单元格。
60
这个问题是因为在xlwt
中,默认情况下不允许覆盖工作表的数据。你需要明确地允许这样做,方法如下:
worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)