openpyxl 、xlrd等模块 读取带公式的excel遇到怪事,至今仍未找到答案

事件起因:通过程序生成的Excel文件(部分单元格带有公式)
openpyxl 、xlrd等模块 读取带公式的excel遇到怪事,至今仍未找到答案_第1张图片
奇葩问题:openpyxl 读取带公式的excel时,要么 读出来是“None”,要么是“公式本身”
wb = openpyxl.load_workbook(‘daikuan.xlsx’,data_only = True)-------读出来的是 none
#wb = openpyxl.load_workbook(‘daikuan.xlsx’,data_only = False)------------读出来的是 公式本身
xlrd读取也一样
网上搜索都没有针对带公式的Excel文件读取的说法,今早偶然看到一则网页暂时解决了,但原因不明。
最笨的方法:

  1. 打开excel文件,点击save,别的什么都不做
  2. 关闭excel
  3. 再运行.py程序。
    完全没有问题,但是问题出在哪里呢?是否可以用程序打开文件再保存再打开再读取?

继续……
https://www.cnblogs.com/vhills/p/8327918.html
有具体说明为什么

用openpyxl读取excel的load_workbook有个data_only参数。

1

yb_wb = load_workbook(u"D:\Desktop\xxx.xlsx", data_only=True)

顾名思义,True时,只读data,忽略公式。

但是有个情景是——得先保留公式,根据旧公式写入新公式。然后再读取值进行操作。也就是说先data_only = False,然后再data_only = True。

这样会导致读取值操作的时候,公式全部没有了。对,全部为空。就是这么奇怪。

谷歌,百度后得知:

wb = openpyxl.load_workbook(‘abc.xlsx’, data_only=True)

当’abc.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程序打开该文件并保存。

参考——http://blog.51cto.com/antidarkness/1974684

解决方法:

重新打开一次,保存。

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()

先调用win32com打开一次,就OK,原公式就会变成值,后面就可以愉快的操作了。

你可能感兴趣的:(openpyxl 、xlrd等模块 读取带公式的excel遇到怪事,至今仍未找到答案)