for node中的_name:TypeError:'NoneType'对象不可迭代

时间:2015-10-19 07:16:34

标签: python openpyxl

我在 Ubuntu Server

中使用openpyxl python excel阅读器和编写器

当我使用以下命令

from openpyxl import load_workbook,Workbook
book  = load_workbook(filename='/var/www/test.xlsx')

将错误抛出

for _name in node:
TypeError: 'NoneType' object is not iterable

但在本地系统中一切都很好。任何人都知道为什么会这样,以及如何解决这个问题?

更新

File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/openpyxl/reader/excel.py", line 202, in load_workbook
    parsed_styles = read_style_table(archive)
  File "/usr/local/lib/python2.7/dist-packages/openpyxl/reader/style.py", line 181, in read_style_table
    p.parse()
  File "/usr/local/lib/python2.7/dist-packages/openpyxl/reader/style.py", line 53, in parse
    self.parse_named_styles()
  File "/usr/local/lib/python2.7/dist-packages/openpyxl/reader/style.py", line 109, in parse_named_styles
    names = self._parse_style_names()
  File "/usr/local/lib/python2.7/dist-packages/openpyxl/reader/style.py", line 128, in _parse_style_names
    for _name in node:
TypeError: 'NoneType' object is not iterable

5 个答案:

答案 0 :(得分:0)

看起来openpyxl无法理解您的命名样式列表。您应该首先提取.xlsx文件(它只是一个带有不同结尾的.zip存档),然后查找定义样式的XML文件(它是scan 'table', {COLUMNS => ['data:title'], FILTER => "SingleColumnValueFilter('data', 'title', = , 'regexstring:*bye') "} )。验证它是格式良好的XML,并且没有损坏。您可以使用众多在线XML检查程序之一来完成此操作。

如果那不是罪魁祸首,您可能只是尝试依赖openpyxl的“仁慈”,删除styles.xml,重新压缩为.zip,重命名为.xlsx,然后重试。

答案 1 :(得分:0)

我遇到了同样的问题,似乎路径不正确。使用Excel打开文件,然后从“文件”选项卡中复制粘贴路径。

答案 2 :(得分:0)

在许多情况下,它与格式错误的样式表有关,正如之前的海报已经提到的那样。我有几个由Oracle SQLDeveloper生成的.xlsx文件。 当我想用openpyxl解析它们时,我需要打开然后将它们保存在Excel中。否则我会得到与你相同的错误。 我没有比较样式表(重新保存文件之前和之后),因此我无法通过在Excel中保存文件来告诉您修复了什么。它只适用于这种特殊情况,但它也适用于你的。

答案 3 :(得分:0)

这是openpyxml版本2.3中的错误,请参阅:https://bitbucket.org/openpyxl/openpyxl/issues/544,它已在2.3.1中修复。

升级到最新版本可以轻松解决问题,运行:

pip install openpyxl -I

这样,pip会忽略您当前的库版本并获取最新版本。

答案 4 :(得分:0)

我今天在Windows上遇到了这个问题。

事实证明,这是因为在保存文件时,在“另存为类型:”下,我选择了Strict Open XML Spreadsheet (*.xlsx)

当我将其保存为Excel Workbook (*.xlsx)

时,它有效

我假设所有.xlsx个文件都是相同的,显然情况并非如此。