python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python批量更改Excel数据格式

Python批量实现更改Excel中多个工作簿的数据格式

作者:杨利杰YJlio

本文介绍了使用Python批量处理多个Excel工作簿数据格式的方法,通过自遍历文件夹、动态获取数据末行与设置number_format,实现多个工作簿的格式统一,提升报表专业度与汇总效率

1. 问题背景:为什么要批量更改多个工作簿的数据格式

本文主题是:批量更改多个工作簿的数据格式。这类需求在真实办公场景里很常见,尤其是多个部门、多个区域、多个项目分别提交 Excel 报表时,数据内容可能是对的,但显示格式经常不统一。

比如日期列里有的显示为 2026/1/1,有的显示为 2026-01-01,还有的显示为 1 Jan 2026;金额列里有的没有千分位,有的保留一位小数,有的又带货币符号;百分比列里有的显示为 0.1234,有的显示为 12.34%。这些问题单看一个文件不严重,但如果几十个工作簿都这样,后续汇总、审核和展示都会很难看。

推荐做法是:把这种“格式规则明确、处理文件数量多、人工统一成本高”的工作交给 Python 批量处理。人负责确定格式标准,脚本负责逐个打开工作簿、定位数据区域、设置显示格式、保存结果。

这张图展示的是本文的整体目标:用 Python + Excel 自动化,将多个工作簿中的日期、金额、百分比等数据格式一次性统一。

从图中可以看出,本文关注的不是单个单元格的手动格式调整,而是批量处理多个工作簿的数据格式标准化。这也是办公自动化真正有价值的地方:不是替代一次点击,而是把大量重复点击变成稳定规则。

2. 应用场景:哪些格式问题适合用 Python 批量处理

这个案例适合处理三类典型问题:日期格式统一、金额格式统一、百分比格式统一。只要这些列的位置相对固定,或者可以通过表头定位,就可以通过脚本批量设置显示格式。

在公司报表里,数据格式不统一经常不是因为员工不会填,而是来源系统不同、复制粘贴习惯不同、Excel 自动识别规则不同。最后造成一个结果:表面上都是“日期”“金额”“百分比”,实际展示出来却很混乱。

这里要先明确一个边界:number_format 主要控制的是 Excel 的显示格式,它不等于数据清洗。也就是说,如果一个单元格本质上是文本,单纯设置 number_format 不一定能把它变成真正的日期或数字。

这张图展示的是批量统一数据格式的应用场景,包括日期格式、金额格式、百分比格式,以及多个报表工作簿的批量处理。

从图中可以看出,批量改格式适合解决“显示不统一”的问题。比如把 2026/1/1 统一显示为 2026-01-01,把 1234567 统一显示为 1,234,567.00,把 0.1234 统一显示为 12.34%。这些处理能明显提升报表规范性,也能减少人工校对成本。

3. 核心原理:动态找末行,再设置 number_format

这一节的核心不是“给某个单元格设置格式”,而是对多个工作簿中的指定数据区域批量设置格式。所以代码要解决两个关键问题:第一,怎么找到每个文件的数据区域;第二,怎么给不同列设置不同的显示格式。

核心思路可以拆成四步:先遍历目标文件夹,找到所有需要处理的 Excel 文件;再打开每个工作簿并定位目标工作表;然后通过 current_region.last_cell.row 动态获取数据末行;最后对日期列、金额列、百分比列分别设置 number_format 并保存。

这张图展示的是批量更改多个工作簿数据格式的核心流程:读取文件、定位工作表、动态获取末行、设置格式并保存。

从图中可以看出,流程里最关键的一步是动态获取末行。如果把范围写死为 A2:A10000,短表会处理多余空白,长表又可能漏数据。用动态末行可以让脚本适应不同工作簿的数据量。

4. 实现代码:批量更改日期、金额、百分比格式

下面这份代码假设第 1 行是表头,A 列是日期,B 列是金额,C 列是百分比。脚本会从目标文件夹中遍历所有 Excel 文件,并批量设置这三列的数据格式。

import os
import xlwings as xw

# ====== 需要根据实际情况修改的参数 ======
folder_path = r"e:\file\target"   # 多个 Excel 文件所在文件夹
sheet_name = "Sheet1"             # 需要处理的工作表名称
# ======================================

app = xw.App(visible=False, add_book=False)

