Python XLWT尝试覆盖单元格变通方法

时间:2010-04-21 00:00:26

标签: 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

看起来代码'引发'一个例外,它会暂停整个过程。删除'加注'一词足以允许覆盖单元格?我很欣赏xlwt的警告,但我认为pythonic方式是假设“我们知道我们在做什么”。触摸模块时我不想破坏任何其他东西。

4 个答案:

答案 0 :(得分:46)

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

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

答案 1 :(得分:5)

Ned B.撰写的内容是有价值的建议 - 除了xlwtpyExcelerator的分支,“模块的作者”是错误的定义; - )

......而Kaloyan Todorov已经敲了敲门。

以下是一些建议:

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

if not self.__parent._cell_overwrite_ok:

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

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

(3)查看this site,其中提供了指向google-group和教程的链接。

背景:问题是有些人不知道他们在做什么(并且至少有一个案例很高兴被告知),xlwt从pyExcelerator继承的行为是盲目地写两个(或更多)同一个单元格的记录,不仅导致文件膨胀而且还导致混乱,因为Excel会抱怨并显示第一个写入的OpenOffice和Gnumeric将默默显示最后写入的内容。从共享字符串表中删除旧数据的所有跟踪,以便它不会浪费空间或者(更糟)在文件中可见是PITA。

整个传奇都记录在google-group中。本教程包含有关覆盖单元格的部分。

答案 2 :(得分: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

答案 3 :(得分:1)

您应该与模块的作者联系。简单地移除raise不太可能正常工作。我猜这会导致其他问题进一步发展。例如,稍后的代码可以假设任何给定的单元格仅在中间表示中一次。