Python XLWT пытается перезаписать обход ячейки - PullRequest
13 голосов
/ 21 апреля 2010

Используя модуль 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, но я подумал, что питонский способ - предположить, что «мы знаем, что делаем» Я не хочу ничего ломать, касаясь модуля.

Ответы [ 4 ]

47 голосов
/ 21 апреля 2010

Проблема в том, что перезапись данных листа по умолчанию отключена в xlwt. Вы должны разрешить это явно, например так:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)
5 голосов
/ 21 апреля 2010

То, что написал Нед Б., является ценным советом - за исключением того факта, что, поскольку xlwt является форком pyExcelerator, «автор модуля» не определен; -)

... а Калоян Тодоров ударил ногтем по голове.

Вот еще один совет:

(1) Обратите внимание на следующую строку в коде, который вы цитировали:

if not self.__parent._cell_overwrite_ok:

и найдите код _cell_overwrite_ok, и вы должны прийти к заключению Калояна.

(2) Задавать вопросы (и искать в архивах) в google-группе python-excel

(3) Посетите этот сайт , который дает ссылки на google-группу и на учебник.

Справочная информация: проблема заключалась в том, что некоторые люди не знали, что они делали (и, по крайней мере, в одном случае, были рады сообщить), и поведение, которое xlwt унаследовал от pyExcelerator, заключалось в том, чтобы писать вслепую два (или более) записи для одной и той же ячейки, что привело не только к переполнению файла, но и к путанице, потому что Excel жаловался и отображал первое написанное, а OpenOffice и Gnumeric молча отображали последнее записанное. Удаление всех следов старых данных из таблицы общих строк, чтобы они не тратили место и (что еще хуже) были видны в файле, было PITA.

Вся сага записана в гугл-группе. Учебное пособие содержит раздел о перезаписи ячеек.

3 голосов
/ 17 августа 2015

Если вы:

  • не хотите устанавливать возможность перезаписи всего листа в конструкторе, а
  • по-прежнему перехватывает исключение в случаеоснование

... попробуйте:

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
1 голос
/ 21 апреля 2010

Вам необходимо связаться с автором модуля. Простое удаление raise вряд ли будет хорошо работать. Я предполагаю, что это приведет к другим проблемам в дальнейшем. Например, более поздний код может предполагать, что любая данная ячейка находится только в промежуточном представлении один раз.

...