Подтвердить что ты не робот

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

Похоже, код 'raise' создает исключение, которое останавливает весь процесс. Удаляет ли термин "рейз" достаточно, чтобы переписать ячейки? Я ценю предупреждение xlwt, но я думал, что питонический способ - предположить, что "мы знаем, что делаем". Я не хочу ломать что-либо еще, касаясь модуля.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

if not self.__parent._cell_overwrite_ok:

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

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

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

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

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

Ответ 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

Ответ 4

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