使用Python + Tkinter + openpyxl實現(xiàn)Excel文本化轉(zhuǎn)換
在實際開發(fā)中,我們經(jīng)常需要將 Excel 中的所有數(shù)據(jù)轉(zhuǎn)換為字符串格式,尤其是處理包含 合并單元格 的復(fù)雜表格時。如果處理的數(shù)據(jù)量較大,程序運行會比較慢,這時若能看到實時進(jìn)度條,就能更直觀地了解處理進(jìn)度。
本文將介紹一個使用 Python + Tkinter + openpyxl 開發(fā)的小工具,實現(xiàn)以下功能:
- 將 Excel 中所有單元格內(nèi)容轉(zhuǎn)換為文本
- 自動處理合并單元格(取合并區(qū)左上角的值)
- Tkinter GUI 顯示實時進(jìn)度條
- 顯示處理行數(shù)及百分比
- 批量處理多個 Sheet
非常適合 Excel 批處理、數(shù)據(jù)清洗、自動化辦公開發(fā)者。
實現(xiàn)效果
程序運行時會彈出一個包含進(jìn)度條的窗口:
- 每處理一行數(shù)據(jù)會實時更新進(jìn)度條
- 顯示百分比
- 顯示已處理的行數(shù)
- 整個文件轉(zhuǎn)換完成后,自動保存回原文件
完整代碼(含詳細(xì)中文注釋)
import tkinter as tk
from tkinter import ttk
import openpyxl
def update_progress(progress_var, total_rows_processed, total_rows):
"""
更新進(jìn)度條百分比
progress_var: Tkinter 進(jìn)度變量
total_rows_processed: 已處理行數(shù)
total_rows: 總行數(shù)
"""
progress = total_rows_processed / total_rows * 100
progress_var.set(progress)
def process_sheet(sheet, progress_var, root, progress_label):
"""
處理單個 Sheet,將所有單元格轉(zhuǎn)為字符串格式,
并處理合并單元格的值獲取。
sheet: 要處理的工作表
progress_var: Tkinter 進(jìn)度變量
root: Tkinter 主窗口(用于刷新界面)
progress_label: 進(jìn)度文本標(biāo)簽
"""
total_rows_processed = 0 # 已處理行數(shù)
total_rows = sheet.max_row # 當(dāng)前 sheet 的行數(shù)
# 遍歷所有行
for row in sheet.iter_rows():
# 遍歷行內(nèi)所有單元格
for cell in row:
# 判斷單元格是否屬于合并單元格
if cell.coordinate in sheet.merged_cells:
# 獲取該單元格所屬合并區(qū)域
merged_range = sheet.merged_cells[cell.coordinate]
# 獲取合并單元格左上角坐標(biāo)
top_left_cell = merged_range.min_row, merged_range.min_col
# 取左上角單元格的值
value = sheet.cell(*top_left_cell).value
else:
# 非合并單元格直接取值
value = cell.value
# 將單元格內(nèi)容強(qiáng)制轉(zhuǎn)換為字符串
cell.value = str(value)
# 該行處理完成
total_rows_processed += 1
# 更新進(jìn)度條顯示
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() # 強(qiáng)制刷新界面
if __name__ == "__main__":
file_path = "output_file.xlsx" # Excel 文件路徑
workbook = openpyxl.load_workbook(file_path)
# 創(chuàng)建 Tkinter GUI 窗口
root = tk.Tk()
root.title("Excel 文本化轉(zhuǎn)換(含進(jìn)度條)")
root.geometry("500x300")
# 進(jìn)度條變量
progress_var = tk.DoubleVar(value=0)
# 進(jìn)度條控件
progress_bar = ttk.Progressbar(root, mode="determinate",
variable=progress_var, maximum=100)
progress_bar.pack(pady=10)
# 顯示文本的標(biāo)簽
progress_label = tk.Label(root, text="Progress: 0.00%, Rows Processed: 0")
progress_label.pack(pady=5)
total_rows_processed = 0 # 總計處理行數(shù)
# 遍歷所有 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 中判斷單元格是否屬于合并區(qū)域可以直接這樣寫:
if cell.coordinate in sheet.merged_cells:
獲取合并區(qū)域左上角單元格:
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 實現(xiàn)進(jìn)度條與刷新界面
核心調(diào)用:
root.update_idletasks()
能保證界面實時更新,否則 Tkinter 會卡住直到任務(wù)完成才渲染 UI。
3. 將所有單元格轉(zhuǎn)換為字符串
非常簡單:
cell.value = str(value)
總結(jié)
本文介紹了如何通過 Python、Tkinter 和 openpyxl:
- 批量處理 Excel 文件
- 自動識別并處理合并單元格
- 轉(zhuǎn)換所有內(nèi)容為字符串
- 實時顯示處理進(jìn)度
適用于數(shù)據(jù)清洗、辦公自動化、ETL、批處理等場景。
以上就是使用Python + Tkinter + openpyxl實現(xiàn)Excel文本化轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于Python Excel文本化轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
跟老齊學(xué)Python之玩轉(zhuǎn)字符串(1)
本文主要講訴了字符串的定義,變量鏈接到字符串,以及對字符串的簡單操作,都是些非?;A(chǔ)的東西,適合零基礎(chǔ)的Pythoner學(xué)習(xí),覺得有用的話,多鼓鼓掌吧2014-09-09
Python實現(xiàn)快速掃描目標(biāo)主機(jī)的開放端口和服務(wù)
這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個功能強(qiáng)大的端口掃描器腳本,實現(xiàn)快速掃描目標(biāo)主機(jī)的開放端口和服務(wù),感興趣的小伙伴可以了解下2025-12-12
Python 安裝setuptools和pip工具操作方法(必看)
下面小編就為大家?guī)硪黄狿ython 安裝setuptools和pip工具操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
python數(shù)據(jù)處理實戰(zhàn)(必看篇)
下面小編就為大家?guī)硪黄猵ython數(shù)據(jù)處理實戰(zhàn)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
python GUI庫圖形界面開發(fā)之PyQt5窗口類QMainWindow詳細(xì)使用方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5窗口類QMainWindow詳細(xì)使用方法,需要的朋友可以參考下2020-02-02

