首页 > 其他分享 >使用openpyxl读取Excel设置了公式的单元格 默认读取的是公式而不是公式结果

使用openpyxl读取Excel设置了公式的单元格 默认读取的是公式而不是公式结果

时间:2024-10-06 21:23:28浏览次数:7  
标签:读取 公式 单元格 Excel only data openpyxl

使用openpyxl对单元格有公式的Excel的sheet 进行操作,如果又读又写,
可以采用双重读取方式解决。

在 Excel 中,如果单元格的值是通过公式计算的,而你通过 openpyxl 库读取时发现获取的是公式而非结果,原因是 openpyxl 默认只读取单元格的公式而不计算公式的结果。

为了获取公式计算后的值,你需要将 Excel 文件的公式进行计算后再读取结果。openpyxl 自身无法计算公式的结果,因此需要使用 Excel 进行计算或者其他支持公式计算的库,比如 xlwings。
 
解决方案:
 

  1. 使用 openpyxl 加载预计算的值
    如果公式已经被计算过(即公式的值已经存在于文件中),你可以启用 data_only=True 来读取公式结果。
from openpyxl import load_workbook

# 加载 Excel 文件并启用 data_only 选项,获取公式计算后的值
wb = load_workbook('example.xlsx', data_only=True)
sheet = wb.active

# 读取计算后的值
cell_value = sheet['P' + str(i)].value
print(cell_value)

data_only=True 会使 openpyxl 读取公式计算后的结果,而不是公式本身。
请注意,data_only 只能读取已经计算的值,它不会实时计算公式。如果 Excel 文件保存时没有计算公式,则该选项无法生效。
 
2. 使用 xlwings 实时计算公式(需要 Excel 安装)
xlwings 是一个可以和 Excel 进行实时交互的库,它能让 Excel 计算公式并返回结果。

import xlwings as xw

# 打开 Excel 工作簿
wb = xw.Book('example.xlsx')
sheet = wb.sheets['Sheet1']

# 获取单元格 P 的计算结果
cell_value = sheet.range('P' + str(i)).value
print(cell_value)

xlwings 可以实时启动 Excel 进行计算,适合需要实时处理公式的情况。
 
总结:
使用 openpyxl 的 data_only=True 可以读取预先计算好的值,但不能计算新公式。
如果需要实时计算公式,可以使用 xlwings 库,它能直接调用 Excel 来处理公式计算。
使用 openpyxl 的 data_only=True 可以读取预先计算好的值,但不能计算新公式。
如果需要实时计算公式,可以使用 xlwings 库,它能直接调用 Excel 来处理公式计算。

ーーーーーーー

使用 openpyxl 时,启用 data_only=True 读取 Excel 中公式的结果会出现以下情况:
 

  1. 不会直接替换 Excel 中的公式
    读取时: 当你设置 data_only=True 并读取文件时,openpyxl 会返回公式计算后的值,而不是公式本身。但是,这只是读取数据的方式,并不会修改 Excel 文件中的公式。 公式依然存在于文件中。
     
    2. 保存时公式被替换为值
    保存时: 如果你在启用 data_only=True 的模式下打开并保存工作簿,Excel 文件中的公式会被替换为当前计算的值。原因是,data_only=True 模式下,openpyxl 只能读取值而无法读取公式,因此保存时,它只保存计算的结果,导致公式被丢失。
     

解决方案:

  • 不要保存:如果你只需要读取公式的计算结果,不需要对文件进行任何修改,不要保存工作簿。

  • 双重读取方法:如果你既想读取公式结果,又不想丢失公式,可以打开两次:

  使用 data_only=True 读取公式结果。
  使用 data_only=False 读取公式本身,确保不丢失公式。

  示例代码:

from openpyxl import load_workbook

# 第一次读取,获取公式计算后的值
wb_values = load_workbook('example.xlsx', data_only=True)
sheet_values = wb_values.active
print(sheet_values['P1'].value)  # 输出公式的计算结果

