You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

代码说明

  1. 加载模板:用load_workbook直接读取模板,完全保留原文件的公式、格式,不会把公式转为NaN
  2. 写入数据:仅操作非公式列的单元格,完全不修改公式列,从根源避免破坏原有公式
  3. 保存文件:生成新文件而非直接覆盖原模板,降低数据丢失风险

补充说明

如果必须使用Pandas导出,也可以通过pd.ExcelWriter结合openpyxl引擎实现,但直接用openpyxl操作更直观,能更好地控制模板的原有内容。

内容的提问来源于stack exchange,提问作者Matias Rojas G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:10:15