python的Tkinter小程序上传Excel并下载Text

实现一个图形化的Excel到文本文件转换工具,用户可以通过上传Excel文件并选择特定的列和行来生成一个文本文件。以下是详细的代码功能、使用的技术以及每一部分的详细注释:

1.功能概述

上传Excel文件:用户可以选择一个Excel文件进行上传。

选择列和行:用户可以勾选要下载的列和行。

下载文本文件:根据用户的选择,将选定的列和行的内容保存为文本文件。

2.使用的技术

Tkinter:Python的标准GUI库,用于创建图形用户界面。

Pandas:用于读取和处理Excel文件。

Openpyxl:Pandas依赖于openpyxl来处理.xlsx格式的Excel文件。

3.代码详细注释

python 复制代码
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.效果展示



相关推荐
机器学习ing.1 分钟前
U-Net保姆级教程:从原理到医学细胞分割实战(PyTorch版)!
人工智能·pytorch·python·深度学习·机器学习
不想上班的小吕8 分钟前
SAP EXCEL模板下载导入
excel·sap
yzx99101325 分钟前
基于Django的智慧园区管理系统开发全解析
后端·python·django
sunsunyu031 小时前
视频转图片工具
python·音视频
软件开发技术深度爱好者1 小时前
Python类中方法种类介绍
开发语言·python
用户8356290780511 小时前
使用Python合并Word文档:实现高效自动化办公
后端·python
向日葵同志443302 小时前
使用@univerjs纯前端渲染excel, 显示图片、链接、样式
前端·react.js·excel
闭着眼睛学算法2 小时前
【双机位A卷】华为OD笔试之【排序】双机位A-银行插队【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
Pocker_Spades_A2 小时前
Python快速入门专业版(五十四):爬虫基石:HTTP协议全解析(从请求到响应,附Socket模拟请求)
爬虫·python·http
DoubleKK2 小时前
Python 中的 json_repair 使用教程:轻松修复大模型返回的非法 JSON
python