workbook.save() модуля python openpyxl не работает

Я пытался открыть файл XLSX с помощью модуля openpyxl. Ниже приведен мой сценарий: -

from openpyxl import load_workbook

print "Going to execute the script"
workbook = load_workbook("FileName.xlsx")
worksheet = workbook.get_sheet_by_name("Sheet01")
worksheet['B8'] = "Customer07"
workbook.save("FileName.xlsx")
print "End of script execution"

Когда я выполняю этот скрипт, я получаю следующую ошибку: -

/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/xml/__init__.py:15: UserWarning: The installed version of lxml is too old to be used with openpyxl
  warnings.warn("The installed version of lxml is too old to be used with openpyxl")
Going to execute the script
/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/workbook/names/named_range.py:121: UserWarning: Discarded range with reserved name
  warnings.warn("Discarded range with reserved name")
Traceback (most recent call last):
  File "check.py", line 11, in <module>
    workbook.save("FileName.xlsx")
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/workbook/workbook.py", line 296, in save
    save_workbook(self, filename)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/excel.py", line 191, in save_workbook
    writer.save(filename, as_template=as_template)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/excel.py", line 174, in save
    self.write_data(archive, as_template=as_template)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/excel.py", line 85, in write_data
    self._write_worksheets(archive)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/excel.py", line 111, in _write_worksheets
    write_worksheet(sheet, self.workbook.shared_strings,
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/worksheet.py", line 299, in write_worksheet
    xf.write(comments)
  File "/usr/lib/python2.6/contextlib.py", line 34, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/xml/xmlfile.py", line 42, in element
    yield
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/worksheet.py", line 276, in write_worksheet
    hf = write_header_footer(worksheet)
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/writer/worksheet.py", line 172, in write_header_footer
    header = worksheet.header_footer.getHeader()
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/worksheet/header_footer.py", line 150, in getHeader
    t.append(self.left_header.get())
  File "/usr/lib/python2.6/site-packages/openpyxl-2.2.0-py2.6.egg/openpyxl/worksheet/header_footer.py", line 90, in get
    t.append('&%d' % self.font_size)
TypeError: %d format: a number is required, not str

И после этого, когда я открываю «FileName.xlsx», появляется всплывающее окно с сообщением «Excel обнаружил нечитаемый комментарий в« FileName.xlsx ». Вы хотите восстановить содержимое этой книги? Если вы доверяете источнику этой книги , нажмите "да". Независимо от того, какую кнопку я нажимаю, рабочая книга пуста.

Если я прокомментирую следующую строку в скрипте,

workbook.save("FileName.xlsx")

скрипт работает без ошибок, но изменения не сохраняются в книге. Пожалуйста, помогите мне с этим.


person Praveen kumar    schedule 25.03.2015    source источник
comment
Есть ли в вашем файле верхний/нижний колонтитул? Похоже, ваш скрипт дает сбой в функции, которая читает заголовок   -  person wnnmaw    schedule 25.03.2015
comment
Нет. В коде нет верхнего/нижнего колонтитула. Я вставил весь код выше.   -  person Praveen kumar    schedule 25.03.2015
comment
О, может быть, я неправильно понял, вы редактируете существующий файл или создаете новую книгу?   -  person wnnmaw    schedule 25.03.2015
comment
Ошибка исходит из верхнего/нижнего колонтитула на листе. В версии 2.2.1 есть исправление, которое мы скоро выпустим. А пока либо удалите заголовки страниц, либо используйте 2.1.5.   -  person Charlie Clark    schedule 25.03.2015
comment
@wnnmaw Я редактирую существующий файл.   -  person Praveen kumar    schedule 26.03.2015
comment
@CharlieClark Я выполнил скрипт с openpyxl 2.1.5 openpyxl.exceptions.InvalidFileException: в архиве нет элемента с именем «xl/sharedStrings.xml»   -  person Praveen kumar    schedule 26.03.2015
comment
@CharlieClark Как удалить заголовки страниц ??   -  person Praveen kumar    schedule 26.03.2015
comment
Вам нужно будет удалить заголовки с помощью Excel или другого приложения. Если файл sharedStrings.xml отсутствует, я подозреваю, что у вас могут быть другие проблемы с файлом fie. Но можно попробовать кассу ветки 2.2.   -  person Charlie Clark    schedule 26.03.2015


Ответы (2)


Попробуйте указать worksheet['B8'].value = "Customer07" вместо worksheet['B8'] = "Customer07"

person user3228763    schedule 16.10.2016
comment
Я не знаю, почему кто-то недооценил это предложение решения, но мне оно действительно помогло. Спасибо! - person StrictLine; 21.07.2020

У меня была такая же проблема прошлой ночью, я думал, что в моем файле Excel нет заголовка, но на самом деле у него были верхний и нижний колонтитулы (которые вы можете увидеть, когда нажмете «Предварительный просмотр»)

В любом случае, это мое хакерское исправление:

Я закомментировал эту строку кода и добавил строку pass

"<path-to-library>/openpyxl/worksheet/header_footer.py", line 90, in get
Line 89-91 below

if self.font_size:
    # t.append('&%d' % self.font_size) # commented out this line
    pass # added this line "pass"

Это «исправление» повлияет только на font_size ваших верхних и нижних колонтитулов (не особенно большое дело, если вы спросите меня). Но вы можете обнаружить, что хотели бы просто хранить эти верхние и нижние колонтитулы в переменной, чтобы в будущем вы могли использовать их каким-то другим образом в своей программе.

Если это так, ниже я предоставил некоторый код для извлечения этих верхних и нижних колонтитулов в соответствующие словари (если они существуют).

ПРИМЕЧАНИЕ. Это также может помочь определить, есть ли в документе верхний и нижний колонтитулы.

После wb.save(<path/to/file>):

header_dict = {}
if ws.header_footer.hasHeader():
    header_dict['center'] = ws.header_footer.center_header.text
    header_dict['left'] = ws.header_footer.left_header.text
    header_dict['right'] = ws.header_footer.right_header.text

footer_dict = {}
if ws.header_footer.hasFooter():
    footer_dict['center'] = ws.header_footer.center_footer.text
    footer_dict['left'] = ws.header_footer.left_footer.text
    footer_dict['right'] = ws.header_footer.right_footer.text

return header_dict, footer_dict

И этот модуль header_footer может предоставить способ удалить их из файла Excel, но дополнительную помощь можно найти в документации OpenPyXL — верхние и нижние колонтитулы

person mkultra    schedule 29.11.2016
comment
Я не поклонник github, поэтому, если кто-то еще хочет предложить любой из этих кодов в качестве исправления или дополнения к репозиторию. Пожалуйста, обязательно сделайте это. - person mkultra; 29.11.2016