Ответ 1
Проблема заключается в том, что перезапись данных рабочего листа по умолчанию отключена в xlwt
. Вы должны разрешить это явно, например:
worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)
Используя модуль 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, но я думал, что питонический способ - предположить, что "мы знаем, что делаем". Я не хочу ломать что-либо еще, касаясь модуля.
Проблема заключается в том, что перезапись данных рабочего листа по умолчанию отключена в xlwt
. Вы должны разрешить это явно, например:
worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True)
То, что написал Нед Б., является ценным советом - за исключением того, что поскольку 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. Учебное пособие включает раздел о перезаписи ячеек.
Если вы:
... попробуйте следующее:
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
вряд ли будет работать хорошо. Я бы предположил, что это приведет к другим проблемам дальше по линии. Например, более поздний код может предполагать, что любая данная ячейка будет только в промежуточном представлении один раз.