使用Python的openpyxl库批量格式化Excel文件的方法

 更新时间:2026年06月22日 09:41:25   作者:小庄-Python办公  
本文介绍了使用Python的openpyxl库批量格式化Excel文件的方法,通过定义标题行样式(蓝色背景、加粗字体)、数据行样式(细边框、自动对齐)和自动调整列宽等操作,实现报表格式的自动化统一,文章提供了完整的代码实现,需要的朋友可以参考下

场景引入

公司规定所有报表必须使用统一的格式:标题行加粗、背景色蓝色、字号 12、所有单元格加边框。但每次从系统导出的数据都是"裸表"——没有任何格式。公司有 50 份这样的报表需要格式化,手动调整每份表格至少要 5 分钟,总计 4 个小时。

本节教你用 Python + openpyxl 实现 一键格式化,50 份表格只需 10 秒。

技术原理

pandas 擅长数据处理,但不擅长格式控制。本节引入 openpyxl 库,它可以直接操作 Excel 的格式属性:

格式属性openpyxl 对应
字体Font(name, size, bold, italic, color)
填充(背景色)PatternFill(start_color, fill_type)
边框Border(left, right, top, bottom)
对齐Alignment(horizontal, vertical)
列宽worksheet.column_dimensions[col].width

工作流程:

裸数据.xlsx → openpyxl 加载 → 应用格式规则 → 保存格式化后的文件

环境准备

pip install openpyxl

完整代码

import os
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

def format_excel_sheet(input_file, output_file=None):
    """
    为 Excel 文件添加统一的格式:标题行加粗、蓝色背景、边框、对齐

    参数:
        input_file: 输入的原始 Excel 文件
        output_file: 输出的格式化文件(默认在原文件名后加_已格式化)
    """
    if output_file is None:
        base_name = os.path.splitext(input_file)[0]
        output_file = f"{base_name}_已格式化.xlsx"

    # 1. 加载工作簿
    wb = load_workbook(input_file)
    ws = wb.active

    # 2. 定义样式对象
    # 标题行字体:微软雅黑,12号,加粗,白色
    title_font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')

    # 标题行背景:蓝色
    title_fill = PatternFill(start_color='4472C4', fill_type='solid')

    # 数据行字体:微软雅黑,11号
    data_font = Font(name='微软雅黑', size=11)

    # 细边框
    thin_border = Border(
        left=Side(style='thin'),
        right=Side(style='thin'),
        top=Side(style='thin'),
        bottom=Side(style='thin')
    )

    # 居中对齐
    center_align = Alignment(horizontal='center', vertical='center')

    # 左对齐(适合文本列)
    left_align = Alignment(horizontal='left', vertical='center')

    # 3. 获取数据范围
    max_row = ws.max_row
    max_col = ws.max_column

    if max_row < 1:
        print(f"警告: {input_file} 没有数据")
        return

    # 4. 格式化标题行(第一行)
    for col in range(1, max_col + 1):
        cell = ws.cell(row=1, column=col)
        cell.font = title_font
        cell.fill = title_fill
        cell.border = thin_border
        cell.alignment = center_align

    # 5. 格式化数据行(第二行到最后)
    for row in range(2, max_row + 1):
        for col in range(1, max_col + 1):
            cell = ws.cell(row=row, column=col)
            cell.font = data_font
            cell.border = thin_border
            # 文本列左对齐,数字列居中
            if isinstance(cell.value, (int, float)):
                cell.alignment = center_align
            else:
                cell.alignment = left_align

    # 6. 自动调整列宽
    for col in range(1, max_col + 1):
        max_length = 0
        column_letter = ws.cell(row=1, column=col).column_letter

        for row in range(1, max_row + 1):
            cell_value = ws.cell(row=row, column=col).value
            if cell_value:
                cell_length = len(str(cell_value))
                if cell_length > max_length:
                    max_length = cell_length

        # 设置列宽(最大 30,最小 10)
        adjusted_width = min(max(max_length + 2, 10), 30)
        ws.column_dimensions[column_letter].width = adjusted_width

    # 7. 冻结首行(滚动时标题行固定不动)
    ws.freeze_panes = 'A2'

    # 8. 保存
    wb.save(output_file)
    print(f"格式化完成: {output_file}")


# ==================== 批量格式化 ====================
def batch_format_excel_files(folder_path):
    """
    批量格式化文件夹中的所有 Excel 文件
    """
    count = 0
    for filename in os.listdir(folder_path):
        if filename.endswith('.xlsx') and '已格式化' not in filename:
            file_path = os.path.join(folder_path, filename)
            format_excel_sheet(file_path)
            count += 1
    print(f"\n批量格式化完成!共处理 {count} 个文件")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # 单个文件格式化
    # format_excel_sheet("原始数据.xlsx")

    # 批量格式化文件夹
    batch_format_excel_files(r"D:\待格式化报表")

代码逐行解析

1. 样式对象定义

openpyxl 中的样式是可复用的对象:

title_font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')

Font 参数说明:

参数说明示例值
name字体名称‘微软雅黑’, ‘Arial’, ‘宋体’
size字号11, 12, 14
bold是否加粗True / False
italic是否斜体True / False
color字体颜色(HEX 六位码)‘FFFFFF’(白色), ‘FF0000’(红色)

2. 背景色填充

title_fill = PatternFill(start_color='4472C4', fill_type='solid')
  • start_color:填充颜色(HEX 色值)
  • fill_type='solid':纯色填充

常用颜色对照:

  • 4472C4:Office 蓝色
  • C00000:红色
  • 70AD47:绿色
  • FFC000:橙色
  • E2EFDA:浅绿色

3. 边框设置

