Python使用Tkinter+openpyxl处理Excel文件并显示实时进度条

 更新时间:2026年01月05日 08:54:13   作者:weixin_46244623  
在项目开发或数据处理中,经常需要批量处理 Excel 文件,本文将分析如何使用 openpyxl 正确处理合并单元格并将单元格转为字符串,同时结合 Tkinter 实现带进度条的图形界面实时显示处理进度,感兴趣的小伙伴可以了解下

在项目开发或数据处理中,经常需要批量处理 Excel 文件,例如将所有单元格的值强制转换为字符串(特别是处理合并单元格时,避免读取到 None)。如果文件行数较多,处理时间较长,用户很容易误以为程序卡死。这时,添加一个实时进度条就能极大提升用户体验。

本文分享一个完整示例:使用 openpyxl 正确处理合并单元格并将单元格转为字符串,同时结合 Tkinter 实现带进度条的图形界面,实时显示处理进度、当前工作表和已处理行数。

环境准备

pip install openpyxl

Tkinter 是 Python 标准库,无需额外安装。

完整代码

import tkinter as tk
from tkinter import ttk
import openpyxl

def update_progress(progress_var, processed, total):
    """更新进度条百分比"""
    if total > 0:
        progress = (processed / total) * 100
        progress_var.set(progress)

def process_sheet(sheet, progress_var, root, progress_label, accumulated_rows, total_all_rows):
    """
    处理单个工作表
    正确处理合并单元格,将所有单元格值转换为字符串
    """
    current_processed = 0  # 当前工作表已处理行数

    for row in sheet.iter_rows():
        for cell in row:
            # 判断是否在合并单元格内
            if cell.coordinate in sheet.merged_cells:
                # 查找对应的合并区域,取出左上角单元格的值
                for merged_range in sheet.merged_cells.ranges:
                    if cell.coordinate in merged_range:
                        top_left = sheet.cell(merged_range.min_row, merged_range.min_col)
                        value = top_left.value
                        break
            else:
                value = cell.value

            # 统一转为字符串,None 转为空字符串
            cell.value = str(value) if value is not None else ''

        current_processed += 1
        total_processed = accumulated_rows + current_processed

        # 更新进度条和文字
        update_progress(progress_var, total_processed, total_all_rows)
        progress_label.config(
            text=f"正在处理工作表:{sheet.title}  "
                 f"进度:{progress_var.get():.2f}%  "
                 f"已处理行数:{total_processed}/{total_all_rows}"
        )
        root.update_idletasks()  # 强制刷新界面

    return accumulated_rows + current_processed

if __name__ == "__main__":
    # 请修改为你的实际 Excel 文件路径
    file_path = "output_file.xlsx"

    workbook = openpyxl.load_workbook(file_path)

    # 计算所有工作表的总行数,用于整体进度显示
    total_all_rows = sum(sheet.max_row for sheet in workbook.worksheets)

    # 创建主窗口
    root = tk.Tk()
    root.title("Excel 单元格转字符串工具(带进度条)")
    root.geometry("600x200")
    root.resizable(False, False)

    # 进度变量
    progress_var = tk.DoubleVar(value=0)

    # 标题
    title_label = tk.Label(root, text="正在处理 Excel 文件,请稍候...", font=("微软雅黑", 12))
    title_label.pack(pady=20)

    # 进度条
    progress_bar = ttk.Progressbar(root, mode="determinate", variable=progress_var, maximum=100)
    progress_bar.pack(padx=50, pady=10, fill=tk.X)

    # 进度文字
    progress_label = tk.Label(root, text="进度:0.00%  已处理行数:0/0", font=("微软雅黑", 10))
    progress_label.pack(pady=5)

    accumulated_rows = 0  # 已累计处理行数

    # 逐个处理工作表
    for sheet_name in workbook.sheetnames:
        sheet = workbook[sheet_name]
        accumulated_rows = process_sheet(
            sheet, progress_var, root, progress_label, accumulated_rows, total_all_rows
        )

    # 处理完成
    progress_var.set(100)
    title_label.config(text="所有工作表处理完成!")
    progress_label.config(text=f"处理完成!100.00%  总计处理行数:{total_all_rows}/{total_all_rows}")

    # 保存文件
    workbook.save(file_path)
    print(f"处理完成,文件已保存:{file_path}")

    # 保持窗口打开,直到用户手动关闭
    root.mainloop()

核心功能详解

合并单元格正确处理:合并区域内除左上角外的单元格读取时会返回 None,代码通过遍历 merged_cells.ranges 找到对应区域的左上角值,确保数据不丢失。

实时进度条:每处理完一行就调用 root.update_idletasks() 强制刷新界面,让进度条和文字实时更新,视觉反馈流畅。

多工作表整体进度:预先统计所有 sheet 的总行数,实现整个文件的统一进度显示,同时显示当前正在处理的工作表名称。

使用注意事项

  • 对于超大 Excel 文件(数十万行),每行都刷新界面可能会略微影响性能。可改为每 10 行或 50 行更新一次。
  • 处理前建议备份原文件,以防万一。
  • 本例将所有值强制转为字符串(包括数字、日期等),如有特殊需求可自行调整转换逻辑。

总结

通过 Tkinteropenpyxl 的结合,我们轻松实现了一个带图形化进度条的 Excel 处理工具,用户体验友好,代码清晰易扩展。后续还可以加入文件选择对话框、日志输出、错误处理等功能。

到此这篇关于Python使用Tkinter+openpyxl处理Excel文件并显示实时进度条的文章就介绍到这了,更多相关Python处理Excel文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 中开发pattern的string模板(template) 实例详解

    Python 中开发pattern的string模板(template) 实例详解

    这篇文章主要介绍了Python 中开发pattern的string模板(template) 实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • python修改文件内容的3种方法详解

    python修改文件内容的3种方法详解

    这篇文章主要介绍了python修改文件内容的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python 同时读取多个文件的例子

    python 同时读取多个文件的例子

    今天小编就为大家分享一篇python 同时读取多个文件的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 如何在python中处理配置文件代码实例

    如何在python中处理配置文件代码实例

    这篇文章主要介绍了如何在python中处理配置文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • PyQt5实现五子棋游戏(人机对弈)

    PyQt5实现五子棋游戏(人机对弈)

    这篇文章主要为大家详细介绍了PyQt5实现五子棋游戏,人机对弈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解numpy.meshgrid()方法使用

    详解numpy.meshgrid()方法使用

    这篇文章主要介绍了详解numpy.meshgrid()方法使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python web框架 django wsgi原理解析

    python web框架 django wsgi原理解析

    这篇文章主要介绍了python web框架 django wsgi原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-08-08
  • python中tkinter窗口位置\坐标\大小等实现示例

    python中tkinter窗口位置\坐标\大小等实现示例

    这篇文章主要介绍了python中tkinter窗口位置\坐标\大小等实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python中的int32与int64区别及说明

    Python中的int32与int64区别及说明

    本文介绍了Python原生int为动态精度类型,无固定位宽;NumPy的int32、int64为定长整数,分别占用4字节和8字节,适用于不同内存和性能场景,在数组和科学计算中更高效
    2025-10-10
  • python读取文件列表并排序的实现示例

    python读取文件列表并排序的实现示例

    本文主要介绍了python读取文件列表并排序的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论