openpyxl 返回公式系列的空单元格值
openpyxl returning empty cell values for formula series
生命体征: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). The short answer is that when you drag a formula down or across, Excel uses a "shared formula," which cannot be parsed by openpyxl
. If you really need this functionality, you may want to try xlrd
。
编辑:
这让我很烦,所以这里有一个非常 hackish 的解决方法(在 Python 2.7 上测试过)。首先,您必须获得 Robin Macharg 的 Excel 公式解析器 from here. Save it somewhere in your Python path as xlparse.py
. Now, run the code from this gist,并且您应该能够使用 get_formula
函数来获取任何单元格的公式。在大多数情况下,函数只是 returns cell.value
,但只要函数遇到共享公式,它就会给出正确的值。
注:
openpyxl.reader.worksheet.Worksheet
的 monkeypatch 使得 openpyxl.load_workbook
使用我们的补丁 class。确保在调用 load_workbook
之前 运行 此代码。如果您以不同的方式创建工作簿,则必须在适当的位置修补 Worksheet
。
生命体征: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). The short answer is that when you drag a formula down or across, Excel uses a "shared formula," which cannot be parsed by openpyxl
. If you really need this functionality, you may want to try xlrd
。
编辑:
这让我很烦,所以这里有一个非常 hackish 的解决方法(在 Python 2.7 上测试过)。首先,您必须获得 Robin Macharg 的 Excel 公式解析器 from here. Save it somewhere in your Python path as xlparse.py
. Now, run the code from this gist,并且您应该能够使用 get_formula
函数来获取任何单元格的公式。在大多数情况下,函数只是 returns cell.value
,但只要函数遇到共享公式,它就会给出正确的值。
注:
openpyxl.reader.worksheet.Worksheet
的 monkeypatch 使得 openpyxl.load_workbook
使用我们的补丁 class。确保在调用 load_workbook
之前 运行 此代码。如果您以不同的方式创建工作簿,则必须在适当的位置修补 Worksheet
。