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
相关产品推荐
相关产品推荐

