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

时间:2015-06-09 17:10:38

标签: python openpyxl

Vitals: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来使用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读取这些单元格没有问题...这个问题似乎与公式有关。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:5)

2016年3月23日更新

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

这是openpyxlbug 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的monkeypatch是openpyxl.load_workbook使用我们的补丁类。确保在调用load_workbook之前运行此代码。如果您以不同的方式创建工作簿,则必须在适当的位置修补Worksheet