现象:Python用openpyxl读取单元格中的公式的值,为None
用代码给单元格写了字符串式的公式,但是再次读取时,并没有得到预期的公式结果,现象如下:
def use_formula(name):
wb = openpyxl.load_workbook(name)
ws = wb.create_sheet(title='公式demo', index=0)
ws.cell(2, 1).value = 21
ws.cell(2, 2).value = 22
# 写法1
ws['C2'] = '=sum(A2:B2)'
# 写法2
ws.cell(2, 5).value = '=sum(A2:B2)'
wb.save(name)
wb.close()
# 使用公式后,读取有公式单元格的值
def read_formula_cell(name):
wb = openpyxl.load_workbook(name, data_only=True)
ws = wb['公式demo']
print(ws.cell(2, 1).value)
print(ws.cell(2, 2).value)
print(ws.cell(2, 3).value)
print(ws.cell(2, 5).value)
wb.close()
打印出来的值为:
21
22
None
None
但是期望的是:
21
22
43
43
原理分析
公式,实际在Python代码中写入的是公式样式的字符串,并不能运行、得到计算结果;
也就是说,实际的计算过程,并没有进行,代码只是告诉了Excel如何进行计算来得到这个单元格的值;
所以,计算过程是在客户端进行的,比如本地的win电脑里,你打开一下,Excel客户端就开始自动计算、得到结果、呈现,并在退出时保存到了文件信息里
下次打开、读取时,就不用再计算了,直接可读取到公式的结果
正确做法
1、代码生成的表格,必须使用win的Excel客户端软件打开一次,公式才可以得到计算
2、保存后,再次打开时就能读取到公式的值,否则一直读取到的是None!
总结
Python的openpyxl库,是为了方便用代码操作Excel,但绝不意味着此库可以达到与客户端Excel一样强大的功能(包括计算等)。所以,使用这些非主流的方法、属性时,有理解和操作成本,并不会很完美
所以不建议使用太花哨的冷门功能