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

如何用openpyxl仅写入Excel指定列并保留其他列数据?

解决openpyxl写入DataFrame时保留H列及以后公式的问题

问题根源在于直接用pandas的to_excel配合openpyxl引擎时,默认逻辑会重写整个工作表(哪怕指定mode='a'也可能因批量写入逻辑覆盖原有数据)。要精准控制只操作A-G列、保留后续列的公式,得手动操作单元格而非依赖to_excel的批量写入。

具体解决步骤:

  1. 加载现有工作簿与工作表:用openpyxl直接读取目标Excel文件,绕开pandas默认的全表覆盖逻辑。
  2. 清空A-G列内容:遍历这些列的所有已使用单元格,将值设为None(仅清空内容,不删除列)。
  3. 逐行写入DataFrame数据:仅把DataFrame内容写入A-G列,完全不触碰H列及以后的单元格。
  4. 保存工作簿:直接保存修改后的文件,确保后续列的公式和数据不受影响。

代码示例:

import pandas as pd
from openpyxl import load_workbook

# 1. 加载目标Excel文件和工作表
file_path = "your_excel_file.xlsx"
wb = load_workbook(file_path)
ws = wb["Sheet1"]  # 替换为你的实际工作表名称

# 2. 清空A-G列(对应列索引1到7)
max_row = ws.max_row
for row in range(1, max_row + 1):
    for col in range(1, 8):
        ws.cell(row=row, column=col).value = None

# 3. 准备待写入的DataFrame(替换成你的实际数据)
df = pd.DataFrame({
    "ColA": [101, 102, 103],
    "ColB": ["Apple", "Banana", "Cherry"],
    "ColC": [2024, 2024, 2024],
    "ColD": [True, False, True],
    "ColE": [3.14, 2.71, 1.61],
    "ColF": ["Jan", "Feb", "Mar"],
    "ColG": [1000, 2000, 3000]
})

# 写入表头(若不需要表头可跳过此段)
for col_idx, header in enumerate(df.columns, 1):
    if col_idx <= 7:
        ws.cell(row=1, column=col_idx).value = header

# 写入数据行(从第2行开始,跳过表头行)
for row_idx, row_data in enumerate(df.values, start=2):
    for col_idx, value in enumerate(row_data, start=1):
        if col_idx <= 7:
            ws.cell(row=row_idx, column=col_idx).value = value

# 4. 保存修改后的文件
wb.save(file_path)

注意事项:

  • 若工作表存在合并单元格,需先解除合并或针对性清空合并区域内容,避免遗漏未清空的单元格。
  • 若DataFrame行数超过原工作表最大行,新增行的H列及以后不会被修改(保持空白或Excel自动填充的公式,取决于文件原有设置)。
  • 绝对避免使用df.to_excel的mode='w'模式,该模式会直接重写整个文件,导致所有原有数据丢失。

内容的提问来源于stack exchange,提问作者Prakhar Rathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:42:23