使用 Python + Tkinter + openpyxl 实现 Excel 文本化转换

在实际开发中,我们经常需要将 Excel 中的所有数据转换为字符串格式,尤其是处理包含 合并单元格 的复杂表格时。如果处理的数据量较大,程序运行会比较慢,这时若能看到实时进度条,就能更直观地了解处理进度。

本文将介绍一个使用 Python + Tkinter + openpyxl 开发的小工具,实现以下功能:

✅ 将 Excel 中所有单元格内容转换为文本

✅ 自动处理合并单元格(取合并区左上角的值)

✅ Tkinter GUI 显示实时进度条

✅ 显示处理行数及百分比

✅ 批量处理多个 Sheet

非常适合 Excel 批处理、数据清洗、自动化办公开发者。


🧩实现效果

程序运行时会弹出一个包含进度条的窗口:

  • 每处理一行数据会实时更新进度条

  • 显示百分比

  • 显示已处理的行数

  • 整个文件转换完成后,自动保存回原文件

📌完整代码(含详细中文注释)

复制代码
import tkinter as tk
from tkinter import ttk
import openpyxl

def update_progress(progress_var, total_rows_processed, total_rows):
    """
    更新进度条百分比
    progress_var: Tkinter 进度变量
    total_rows_processed: 已处理行数
    total_rows: 总行数
    """
    progress = total_rows_processed / total_rows * 100
    progress_var.set(progress)

def process_sheet(sheet, progress_var, root, progress_label):
    """
    处理单个 Sheet,将所有单元格转为字符串格式,
    并处理合并单元格的值获取。

    sheet: 要处理的工作表
    progress_var: Tkinter 进度变量
    root: Tkinter 主窗口(用于刷新界面)
    progress_label: 进度文本标签
    """

    total_rows_processed = 0          # 已处理行数
    total_rows = sheet.max_row       # 当前 sheet 的行数

    # 遍历所有行
    for row in sheet.iter_rows():
        # 遍历行内所有单元格
        for cell in row:
            # 判断单元格是否属于合并单元格
            if cell.coordinate in sheet.merged_cells:
                # 获取该单元格所属合并区域
                merged_range = sheet.merged_cells[cell.coordinate]
                # 获取合并单元格左上角坐标
                top_left_cell = merged_range.min_row, merged_range.min_col
                # 取左上角单元格的值
                value = sheet.cell(*top_left_cell).value
            else:
                # 非合并单元格直接取值
                value = cell.value

            # 将单元格内容强制转换为字符串
            cell.value = str(value)

        # 该行处理完成
        total_rows_processed += 1

        # 更新进度条显示
        update_progress(progress_var, total_rows_processed, total_rows)
        progress_label.config(
            text=f"Progress: {progress_var.get():.2f}%, Rows Processed: {total_rows_processed}/{total_rows}"
        )
        root.update_idletasks()  # 强制刷新界面

if __name__ == "__main__":

    file_path = "output_file.xlsx"  # Excel 文件路径
    workbook = openpyxl.load_workbook(file_path)

    # 创建 Tkinter GUI 窗口
    root = tk.Tk()
    root.title("Excel 文本化转换(含进度条)")
    root.geometry("500x300")

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

    # 进度条控件
    progress_bar = ttk.Progressbar(root, mode="determinate",
                                   variable=progress_var, maximum=100)
    progress_bar.pack(pady=10)

    # 显示文本的标签
    progress_label = tk.Label(root, text="Progress: 0.00%, Rows Processed: 0")
    progress_label.pack(pady=5)

    total_rows_processed = 0  # 总计处理行数

    # 遍历所有 Sheet 逐一处理
    for sheet_name in workbook.sheetnames:
        sheet = workbook[sheet_name]
        total_rows = sheet.max_row
        process_sheet(sheet, progress_var, root, progress_label)
        total_rows_processed += total_rows

    # 所有 Sheet 处理完毕,显示 100%
    update_progress(progress_var, total_rows_processed, total_rows_processed)
    progress_label.config(
        text=f"Progress: 100.00%, Rows Processed: {total_rows_processed}/{total_rows_processed}"
    )
    root.update_idletasks()

    # 保存修改
    workbook.save(file_path)

    # 显示完成界面
    root.mainloop()

📒代码讲解

✔ 1. 处理合并单元格

openpyxl 中判断单元格是否属于合并区域可以直接这样写:

复制代码
if cell.coordinate in sheet.merged_cells:

获取合并区域左上角单元格:

复制代码
merged_range = sheet.merged_cells[cell.coordinate] top_left_cell = merged_range.min_row, merged_range.min_col value = sheet.cell(*top_left_cell).value

✔ 2. Tkinter 实现进度条与刷新界面

核心调用:

复制代码
root.update_idletasks()

能保证界面实时更新,否则 Tkinter 会卡住直到任务完成才渲染 UI。


✔ 3. 将所有单元格转换为字符串

非常简单:

复制代码
cell.value = str(value)

🎯总结

本文介绍了如何通过 Python、Tkinter 和 openpyxl:

  • 批量处理 Excel 文件

  • 自动识别并处理合并单元格

  • 转换所有内容为字符串

  • 实时显示处理进度

适用于数据清洗、办公自动化、ETL、批处理等场景。

相关推荐
VidDown4 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频6 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林6 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li8 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook8 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
顽疲8 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
康小旺8 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
启观川9 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦9 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python