thin_border = Border(
    left=Side(style='thin'),
    right=Side(style='thin'),
    top=Side(style='thin'),
    bottom=Side(style='thin')
)

Sidestyle 可选值:'thin', 'medium', 'thick', 'double', 'dashed', 'dotted'

4. 自动列宽计算

adjusted_width = min(max(max_length + 2, 10), 30)

这段代码的逻辑:

  • max_length + 2:最长字符长度 + 2 的余量
  • max(..., 10):最小列宽为 10
  • min(..., 30):最大列宽为 30(防止个别超长文本把列拉得太宽)

5. 冻结首行

ws.freeze_panes = 'A2'

冻结 A2 单元格上方的行(即第一行),滚动数据时标题行始终可见。

进阶技巧

技巧 1:条件格式——自动高亮异常值

from openpyxl.formatting.rule import CellIsRule

# 高亮负数(红色背景)
ws.conditional_formatting.add(
    f'B2:B{max_row}',
    CellIsRule(
        operator='lessThan',
        formula=['0'],
        fill=PatternFill(start_color='FFC7CE', fill_type='solid')
    )
)

技巧 2:隔行变色(斑马纹)

light_fill = PatternFill(start_color='F2F2F2', fill_type='solid')

for row in range(2, max_row + 1):
    if row % 2 == 0:  # 偶数行
        for col in range(1, max_col + 1):
            ws.cell(row=row, column=col).fill = light_fill

技巧 3:从模板复制格式

如果公司已有标准模板,可以先复制模板再写入数据:

import shutil

shutil.copy("公司标准模板.xlsx", output_file)
wb = load_workbook(output_file)
ws = wb.active

# 此时已有模板的所有格式,只需写入数据即可
for row_idx, row_data in enumerate(data_rows, start=2):
    for col_idx, value in enumerate(row_data, start=1):
        ws.cell(row=row_idx, column=col_idx, value=value)

常见问题

Q1:保存时报错ValueError: Max value is 255

原因:openpyxl 对旧版 .xls 格式支持有限。

解决:确保文件是 .xlsx 格式。如果是 .xls,先用 Excel 另存为 .xlsx

Q2:中文显示为方框(乱码)?

原因:系统缺少对应字体。

解决:改用通用字体:

title_font = Font(name='Arial Unicode MS', size=12, bold=True)
# 或
title_font = Font(name='SimSun', size=12, bold=True)  # 宋体

Q3:如何设置行高?

# 设置第一行行高为 25
ws.row_dimensions[1].height = 25

# 批量设置所有数据行行高
for row in range(1, max_row + 1):
    ws.row_dimensions[row].height = 20

总结

格式需求openpyxl 类关键参数
字体Font()name, size, bold, color
背景色PatternFill()start_color, fill_type
边框Border() + Side()style=‘thin’/‘medium’
对齐Alignment()horizontal, vertical
列宽column_dimensions[].width数值
行高row_dimensions[].height数值
冻结窗格freeze_panes单元格地址如 ‘A2’

本节掌握了用 Python 自动控制 Excel 格式的能力。配合前两节的合并和拆分,你已经可以处理大部分 Excel 批量操作场景。

以上就是使用Python的openpyxl库批量格式化Excel文件的方法的详细内容,更多关于Python openpyxl格式化Excel文件的资料请关注脚本之家其它相关文章!

相关文章

  • selenium无法定位元素的几种解决方案

    selenium无法定位元素的几种解决方案

    这篇文章详细介绍了如何使用WebDriver解决各种定位元素和处理页面跳转、弹出窗口、元素失去焦点等问题的方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2025-02-02
  • Python学习之虚拟环境原理详解

    Python学习之虚拟环境原理详解

    本文将带大家学习一下虚拟环境的相关知识,虚拟环境对于刚刚使用Python的初学者来说使用的概率可能会比较低,但是我们依然要对它有一定的了解。快跟随小编一起学习一下吧
    2022-03-03
  • Pycharm中flask开启debug模式的详细流程

    Pycharm中flask开启debug模式的详细流程

    PyCharm是一个强大的集成开发环境(IDE),非常适合Python开发者,包括Flask框架,当你在使用Flask开发Web应用时,Debug功能是非常重要的,它允许你在运行时检查程序的状态、调试代码错误,本文将介绍Pycharm中flask开启debug模式的详细流程,需要的朋友可以参考下
    2024-08-08
  • python数据分析之DateFrame数据排序和排名方式

    python数据分析之DateFrame数据排序和排名方式

    这篇文章主要介绍了python数据分析之DateFrame数据排序和排名方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python+opencv实现目标跟踪过程

    python+opencv实现目标跟踪过程

    这篇文章主要介绍了python+opencv实现目标跟踪过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • pytorch常见的Tensor类型详解

    pytorch常见的Tensor类型详解

    今天小编就为大家分享一篇pytorch常见的Tensor类型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 在python 脚本下解析json数据

    在python 脚本下解析json数据

    这篇文章主要介绍了在python 脚本下解析json数据,json数据包括JSONObject和JSONArray,下文关于其解析的内容需要的小伙伴可以参考一下
    2022-04-04
  • python使用 toml的实现

    python使用 toml的实现

    本文将结合实例代码介绍python使用 toml的实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Python内置函数all()的实现

    Python内置函数all()的实现

    Python内置函数 all() 用于判断可迭代对象中的所有元素是否都为真值(Truthy),是逻辑判断的重要工具,下面就来具体介绍如何使用,感兴趣的可以了解一下
    2025-04-04
  • python开发的自动化运维工具ansible详解

    python开发的自动化运维工具ansible详解

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,这篇文章主要介绍了python开发的自动化运维工具ansible详解,需要的朋友可以参考下
    2021-08-08

最新评论