• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
langQ
博客园    首页    新随笔    联系   管理    订阅  订阅
使用openpyxl读取Excel设置了公式的单元格 默认读取的是公式而不是公式结果

使用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 可以安全读取公式计算的结果,但不要在此模式下保存文件。
如果需要同时读取值和公式,可以用双重读取方式解决。

posted on 2024-10-06 21:26  嚯嚯go  阅读(874)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3