MyModHeaven 发表于 2024-10-8 20:43

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就又能读到了。

Scan 发表于 2024-10-8 21:14

因为某些原因,python读的时候,本机不能操作,之前是这样的

bdrdc 发表于 2024-10-8 21:30

这个不错,好好研究研究.......

wapjsx 发表于 2024-10-9 08:25

建议大家 参考下 xlwings 模块,可以python编程与手动编辑同时使用

cgbchen 发表于 2024-10-9 10:35

留痕一下,碰到的时候研究研究

wudalang123 发表于 2024-10-10 07:48

问题核心

当你使用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")

qlu50of5 发表于 2024-10-12 07:53

你也可以将Excel表格的公式复制,选择粘贴为值,这样Python就能正藏读了
页: [1]
查看完整版本: Python打开excel文件,读取带公式的单元格的值为空