python - openpyxl 返回公式系列的空单元格值

标签 python openpyxl

重要信息:python 3.4.3 | openpyxl 2.2.3 | Excel 2013

众所周知,您可以使用 Excel 的填充句柄在列 [1,2,3,4,5,6,etc] 下快速设置数字序列,这也适用于公式 [=sum(B1, C1), =sum(B2,C2), =sum(B3,C3), 等等]。但是,当我尝试使用 openpyxl 获取使用 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 中的公式。我针对几个简单的数字系列尝试了这个片段,并且 openpyxl 在读取这些单元格时没有问题......问题似乎与公式有关。我是否遗漏了一些明显的东西?

最佳答案

2016 年 3 月 23 日更新

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


这是 openpyxl ( bug report ) 的已知缺点。简短的回答是,当您向下或向下拖动公式时,Excel 使用“共享公式”,openpyxl 无法对其进行解析。如果你真的需要这个功能,你可能想试试xlrd .


编辑:

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

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

关于python - openpyxl 返回公式系列的空单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738584/

相关文章:

python - openpyxl 将数值视为日期。结果 : OverflowError: date value out of range

python - Django unique_together 但仅用于过滤

python - 使用 Python 进行网页抓取

python - POST 数据中缺少 Django 表单输入

Python/Pandas 从 Excel 表复制和粘贴

python - 复制单元格样式 openpyxl

python - openpyxl 覆盖所有数据而不是更新 excel 表

python - Dask "Column assignment doesn' t 支持类型 numpy.ndarray"

python - 正则表达式:仅在花括号内为单词添加引号

python - Openpyxl - 如何在 Python 中只读取 Excel 文件中的一列?