# 第二次读取,获取公式
wb_formulas = load_workbook('example.xlsx', data_only=False)
sheet_formulas = wb_formulas.active
print(sheet_formulas['P1'].value)  # 输出公式本身

# 不要在 data_only=True 模式下保存文件
# wb_values.save('example.xlsx')  # 避免保存以保持公式不被覆盖

 
结论:
data_only=True 可以安全读取公式计算的结果,但不要在此模式下保存文件。
如果需要同时读取值和公式,可以用双重读取方式解决。

标签:读取,公式,单元格,Excel,only,data,openpyxl
From: https://www.cnblogs.com/langQ/p/18449428

相关文章

  • Python 高级编程:高效读取 txt 文件的技巧与实践
    在Python中,读取txt文件是一项常见的操作。以下将介绍一些高级的方法来实现这一功能:使用with语句自动管理文件资源withopen('file.txt','r')asfile:content=file.read()print(content)with语句可以确保在代码块执行完毕后,文件会被正确地关闭,避免了资源泄漏......
  • Python 高级技巧:深入解析读取 Excel 文件的多种方法
    一、引言 在数据分析和处理中,经常需要从Excel文件中读取数据。Python提供了多种库来实现这个功能,本文将深入探讨使用 ​​pandas​​、​​openpyxl​​ 和 ​​xlrd​​ 库读取Excel文件的高级技巧和代码实现。 二、使用pandas库读取Excel文件 ​​pandas......
  • Pandas DataFrame对象df 读取数据
    你的df是一个PandasDataFrame对象,类似于一个表格结构的数据,通常有行和列。根据你的描述,表格中有多列数据,例如TS_CODE,DATE,TIME,OPEN等,总共有33列。要显示df中某个特定项目的值,例如“股票的当前价格”,你可以按照以下方式来操作。假设df里有一列CURRENT_PRICE表......
  • 讯飞星火编排创建智能体学习(四):网页读取
    目录引言网页读取节点如何生成网址测试引言在讯飞星火编排创建智能体学习(三):搜索工具-CSDN博客中,我介绍了如何用搜索工具从网上搜索车次信息。不过,在测试中我们也发现讯飞星火的这个工具并不是特别完善,它在整理搜索结果时可能会出现错误。所以,如果你确定某个网站可以获......
  • 信息学奥赛复赛复习08-CSP-J2020-03表达式前置知识点-后缀表达式、栈、字符读取
    PDF文档公众号回复关键字:202410011P1449后缀表达式[题目描述]所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)本题中运算符仅包含+-*/。保证对于/运算......
  • EasyExcel导出合并单元格
    处理结果:把a,b列相同内容的单元格进行合并引入easyexcel:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency>示例代码:publicvoidexportStrategyDetail(......
  • aspose.cell 合并内容一样的单元格
    ///<summary>///数据合并///</summary>///<paramname="mySheet"></param>///<paramname="columnIndex">合并的列下标</param>///<paramname="dataIndex">从哪一行开始</param>///<paramna......
  • [Java手撕]读取文件并进行left join操作
    importjava.io.*;importjava.sql.Time;importjava.util.*;importjava.util.concurrent.*;importjava.util.concurrent.atomic.AtomicInteger;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;publicclassMain......
  • Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式
    Matplotlib使用LaTeX渲染图表中的文本、标题和数学公式Matplotlib是一个功能强大的Python库,用于绘制各种高质量的图表和图形。在许多科研和技术文档中,数学公式是不可或缺的一部分,LaTeX提供了精美的数学公式渲染能力。Matplotlib支持通过LaTeX来渲染图表中的文本......
  • 物联网虚拟仿真系统对接ThingsBoard云平台实现数据的读取与组态控制
    面对物联网相关课程缺少设备或者设备难管理的问题,我们设计了一套物联网虚拟仿真系统,系统集成了多种虚拟传感器和网关设备,无需实体硬件即可模拟真实物联网环境。系统支持HTTP、modbusRTU、modbusTCP、MQTT、websocket等通信协议对接,因此支持app开发、微信小程序、web前端开发、......