【问题标题】:openpyxl returning empty cell values for formula seriesopenpyxl 返回公式系列的空单元格值
【发布时间】:2015-08-24 15:46:26
【问题描述】:

生命体征:python 3.4.3 | openpyxl 2.2.3 | Excel 2013

众所周知,您可以使用 Excel 的填充句柄在列 [1,2,3,4,5,6 等] 下快速设置数字系列,这也适用于公式 [=sum(B1, C1)、=sum(B2,C2)、=sum(B3,C3) 等]。但是,当我尝试使用 openpyxl 来 nab 使用 Excel 中的填充句柄添加的公式时,这些单元格被报告为空。

它不适用于我的原始代码,因此我创建了一个包含以下内容的简单脚本:

for row in ws.rows:
  for cell in row:
    print('my value is:',cell.value)

然后针对这个很小的 ​​(aww) Excel 文件运行它。我使用 A1 上的填充柄用公式填充 A2-A5。 (为了清楚起见,我只是显示公式,我在 A 列中实际看到的是结果。)

#      A       B   C
1 =SUM(B1:C1)  1   2
2 =SUM(B2:C2)  10  20
3 =SUM(B3:C3)  20  25
4 =SUM(B4:C4)  90  42
5 =SUM(B5:C5)  64  4

这是控制台的输出:

my value is: =SUM(B1:C1)
my value is: 1
my value is: 2
my value is: =SUM(B2:C2)
my value is: 10
my value is: 20
my value is: =
my value is: 20
my value is: 25
my value is: =
my value is: 90
my value is: 42
my value is: =
my value is: 64
my value is: 4

openpyxl 读取 A1 和 A2 中的公式,但不读取 A3-A5。我针对几个简单的数字序列尝试了这个 sn-p 并且 openpyxl 在读取这些单元格时没有问题……问题似乎出在公式上。我错过了什么明显的东西吗?

【问题讨论】:

  • 我遇到了同样的问题(只是最初的 =),而不是整个公式。 (虽然读取值是可以的)
  • 酷豆子,我会试一试,看看能不能让它在 Python 3.4 上工作。

标签: python openpyxl


【解决方案1】:

2016 年 3 月 23 日更新

此问题已在 openpyxl 的最新版本中得到解决(我相信是 2.3 及更高版本)PR request


这是openpyxl (bug report) 的一个已知缺点。简短的回答是,当您向下或跨越公式时,Excel 使用“共享公式”,openpyxl 无法解析该公式。如果你真的需要这个功能,不妨试试xlrd


编辑:

这让我很烦,所以这是一个非常骇人听闻的解决方法(在 Python 2.7 上测试)。首先你必须得到 Robin Macharg 的 Excel 公式解析器from here。将它保存在您的 Python 路径中的某个位置为xlparse.py。现在,运行代码from this gist,您应该能够使用get_formula 函数来获取任何单元格的公式。在大多数情况下,该函数只返回cell.value,但每当该函数遇到共享公式时,它都会给出正确的值。

注意: openpyxl.reader.worksheet.Worksheet 的猴子补丁是为了让 openpyxl.load_workbook 使用我们的补丁类。确保在调用 load_workbook 之前运行此代码。如果您以不同的方式创建工作簿,则必须在适当的位置修补 Worksheet

【讨论】:

  • 我不知道这是否是我的问题(我对编程还是很陌生)但是 sharedpyxl 在尝试处理示例的单元格 A3 时会返回以下错误我在原始帖子中使用的 Excel 电子表格:openpyxl.utils.exceptions.CellCoordinatesException: Invalid cell coordinates (B2:C2) 当它到达这一行时 'col, row = openpyxl.utils.coordinate_from_string(addr) ' 在 R1C1Converter 类中。
  • 哦,我明白了。我认为问题出在sharedpyxl,让我再次破解并回帖。
  • 好的——问题出在单元格的范围上。我已经更新了要点。再试一次,让我知道它是否有效
  • 我再次运行时遇到了同样的错误,但在仔细检查了 Gist 修订历史后,我仍然看到昨天更新的 sharedpyxl 版本(总共 5 个),即使在清除浏览器缓存之后也是如此.
  • 糟糕,实际上并没有点击提交。立即尝试
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2016-10-16
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多