You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动