使用openpyxl对单元格有公式的Excel的sheet 进行操作,如果又读又写,
可以采用双重读取方式解决。
在 Excel 中,如果单元格的值是通过公式计算的,而你通过 openpyxl 库读取时发现获取的是公式而非结果,原因是 openpyxl 默认只读取单元格的公式而不计算公式的结果。
为了获取公式计算后的值,你需要将 Excel 文件的公式进行计算后再读取结果。openpyxl 自身无法计算公式的结果,因此需要使用 Excel 进行计算或者其他支持公式计算的库,比如 xlwings。
解决方案:
- 使用 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 中公式的结果会出现以下情况:
- 不会直接替换 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 可以安全读取公式计算的结果,但不要在此模式下保存文件。
如果需要同时读取值和公式,可以用双重读取方式解决。