python的openpyxl模块的workbook.save()不起作用

Posted

技术标签:

【中文标题】python的openpyxl模块的workbook.save()不起作用【英文标题】:workbook.save() of python's openpyxl module is not working 【发布时间】:2015-03-25 17:10:35 【问题描述】:

我试图使用 openpyxl 模块打开一个 XLSX 文件。以下是我的脚本:-

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")

脚本运行没有任何错误,但修改未保存在工作簿中。 请帮我解决这个问题。

【问题讨论】:

您的文件中有页眉/页脚吗?看起来您的脚本在读取标题的函数中失败了 没有。代码中没有页眉/页脚。我在上面粘贴了整个代码。 哦,我理解错了,您是在编辑现有文件还是创建新工作簿? 错误来自工作表中的页眉/页脚。 2.2.1 中对此进行了修复,我们很快就会发布。同时删除页眉或使用 2.1.5 @wnnmaw 我正在编辑现有文件。 【参考方案1】:

尝试放置 工作表['B8'].value = "Customer07" 反而 工作表['B8'] = "Customer07"

【讨论】:

我不知道为什么有人低估了这个解决方案的提议,但它确实对我有帮助。谢谢!【参考方案2】:

昨晚我遇到了同样的问题,我以为我的 Excel 文件没有页眉,但实际上它确实有页眉和页脚(当你按下“打印预览”时,你可能会看到)

无论如何,这是我的 hacky 修复:

我注释掉了这行代码并添加了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(&lt;path/to/file&gt;)之后:

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 - Headers and Footers 中找到更多帮助

【讨论】:

我不是 github 爱好者,所以如果其他人想提出任何此代码作为 repo 的修复或补充。请务必这样做。

以上是关于python的openpyxl模块的workbook.save()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

openpyxl方法记录

Python之openpyxl模块的使用

python3操作Excel openpyxl模块的使用

python之openpyxl模块

python操作excel----openpyxl模块

python之openpyxl模块