Python打开excel文件,读取带公式的单元格的值为空
本帖最后由 MyModHeaven 于 2024-10-8 20:47 编辑如题。
以openpyxl为例。
众所周知,当存在公式时,`openpyxl.reader.excel.load_workbook(filename, read_only=False, keep_vba=False, data_only=False, keep_links=True, rich_text=False)`中的可选参数`data_only`要设置为`True`,这样才能读取公式的结果,而不是读取到`=A1-A2`这样的公式。
如果,一直只是简单的读取数据,或许并没有调用`wb.save()`。当同一个文件多次打开,并且同时涉及读取和写入的时候,`wb.save()`就带来的一点麻烦:python告诉你有公式的单元格的值都为空,手动打开excel文件却发现有值,并且公式也没消失。
昨晚困扰我好长时间,睡前还带来一个坏情绪。本来是在修改旧代码,发现这个问题后,一开始以为屎山代码让我搞崩塌了,后来以为碰见bug了,一度想重启电脑(听说重启电脑能解决99%的问题)。
今天晚上搜了一下才发现,这是一个客观存在的问题,了解到原因后,我想,但凡是没经验、第一次碰到这个问题的人,都不会想到原因吧。
而且,这个问题貌似是通病,无论用openpyxl、pandas还是其他的啥库。
详情见:
https://blog.csdn.net/u013541325/article/details/108246829
https://blog.csdn.net/weixin_45903952/article/details/105073611
我试了一下手动打开,然后关闭,还是读不了。原来是打开之后,需要保存一下再关闭,python就又能读到了。 因为某些原因,python读的时候,本机不能操作,之前是这样的 这个不错,好好研究研究....... 建议大家 参考下 xlwings 模块,可以python编程与手动编辑同时使用 留痕一下,碰到的时候研究研究 问题核心
当你使用openpyxl或pandas读取Excel文件时,你可以通过设置data_only=True来获取公式的计算结果,而不是公式本身。但是,如果你在读取后对文件进行了写入并保存,而没有重新计算公式,那么保存后的文件可能会丢失公式的计算结果。
解决方案
确保Excel文件被正确打开并保存:在你使用Python读取之前,确保Excel文件已经被Excel应用程序打开并保存过。这样可以确保公式的计算结果被更新并存储。
使用data_only=True:当你使用openpyxl加载工作簿时,确保使用data_only=True参数,这样你可以获取到公式的计算结果。
手动触发Excel文件的保存:如果你在Python中修改了文件,确保在保存之前,手动打开Excel文件,进行任意小的修改(如更改一个单元格的值),然后保存并关闭。这样可以确保公式的计算结果被更新。
使用Win32com:如果你需要自动化这个过程,可以使用win32com库来模拟Excel应用程序的行为,打开文件,保存并关闭。
示例代码
这里是一个使用win32com来打开、保存并关闭Excel文件的示例:
python
import os
from win32com.client import Dispatch
def save_excel_with_formulas(file_path):
try:
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(os.path.join(os.getcwd(), file_path))
xlBook.Save()
xlBook.Close()
except Exception as e:
print(f"Error: {e}")
finally:
xlApp.Quit()
# 使用示例
save_excel_with_formulas("your_file.xlsx") 你也可以将Excel表格的公式复制,选择粘贴为值,这样Python就能正藏读了
页:
[1]