Python XLWT пытается перезаписать обходной путь ячейки

используя модуль python xlwt, запись в одну и ту же ячейку дважды выдает ошибку:

Message File Name   Line    Position    
Traceback               
    <module>    S:******** 
    write   C:Python26libsite-packagesxlwtWorksheet.py 1003        
    write   C:Python26libsite-packagesxlwtRow.py   231     
    insert_cell C:Python26libsite-packagesxlwtRow.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, но я думал, что питонический способ-предположить"мы знаем, что делаем". Я не хочу больше ничего ломать, прикасаясь к модулю.

4 ответов


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

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

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

... и Калоян Тодоров попал в точку.

вот еще несколько советов:

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

if not self.__parent._cell_overwrite_ok:

и поиск в коде _cell_overwrite_ok и вы должны прийти к выводу Калояна.

(2) задавать вопросы (и поиск в архивах) python-excel google-group

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

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

вся сага записана в google-group. Учебник включает раздел о перезаписи ячеек.


Если вы:

  • не хочу, чтобы весь рабочий лист мог быть перезаписан в конструкторе, и
  • все еще поймать исключение на индивидуальной основе

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

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

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