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
вряд ли будет работать хорошо. Я бы предположил, что это приведет к другим проблемам в будущем. Например, более поздний код может предполагать, что любая заданная ячейка находится только в промежуточном представлении один раз.