在实际开发中,我们经常需要将 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、批处理等场景。