try:
    for file in os.listdir(folder_path):

        # 跳过 Excel 临时文件
        if file.startswith("~$"):
            continue

        # 只处理 Excel 文件
        if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
            continue

        full_path = os.path.join(folder_path, file)
        wb = None

        try:
            wb = app.books.open(full_path)

            # 如果目标工作表不存在,则跳过当前文件
            sheet_names = [s.name for s in wb.sheets]
            if sheet_name not in sheet_names:
                print(f"跳过:{file},不存在工作表:{sheet_name}")
                continue

            sht = wb.sheets[sheet_name]

            # 动态获取末行:以 A1 为起点识别连续数据区域
            last_row = sht.range("A1").current_region.last_cell.row

            # 如果只有表头,没有数据,则跳过
            if last_row < 2:
                print(f"跳过:{file},没有有效数据")
                continue

            # 构造动态区域
            rng_date = sht.range(f"A2:A{last_row}")
            rng_amount = sht.range(f"B2:B{last_row}")
            rng_rate = sht.range(f"C2:C{last_row}")

            # 设置显示格式
            rng_date.number_format = "yyyy-mm-dd"
            rng_amount.number_format = "#,##0.00"
            rng_rate.number_format = "0.00%"

            wb.save()
            print(f"已更改数据格式:{file},末行:{last_row}")

        finally:
            if wb is not None:
                wb.close()

finally:
    app.quit()

这份脚本比最简单版本多了几个保护动作:跳过 ~$ 临时文件、判断工作表是否存在、判断是否有有效数据、用 try/finally 确保工作簿关闭。这些细节看起来不显眼,但对批量处理非常重要。

如果是正式处理业务文件,建议先复制一份测试目录,再运行脚本。格式类操作虽然一般不会删除数据,但一旦批量改错,返工也很麻烦。

5. 关键代码逻辑:current_region、last_row 与 number_format

这段代码最关键的不是 for 循环,而是下面这句:

last_row = sht.range("A1").current_region.last_cell.row

它的含义是:从 A1 出发,识别当前连续数据区域,然后取这个区域最后一个单元格所在的行号。这样就可以得到当前工作表的实际数据末行。

有了 last_row 之后,就能动态构造区域:

rng_date = sht.range(f"A2:A{last_row}")
rng_amount = sht.range(f"B2:B{last_row}")
rng_rate = sht.range(f"C2:C{last_row}")

最后再分别设置显示格式:

rng_date.number_format = "yyyy-mm-dd"
rng_amount.number_format = "#,##0.00"
rng_rate.number_format = "0.00%"

这张图展示的是关键代码逻辑:动态找末行、设置 number_format,并强调格式设置只影响显示,不直接改变底层数值。

从图中可以看出,number_format 的价值在于统一显示规则。日期列显示为 yyyy-mm-dd,金额列显示为 #,##0.00,百分比列显示为 0.00%。但这里必须记住:number_format 不是万能的数据转换工具,它主要控制显示格式,不负责把文本彻底清洗成真实日期或真实数字。

6. 操作步骤:先小范围验证,再批量执行

这类脚本不要一上来就直接跑正式目录。更稳的做法是先准备 2 到 3 个测试工作簿,确认格式效果正确,再扩大到完整文件夹。

第一步,确认目标文件夹。把需要处理的 Excel 文件放在同一个目录中,避免混入无关文件。对于 Excel 自动生成的临时文件,脚本中已经用 file.startswith("~$") 跳过。

第二步,确认目标工作表名称。示例代码里使用的是 Sheet1,实际工作中可能是 销售明细数据表报表。名称不一致时,脚本会跳过该文件。

第三步,确认列规则。示例中默认 A 列是日期、B 列是金额、C 列是百分比。如果你的表结构不同,必须修改对应列区域,不能机械照抄。

第四步,小范围运行并检查结果。重点看日期、金额、百分比是否显示正确,是否存在文本无法格式化的问题。

我的建议是:批量处理前先打印文件名和末行,确认脚本识别的目标范围是否符合预期。

print(f"当前文件:{file}")
print(f"识别到的数据末行:{last_row}")

日志越清楚,排错越省时间。尤其是处理多个工作簿时,一旦某个文件结构异常,日志可以快速告诉你问题发生在哪一个文件。

7. 知识延伸:批量设置外观格式

数据格式统一只是第一步。很多公司报表还要求表头加粗、居中、底色统一、正文自动换行、边框规范。对于这类外观格式,xlwings 也可以通过 .api 调用 Excel 的底层属性。

# 假设已经获取 sht 和 last_row

# 1. 设置表头格式
header_rng = sht.range("A1:C1")
header_rng.api.Font.Bold = True
header_rng.api.HorizontalAlignment = -4108   # 居中
header_rng.api.VerticalAlignment = -4108     # 垂直居中
header_rng.color = (217, 217, 217)           # 浅灰色底色

