openpyxl返回公式系列的空单元格值
问题内容:
关键: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读取这些单元格没有问题…问题似乎仅在于公式。我是否缺少明显的东西?
问题答案:
更新3/23/16
在最新版本的PR请求中openpyxl
(2.3版及更高版本),此问题已得到解决。
这是openpyxl
(bug报告)的已知缺点。简短的答案是,当您上下拖动公式时,Excel将使用“共享公式”,而不能解析openpyxl
。如果您确实需要此功能,则可能需要尝试xlrd
。
编辑:
这让我很烦,所以这是一个非常骇人的解决方法(在python
2.7上测试)。首先,您必须从此处获得Robin
Macharg的Excel公式解析器。将其保存在Python路径中的某个位置xlparse.py
。现在,从这个要点运行代码,您应该能够使用该get_formula
函数获取任何单元格的公式。在大多数情况下,该函数仅返回cell.value
,但是只要该函数遇到共享公式,它就会给出正确的值。
注意:
的monkeypatchopenpyxl.reader.worksheet.Worksheet
是,因此openpyxl.load_workbook
使用我们的修补类。确保在调用之前运行此代码load_workbook
。如果要以其他方式创建工作簿,则必须Worksheet
在适当的位置打补丁。