Python XLWT尝试覆盖单元格的解决方法

19 投票
4 回答
41910 浏览
提问于 2025-04-15 21:51

使用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. 写的建议很有价值,除了一个问题,就是 xlwtpyExcelerator 的一个分支,所以“模块的作者”这个说法有点模糊 ;-)

... 而 Kaloyan Todorov 则说得非常准确。

这里还有一些额外的建议:

(1) 注意你引用的代码中的以下一行:

if not self.__parent._cell_overwrite_ok:

然后在代码中搜索 _cell_overwrite_ok,你应该能理解 Kaloyan 的结论。

(2) 在 python-excel 的 Google 组上提问(也可以搜索一下以前的讨论)。

(3) 查看 这个网站,它提供了 Google 组的链接和一个教程。

背景:问题在于有些人不知道自己在做什么(至少有一个人很高兴有人告诉他),而 xlwtpyExcelerator 继承的行为是盲目地为同一个单元格写入两个(或更多)记录,这不仅导致文件变得庞大,还造成了混淆,因为 Excel 会报错并显示第一个写入的记录,而 OpenOffice 和 Gnumeric 则默默地显示最后一个写入的记录。要从共享字符串表中删除旧数据,以免浪费空间或(更糟糕的是)在文件中可见,真是麻烦。

整个过程都记录在 Google 组里。教程中有一部分专门讲解如何覆盖单元格。

60

这个问题是因为在xlwt中,默认情况下不允许覆盖工作表的数据。你需要明确地允许这样做,方法如下:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)

撰写回答