实现一个图形化的Excel到文本文件转换工具,用户可以通过上传Excel文件并选择特定的列和行来生成一个文本文件。以下是详细的代码功能、使用的技术以及每一部分的详细注释:
1.功能概述
上传Excel文件:用户可以选择一个Excel文件进行上传。
选择列和行:用户可以勾选要下载的列和行。
下载文本文件:根据用户的选择,将选定的列和行的内容保存为文本文件。
2.使用的技术
Tkinter:Python的标准GUI库,用于创建图形用户界面。
Pandas:用于读取和处理Excel文件。
Openpyxl:Pandas依赖于openpyxl来处理.xlsx格式的Excel文件。
3.代码详细注释
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import pandas as pd
import os
class ExcelToTextApp:
def __init__(self, root):
self.root = root
self.root.title("Excel到文本转换器")
self.root.geometry("800x600") # 设置窗口大小
self.root.configure(bg="#f0f0f0") # 设置背景颜色
# 使用中文字体
self.font_style = ("黑体", 14)
self.small_font_style = ("黑体", 12)
# 创建主框架
main_frame = ttk.Frame(self.root, padding="20")
main_frame.pack(fill=tk.BOTH, expand=True)
# 创建上传按钮
self.upload_button = tk.Button(main_frame, text="上传Excel文件", font=self.font_style, command=self.upload_file, bg="#4CAF50", fg="white")
self.upload_button.grid(row=0, column=0, columnspan=2, pady=20, padx=10, sticky=tk.W+tk.E)
# 创建下载按钮(初始状态为禁用)
self.download_button = tk.Button(main_frame, text="下载文本文件", font=self.font_style, state=tk.DISABLED, command=self.download_file, bg="#008CBA", fg="white")
self.download_button.grid(row=1, column=0, columnspan=2, pady=10, padx=10, sticky=tk.W+tk.E)
# 创建标签显示状态信息
self.status_label = tk.Label(main_frame, text="", font=("黑体", 12), bg="#f0f0f0", fg="black")
self.status_label.grid(row=2, column=0, columnspan=2, pady=20, padx=10, sticky=tk.W+tk.E)
# 存储上传的Excel文件路径
self.excel_path = None
self.text_path = None
# 列选择框架
self.column_frame = ttk.Frame(main_frame, padding="10")
self.column_frame.grid(row=3, column=0, padx=10, pady=10, sticky=tk.NSEW)
# 行选择框架
self.row_frame = ttk.Frame(main_frame, padding="10")
self.row_frame.grid(row=3, column=1, padx=10, pady=10, sticky=tk.NSEW)
# 初始化列和行选择区域
self.init_column_row_selection()
# 配置网格权重以适应窗口调整
main_frame.grid_columnconfigure(0, weight=1)
main_frame.grid_columnconfigure(1, weight=1)
main_frame.grid_rowconfigure(3, weight=1)
def init_column_row_selection(self):
# 添加列选择标签
column_label = tk.Label(self.column_frame, text="选择列:", font=self.small_font_style, bg="#f0f0f0", fg="black")
column_label.pack(anchor=tk.W)
# 添加行选择标签
row_label = tk.Label(self.row_frame, text="选择行:", font=self.small_font_style, bg="#f0f0f0", fg="black")
row_label.pack(anchor=tk.W)
# 存储列和行的选择变量和复选框
self.columns_var = []
self.column_checkboxes = []
self.rows_var = []
self.row_checkboxes = []
def upload_file(self):
# 打开文件对话框选择Excel文件
self.excel_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx *.xls")])
if not self.excel_path:
return
try:
# 读取Excel文件
df = pd.read_excel(self.excel_path)
# 清除之前的列和行选择控件
for checkbox in self.column_checkboxes:
checkbox.destroy()
for checkbox in self.row_checkboxes:
checkbox.destroy()
# 获取所有列名
columns = df.columns.tolist()
self.columns_var = [tk.IntVar() for _ in columns]
self.column_checkboxes = [
tk.Checkbutton(self.column_frame, text=col, variable=self.columns_var[i], font=self.small_font_style, bg="#f0f0f0", fg="black")
for i, col in enumerate(columns)
]
# 布局列选择控件
for i, checkbox in enumerate(self.column_checkboxes):
checkbox.pack(anchor=tk.W)
# 获取所有行索引
rows = range(len(df))
self.rows_var = [tk.IntVar() for _ in rows]
self.row_checkboxes = [
tk.Checkbutton(self.row_frame, text=str(row+1), variable=self.rows_var[i], font=self.small_font_style, bg="#f0f0f0", fg="black")
for i, row in enumerate(rows)
]
# 布局行选择控件
for i, checkbox in enumerate(self.row_checkboxes):
checkbox.pack(anchor=tk.W)
# 启用下载按钮
self.download_button.config(state=tk.NORMAL)
self.status_label.config(text="文件上传成功!请选择要下载的列和行。", fg="green")
except Exception as e:
self.status_label.config(text=f"发生错误: {e}", fg="red")
def download_file(self):
if not self.excel_path:
self.status_label.config(text="没有可下载的文件。", fg="orange")
return
try:
# 读取Excel文件
df = pd.read_excel(self.excel_path)
# 获取选中的列
selected_columns = [i for i, var in enumerate(self.columns_var) if var.get()]
if selected_columns:
df = df.iloc[:, selected_columns]
# 获取选中的行
selected_rows = [i for i, var in enumerate(self.rows_var) if var.get()]
if selected_rows:
df = df.iloc[selected_rows]
# 转换为CSV格式
text_content = df.to_csv(index=False, sep='\t')
# 提供下载功能
save_path = filedialog.asksaveasfilename(defaultextension=".txt",
filetypes=[("文本文件", "*.txt")],
initialfile="output.txt")
if not save_path:
return
# 保存文本文件
with open(save_path, 'w', encoding='utf-8') as file:
file.write(text_content)
self.status_label.config(text="文件下载成功!", fg="green")
except Exception as e:
self.status_label.config(text=f"发生错误: {e}", fg="red")
if __name__ == "__main__":
root = tk.Tk()
app = ExcelToTextApp(root)
root.mainloop()
4.效果展示