18

使用 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 的警告,但我认为 pythonic 的方式是假设“我们知道我们在做什么”。我不想在触摸模块时破坏其他任何东西。

4

4 回答 4

55

问题是默认情况下禁用工作表数据的覆盖xlwt。您必须明确允许它,如下所示:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)
于 2010-04-21T00:44:57.250 回答
5

Ned B. 所写的是有价值的建议——除了作为xlwt一个分支的事实pyExcelerator,“模块的作者”是不明确的;-)

......而卡洛扬·托多罗夫(Kaloyan Todorov)一针见血。

这里还有一些建议:

(1) 请注意您引用的代码中的以下行:

if not self.__parent._cell_overwrite_ok:

并搜索代码_cell_overwrite_ok,您应该得出 Kaloyan 的结论。

(2) 对 python-excel google-group 提出问题(并搜索其档案)

(3) 查看该站点,该站点提供指向 google-group 和教程的指针。

背景:问题是有些人不知道自己在做什么(至少在一种情况下很高兴被告知),而 xlwt 从 pyExcelerator 继承的行为是盲目地为同一个单元格,这不仅会导致文件膨胀,还会导致混乱,因为 Excel 会抱怨并显示第一个写入的内容,而 OpenOffice 和 Gnumeric 会默默地显示最后写入的内容。从共享字符串表中删除所有旧数据的痕迹,这样它就不会浪费空间或(更糟)在文件中可见,这是一个 PITA。

整个 saga 都记录在 google-group 中。本教程包括关于覆盖单元格的部分。

于 2010-04-21T01:27:00.910 回答
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
于 2015-08-17T19:38:06.443 回答
1

您应该与模块的作者取得联系。简单地删除 araise不太可能很好地工作。我猜这会导致进一步的其他问题。例如,后面的代码可能假设任何给定的单元格仅在中间表示中出现一次。

于 2010-04-21T00:29:56.913 回答