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

Python XlsxWriter重复写入同一文件致数据覆盖的解决求助

解决Excel两次写入覆盖问题的方案

你的问题核心在于:每次调用函数时,pd.ExcelWriter搭配xlsxwriter引擎默认是创建新文件,第二次调用会直接覆盖第一次生成的文件,导致仅保留最后一次的写入内容。要实现两次写入内容合并保存,可通过以下两种方式解决:


方法一:合并数据后一次性写入(推荐)

如果可以将两次要写入的数据提前合并,直接调用一次函数完成写入,这是最高效的方式。比如:

  • 收集两次的字典数据,调整对应的start_row(第一次从1开始,第二次的start_row设为第一次写入结束后的行号+间隔spaces)
  • 合并成一个统一的处理流程,避免多次打开文件

方法二:改用openpyxl引擎实现追加写入(适合必须分两次调用的场景)

xlsxwriter不支持修改已存在的Excel文件,需切换到openpyxl引擎,以追加模式打开文件,实现内容叠加。修改后的函数代码如下:

import os
import openpyxl
import pandas as pd

def print_multiple_dfs(dictionary, sheets, file_name, spaces, start_row):
    file_exists = os.path.isfile(file_name)
    
    # 根据文件是否存在,初始化ExcelWriter
    if file_exists:
        # 加载已有工作簿,以追加模式打开
        book = openpyxl.load_workbook(file_name)
        writer = pd.ExcelWriter(
            file_name, 
            engine='openpyxl', 
            mode='a', 
            if_sheet_exists='overlay'
        )
        writer.book = book
    else:
        # 文件不存在时创建新文件
        writer = pd.ExcelWriter(file_name, engine='openpyxl')
    
    row = start_row
    for key, dataframe in dictionary.items():
        # 写入数据到指定位置
        dataframe.to_excel(writer, sheet_name=sheets, startrow=row, startcol=1, index=False)
        worksheet = writer.sheets[sheets]
        total_row_index = row + len(dataframe.index) - 1
        # 注意:xlsxwriter和openpyxl的write_formula均为0-based行列索引,Excel公式里的行号是1-based
        worksheet.write_formula(
            total_row_index, 7, 
            f'=-sum(H{row + 2}:H{total_row_index + 1})'
        )
    
    writer.close()

关键修改说明:

  • 使用openpyxl引擎替代xlsxwriter,支持读写已存在的Excel文件
  • 开启mode='a'追加模式,if_sheet_exists='overlay'确保在已有工作表上覆盖指定区域(而非新建工作表)
  • 文件存在时先加载原有工作簿,保证之前的内容不被清空

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:55:19