# 2. 设置正文格式
body_rng = sht.range(f"A2:C{last_row}")
body_rng.api.Font.Name = "微软雅黑"
body_rng.api.Font.Size = 10
body_rng.api.HorizontalAlignment = -4131     # 左对齐
body_rng.api.WrapText = True                 # 自动换行

# 3. 设置边框
body_rng.api.Borders.Weight = 2

.api 的作用可以理解为:直接调用 Excel COM 对象的能力。它比普通属性更底层,也更接近 Excel 原生功能,适合处理字体、边框、对齐、颜色这类外观细节。

但要注意:外观格式越复杂,脚本越容易和不同电脑上的 Excel 环境、字体环境、区域设置产生差异。正式批量处理前,最好先在几台典型电脑上验证效果。

8. 常见问题:批量改格式前后必须检查

批量改格式最容易让人误判。很多时候脚本没有报错,但结果并不一定符合预期。尤其是 current_region、文本日期、文本数字这些问题,如果不提前理解,后面会踩坑。

这张图展示的是批量改格式前后最需要检查的几个点:跳过临时文件、检查空行、确认真实数据类型、验证最终结果。

从图中可以看出,~$ 开头的 Excel 临时文件要跳过;如果数据区域中间有整行空行,current_region 可能提前结束;如果日期和数字本质上是文本,单纯设置 number_format 可能只改变显示规则,不能完成真实数据类型转换。

最危险的误区是:看到单元格“长得像日期”或者“长得像数字”,就以为它已经是真实日期或真实数字。Excel 里显示像,不代表类型对。后续如果要参与公式计算或汇总统计,就必须进一步确认数据类型。

如果怀疑某一列是文本数字,可以先通过 Excel 现象判断:单元格左上角是否有绿色提示,求和结果是否异常,排序是否按文本顺序排列。也可以在脚本里加入更严格的数据清洗逻辑,但那已经超出单纯 number_format 的范围。

9. 效果验证:用脚本检查格式是否生效

批量处理之后,建议至少抽查几个文件。更稳一点的做法,是写一个验证脚本,把目标区域的 number_format 打印出来,确认格式是否真的写入。

import os
import xlwings as xw

folder_path = r"e:\file\target"
sheet_name = "Sheet1"

app = xw.App(visible=False, add_book=False)

try:
    for file in os.listdir(folder_path):

        if file.startswith("~$"):
            continue

        if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
            continue

        full_path = os.path.join(folder_path, file)
        wb = None

        try:
            wb = app.books.open(full_path)

            if sheet_name not in [s.name for s in wb.sheets]:
                print(f"跳过:{file},不存在工作表:{sheet_name}")
                continue

            sht = wb.sheets[sheet_name]

            print(f"文件:{file}")
            print("A2 日期格式:", sht.range("A2").number_format)
            print("B2 金额格式:", sht.range("B2").number_format)
            print("C2 百分比格式:", sht.range("C2").number_format)
            print("-" * 40)

        finally:
            if wb is not None:
                wb.close()

finally:
    app.quit()

这个验证脚本不修改文件,只读取格式结果。对于批量处理任务来说,验证脚本和处理脚本一样重要。只会批量执行,不会验证结果,自动化就还不够可靠。

10. 总结提升:格式统一背后是报表标准化能力

这一节表面上是在学习 number_format,实际是在训练一种很重要的办公自动化能力:批量统一多个工作簿的报表标准。这类能力在真实办公里很有用,因为很多报表问题不是数据本身错,而是格式混乱导致阅读、汇总和审核成本变高。

这一节我重点掌握了四个点:用 os.listdir() 遍历文件夹;用 current_region.last_cell.row 动态获取末行;用 number_format 设置日期、金额、百分比显示格式;最后通过验证脚本检查格式是否真正生效。

不要把“格式统一”看成简单美化。在正式报表里,格式规范就是数据质量的一部分。日期格式不统一、金额显示不规范、百分比小数位混乱,都会影响别人对报表专业度的判断。

我对这一节的理解是:Python 做 Excel 自动化,不只是为了少点几下鼠标,更重要的是把报表处理规则固化下来。只要规则稳定,脚本就能重复执行;只要脚本可验证,这套流程就能沉淀成真正可复用的办公工具。

以上就是Python批量实现更改Excel中多个工作簿的数据格式的详细内容,更多关于Python批量更改Excel数据格式的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文