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

Опитвах се да отворя 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