今天使用python语言第三方模块库openpyxl操作excel文件时遇到问题,整整用了一天的时间才解决了,事情是这样的:

本来使用xlwings模块操作excel挺顺手的,突然想看看别的模块怎么样,好不好使用,帮使用openpyxl模块操作excel表,在操作excel表时发现这个模块有一个问题,就是读取不到使用公式计算出的结果值 ,在网上找度娘问了好久,有的好多帖子说是在load_workbook ('文件名',data_only=True)使用参数,data_only=True就能解决这个问题(最后知道,这些帖子就是把别人的意见,不管对不对,自己没有做实验,取来粘到自己的帖子里,当做自己的成果胡乱发,你们这样做真的不负责人呀),我就着手开始按这些高人的帖子开始做实验,实验证明,使用data_only=True这个参数,读取有计算公式的单元格时,结果是none;如果不用使用这个参数或者使用data_only=False时,取有公式的单元格时,取出来的是公式,无论用什么方式都不能获取到公式计算出来后的结果,所以说网这样说的帖子都不正确,到这里又给卡住啦。

        继续问度娘,问了好久,问到有这样的说法,使用openpyxl读取有公式的单元格值 时,需要手工将文件打开后手工保存就可以啦,原理是excel保存了两份数据,一份是数据,一份是公式,这个我真的不清楚,没去深入研究,就按这些同志的学法试试,经过python创建了工作表,然后手工打开并保存,最后再用python去读这个工作表,嘿,还甭说,这种方法还真的能读取到公式的值,但这种半自动处理方式不实现,给人家开发了一个程序,处理很多数据,算是完了,人家读不到,告诉人家,你运行了那个模后,或者你点了那个按钮后,你先别着急处理别的,你得先将那个文件夹下的那个文件手工打开并保存一下,假如客户计算机不是很给力,数据量大的话,用了10分钟打开,用了5分钟保存,这肯定会把客户气死的。所以说这种半自动处理方式不可行,那放弃使用openpyxl这个模块库吗?也许会有别的解决办法,继续问度娘,没有找到解决办法,以前用其它语言开发时使用“Excel.application”直接调用excel程序操作excel表,那我想使用这个application不就是手动一样吗?试试这种方法是否可行?结果试这个的时候试出了问题

程序如下:

import os
from win32com.client import Dispatch

path = os.path.abspath('.') 

filaname = os.path.join(path, "test.xlsx")

xlApp = Dispatch("Excel.Application")
    
    xlApp.Visible = False

    filaname=filaname.replace('\\','/')
    
    xlBook = xlApp.Workbooks.Open(filename)
    
    xlBook.Save()
    
    xlBook.Close()

    xlapp.Application.Quit()
    
    xlapp=''

结果出现’不能识别的格式',一直不能解决,经过多次测试发现没有打开指定文件,打开不对,经过跟踪发现文件路径没问题呀,咋就找不到文件,但打开的文件是不正确,取到的表名是test是文件名一样,感觉是不是文件路径上有问题呀,后来发现问题出现在'\'的路径上,最后加了filaname=filaname.replace('\\','/')这条语句,将路径中'\'替换成'/',这样工作表名读取没问题啦,但经过这个程序保存后再打开就还是提示‘不能识别的格式',手工打开后发现,里边全部是中文乱码,手式重新建立后再次使用此程序打开保存后,依然是乱码,实在找不出原因,放下啦,准备放弃,可我不死心,就是不明白为什么会这样,最后考虑到会不会是因为我电脑安装office2003和2007两个版本有关系呀?可是手动打开的时候可是默认是2007版本呀,我打开com组件服务中 没有看到excel application服务,心里感觉可能问题出在这里,打开注册表搜索2003版的路径,发现与excel有不少,搜索2007版的路径发现与excel的指向不多,干脆把凡是涉及到2003版本的excel.exe文件指向路径全部改成了2007版本的指向路径,赶紧测试这个程序,结果再也没有错误提示啦。

总结 :操作excel文件是,出现’不能识别的格式‘后,一请检查你的文件路径是否是’\',如是请改成'/','\'这个右斜杠在python和C语言中都是转义符;二看你是否装有两个版本,或者是旧版本没有卸载干净,打开注册表搜索旧版本excel.exe文件路径,然后全部改成新版本的;三看当前语言加载的模块是否支持你这个版本。