Pandas读取Excel模板公式为NaN,如何保留公式并写入数据?
解决Pandas读写Excel模板时保留公式的问题
问题概述
手里有两个Excel文件:一个带公式列的模板,一个数据文件。用Pandas将两者读为DataFrame后,想要把数据写入模板,但遇到以下问题:
- 读取模板时,公式单元格被识别为
NaN - 手动通过代码给单元格赋值公式字符串后,Excel中公式单元格为空,甚至报错清除内容
核心需求:将数据写入模板,同时保留原模板的公式单元格不被改动
问题根源
- Pandas的
pd.read_excel()默认仅读取单元格的计算结果,不会解析并保留公式本身,因此公式单元格会被识别为NaN - 直接给DataFrame单元格赋值公式字符串,Pandas导出Excel时不会按照Excel的公式规则处理,导致Excel无法识别这些字符串为有效公式
解决方案:使用openpyxl直接操作Excel模板
openpyxl是专门处理Excel文件的库,能直接读取和保留原模板的公式、格式,还能精准写入数据而不破坏原有内容。
修改后的代码
import pandas as pd from openpyxl import load_workbook # 读取数据文件 df_SII = pd.read_excel(f"{year}-{month}-{day}0815.xlsx") # 加载Excel模板(完整保留原公式、格式) wb = load_workbook('Template.xlsx') ws = wb['SII.'] # 指定目标工作表 # 遍历数据,写入模板的对应单元格(跳过第1列的公式列) for row_idx, data_row in df_SII.iterrows(): # Excel行号从1开始,假设模板第1行是表头,数据从第2行开始写入 excel_row_num = row_idx + 2 # 数据写入从第2列开始(第1列为公式列,不触碰) for col_idx, value in enumerate(data_row): ws.cell(row=excel_row_num, column=col_idx + 2, value=value) # 保存修改后的模板(建议存为新文件,避免覆盖原模板) wb.save(f"Updated_{year}-{month}-{day}_Template.xlsx")
代码说明
- 加载模板:用
load_workbook直接读取模板,完全保留原文件的公式、格式,不会把公式转为NaN - 写入数据:仅操作非公式列的单元格,完全不修改公式列,从根源避免破坏原有公式
- 保存文件:生成新文件而非直接覆盖原模板,降低数据丢失风险
补充说明
如果必须使用Pandas导出,也可以通过pd.ExcelWriter结合openpyxl引擎实现,但直接用openpyxl操作更直观,能更好地控制模板的原有内容。
内容的提问来源于stack exchange,提问作者Matias Rojas G
相关产品推荐
相关产品推荐

