Python3 openpyxl生成的表格无法读取公式数据问题解决
python 使用openpyxl读取模板xlsx表格公式显示为公式,使用:data_only=True参数则读出的为空值,我们这里想读出公式计算好的值。
原因:
当xlsx表格被生成并在Excel程序中打开并保存之后(这个过程Excel会把公式结果计算出来),该文件附带有两套值,一套是公式全都没有计算的(data_only=False(默认)),一套是公式计算了结果的(data_only=True)。(如果没有被Excel打开并保存,则只有一套值(data_only=False的那套,公式没有计算结果的)。
此时,以data_only=True或默认data_only=False打开会得到两种不同的结果,各自独立,即data_only=True状态下打开的,会发现公式结果为None(空值)或者一个计算好的常数,而不会看到它原本的公式是如何。而data_only=False则只会显示公式而已。因此,data_only=True状态下打开,如果最后用save()函数保存了,则原xlsx文件中,公式会被替换为常数结果或空值。而data_only=False状态下打开,最后用save()函数保存了的话,原xlsx文件也会只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值会丢失,如想重新获得两套值,则仍旧需要用Excel程序打开该文件并保存。
参考:https://blog.51cto.com/antidarkness/1974684
解决方案:
1.windows下:
使用如下代码打开在关闭一次,在使用data_only=True读出公式计算的值:
from win32com.client import Dispatch
def just_open(filename):
xlApp = Dispatch(“Excel.Application”)
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
2.linux下:
由于linux不同于windows系统所以无法使用:from win32com.client import Dispatch 的解决方案。
我这里结局方案是在服务器上安装:LibreOffice
用它来把代码生成的xlsx表在转化成另一个xlsx,就是完成了一次打开关闭的操作这样底层就会生成两套值了,之后我们在使用 data_only=True参数读出新转化的xlsx,这样原来为空的公式值就变成了计算好的值。
我这里是用了python调用linux命令操作的。