Python将带公式Excel转CSV并保留计算值的方案咨询
Excel带公式文件转CSV保留计算结果解决方案
问题根因
你遇到的问题本质是openpyxl本身不具备Excel公式计算能力:
- xlsx文件中公式和计算结果是分开存储的,你用默认参数
data_only=False读取原文件时,拿到的cell.value是公式字符串,写入新文件后仅存储了公式,没有对应的计算结果缓存。 - 手动打开Excel并保存时,Excel会自动触发所有公式计算,将结果缓存到文件中,因此后续用pandas或
data_only=True读取时能拿到正常数值。
解决方案
方案1:调用系统Excel自动计算(Windows/Mac通用,兼容性最好)
直接通过xlwings调用系统安装的Excel程序,完全复现手动打开保存的逻辑,无需人工干预,对所有Excel公式兼容。
- 安装依赖
pip install xlwings
- 处理生成的xlsx文件
import xlwings as xw import pandas as pd # 后台启动Excel进程,不显示界面、不弹出告警 with xw.App(visible=False, add_book=False) as app: app.display_alerts = False # 打开文件时Excel会自动计算所有公式 wb = app.books.open('file2.xlsx') # 保存后计算结果就会写入文件缓存 wb.save() wb.close() # 后续转CSV逻辑完全正常 df = pd.read_excel('file2.xlsx') df.to_csv('file.csv', index=False)
方案2:复制时直接读取原文件缓存结果
如果你的原文件file1.xlsx已经被Excel打开保存过、存在公式计算缓存,可以修改你的复制逻辑,直接读取计算结果写入新文件:
# 打开原文件时指定data_only=True,只读公式计算结果,不读公式本身 wb1 = openpyxl.load_workbook('/file1.xlsx', data_only=True) ws1 = wb1.worksheets[0] wb2 = openpyxl.load_workbook('/file2.xlsx') ws2 = wb2.active mr = ws1.max_row mc = ws1.max_column for i in range (1, mr + 1): for j in range (1, mc + 1): c = ws1.cell(row = i, column = j) ws2.cell(row = i, column = j).value = c.value wb2.save('file2.xlsx')
该方案无需依赖Excel程序,前提是原文件已存在公式计算缓存。如果原文件也是openpyxl生成的、未被Excel打开过,该方案不生效。
内容的提问来源于stack exchange,提问作者TheCrazySwede
相关产品推荐
相关产品推荐

