18

Using the python module xlwt, writing to the same cell twice throws an error:

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   

with the code snippet

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

Looks like the code 'raise'es an exception which halts the entire process. Is removing the 'raise' term enough to allow for overwriting cells? I appreciate xlwt's warning, but i thought the pythonic way is to assume "we know what we're doing". I don't want to break anything else in touching the module.

4

4 に答える 4

55

問題は、ワークシート データの上書きが既定で無効になっていることですxlwt。次のように、明示的に許可する必要があります。

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

xlwtNed B. が書いたものは貴重なアドバイスです -- as is の fork であるという事実を除いてpyExcelerator、「モジュールの作成者」は定義が正しくありません ;-)

...そして、カロヤン・トドロフは頭に釘を打ちました。

さらにアドバイスを次に示します。

(1) 引用したコードの次の行に注目してください。

if not self.__parent._cell_overwrite_ok:

コードを検索すると、_cell_overwrite_okKaloyan の結論に達するはずです。

(2) python-excel google-group に質問する (およびアーカイブを検索する)

(3) google-group とチュートリアルへのポインタを提供するこのサイトをチェックしてください。

背景: 問題は、一部の人々が自分が何をしているのかを知らなかったことであり (少なくとも 1 つのケースでは、教えてもらえてうれしかった)、pyExcelerator から継承された xlwt の動作は、やみくもに 2 つ (またはそれ以上) のレコードを書き込むことでした。これは、ファイルの肥大化だけでなく、混乱も引き起こしました。Excel は文句を言って最初に書かれたものを表示し、OpenOffice と Gnumeric は黙って最後に書かれたものを表示するからです。共有文字列テーブルから古いデータのすべてのトレースを削除して、スペースを無駄にしたり、(さらに悪いことに) ファイルに表示されたりしないようにすることは、PITA でした。

サガ全体が google-group に記録されています。チュートリアルには、セルの上書きに関するセクションが含まれています。

于 2010-04-21T01:27:00.910 に答える
1

モジュールの作成者に連絡する必要があります。単純に a を削除するだけでraiseは、うまく機能しない可能性があります。今後、他の問題につながる可能性があると思います。たとえば、後のコードでは、特定のセルが中間表現に一度だけ含まれていると想定する場合があります。

于 2010-04-21T00:29:56.913 に答える