Python合并多Excel工作表:如何保留表头与边框格式?
Excel多工作表合并后格式保留方案
嘿,我来帮你搞定Excel合并后格式丢失的问题~针对你的两个疑问,我给你详细拆解解决方案:
问题1:能否读取源工作表的格式并写入汇总表?
Pandas本身专注于数据处理,不支持直接读取和保留Excel的格式信息(比如表头样式、边框、单元格填充这些)。但可以借助更底层的Excel操作库,比如openpyxl(针对.xlsx格式)来实现——它能读取源工作表中每个单元格的格式(字体、边框、填充、对齐方式等),然后复制到汇总表对应位置。
不过这个过程会相对繁琐,因为需要遍历源表的单元格去提取样式,再逐个应用到汇总表。如果你的源表格式复杂(比如不同单元格有特殊样式),可以用这种方式;如果只是需要统一格式,更推荐问题2的方案。
举个简单的示例,读取源表表头样式并应用到汇总表:
import pandas as pd from openpyxl import load_workbook xls_file = "你的源文件路径.xlsx" final_file = "你的汇总文件路径.xlsx" sheet_names = ['Sheet1', 'Sheet2','Sheet3'] # 先完成数据合并(保留表头) header_df = pd.read_excel(xls_file, sheet_name=sheet_names[0], nrows=1) header = header_df.columns.tolist() df_list = [] for name in sheet_names: data = pd.read_excel(xls_file, sheet_name=name, header=None, skiprows=1) df_list.append(data) combined_df = pd.concat(df_list, ignore_index=True) combined_df.to_excel(final_file, index=False, header=header) # 读取源表的表头样式 source_wb = load_workbook(xls_file) source_ws = source_wb[sheet_names[0]] header_styles = {} for cell in source_ws[1]: header_styles[cell.column_letter] = { "font": cell.font, "fill": cell.fill, "border": cell.border, "alignment": cell.alignment } # 将源表头样式应用到汇总表 summary_wb = load_workbook(final_file) summary_ws = summary_wb.active for col_letter in header_styles: target_cell = summary_ws[f"{col_letter}1"] target_cell.font = header_styles[col_letter]["font"] target_cell.fill = header_styles[col_letter]["fill"] target_cell.border = header_styles[col_letter]["border"] target_cell.alignment = header_styles[col_letter]["alignment"] summary_wb.save(final_file)
如果要保留源表所有数据单元格的格式,需要遍历源表的每一行每一列,记录每个单元格的样式,再对应到汇总表的位置——数据量大时会比较耗时,按需使用即可。
问题2:合并后如何设置格式?
如果不需要完全复刻源表格式,而是想给汇总表设置统一的美观格式,用openpyxl直接操作合并后的Excel文件是更高效的选择。下面是完整的代码示例,包含数据合并+格式设置(表头加粗、填充、边框,数据区域边框,自动列宽):
import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, Border, Side, Alignment, PatternFill # 配置文件路径和工作表名 xls_file = "你的源文件路径.xlsx" sheet_names = ['Sheet1', 'Sheet2','Sheet3'] final_file = "你的汇总文件路径.xlsx" # 1. 合并数据(包含表头) # 读取第一个工作表的表头 header_df = pd.read_excel(xls_file, sheet_name=sheet_names[0], nrows=1) header = header_df.columns.tolist() # 读取所有工作表的数据(跳过表头行) df_list = [] for name in sheet_names: data = pd.read_excel(xls_file, sheet_name=name, header=None, skiprows=1) df_list.append(data) # 合并所有数据 combined_df = pd.concat(df_list, ignore_index=True) # 写入汇总文件,包含表头 combined_df.to_excel(final_file, index=False, header=header) # 2. 设置汇总表格式 wb = load_workbook(final_file) ws = wb.active # 定义样式 # 表头样式:加粗白色字体、蓝色填充、居中对齐、细边框 header_font = Font(bold=True, color="FFFFFF") header_fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type="solid") thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) header_alignment = Alignment(horizontal="center", vertical="center") # 应用表头样式 for cell in ws[1]: cell.font = header_font cell.fill = header_fill cell.border = thin_border cell.alignment = header_alignment # 应用数据区域样式:细边框、左对齐 data_alignment = Alignment(horizontal="left") for row in ws.iter_rows(min_row=2): for cell in row: cell.border = thin_border cell.alignment = data_alignment # 自动调整列宽(适配内容长度) for col in ws.columns: max_length = 0 column_letter = col[0].column_letter for cell in col: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass # 增加一点余量,让列宽更美观 ws.column_dimensions[column_letter].width = (max_length + 2) * 1.2 # 保存格式设置后的文件 wb.save(final_file)
这段代码会生成一个样式整洁的汇总表:表头醒目,数据区域有统一边框,列宽自动适配内容,完全解决你当前格式丢失的问题。
内容的提问来源于stack exchange,提问作者Balveer Singh




