如何用Pandas在多工作表Excel中追加新工作表并保留格式?
问题与解决方案
问题描述
现有Python脚本通过Pandas读取JSON数据,生成带单元格居中格式的Excel工作表。需求是每周获取新数据后,追加为该Excel的新工作表,但遇到两个问题:
- 若读取现有Excel重新写入所有新旧数据,无法保留原单元格格式;
- 直接追加数据时,使用Pandas 2.2.3在Linux环境下运行会创建新文件,导致原有工作表丢失。
最优方案:直接追加新工作表
重新写入所有数据效率低且格式保留成本高,最优选择是调整Pandas的ExcelWriter参数,实现追加模式写入新工作表,避免覆盖原有内容。
具体实现步骤
核心修改点
使用openpyxl引擎时,设置mode='a'(追加模式),同时先判断Excel文件是否存在:
- 若文件不存在,按原逻辑创建新文件;
- 若文件已存在,以追加模式打开,添加新工作表。
修改后的完整代码
import pandas as pd import os fichero_excel_salida = 'Estad.xlsx' nombre_pagina = 'Jornada_' + str(num_jornada) # 确保num_jornada唯一,比如每周递增 count = 0 # 判断文件是否存在,决定写入模式 if os.path.exists(fichero_excel_salida): writer = pd.ExcelWriter(fichero_excel_salida, engine="openpyxl", mode="a", if_sheet_exists="error") else: writer = pd.ExcelWriter(fichero_excel_salida, engine="openpyxl") try: # 生成DataFrame并写入新工作表 for key, contenido_dict in dict_dict_excels.items(): count += 1 df = pd.DataFrame(data=contenido_dict) if count % 2 != 0: df = df.T # 应用居中格式并写入指定位置 styled_df = df.style.set_properties(**{'text-align': 'center'}) if count == 1: styled_df.to_excel(writer, sheet_name=nombre_pagina, startcol=0, startrow=1) elif count == 2: styled_df.to_excel(writer, sheet_name=nombre_pagina, startcol=0, startrow=6, header=True, index=True) elif count == 3: styled_df.to_excel(writer, sheet_name=nombre_pagina, startcol=0, startrow=11) finally: writer.close()
关键参数说明
mode="a":开启追加模式,不会覆盖原有工作表;if_sheet_exists="error":若要添加的工作表名称已存在,直接报错(也可设为"replace"替换,根据需求调整);- 保留原有的单元格居中格式逻辑,确保新工作表格式与历史一致。
注意事项
- 确保已安装
openpyxl依赖:执行pip install openpyxl; - Linux环境下需保证脚本对目标Excel文件有读写权限;
- 每次生成的
nombre_pagina必须唯一(比如用周数、日期作为后缀),避免工作表重复报错; - 若需要对原有工作表格式做修改,可结合
openpyxl直接操作Excel对象,但追加新工作表无需此步骤。
内容的提问来源于stack exchange,提问作者garvarma
相关产品推荐
相关产品推荐

