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.效果展示



相关推荐
Lionel_SSL7 分钟前
python脚本实现接入企微机器人
python·机器人·企业微信
站大爷IP23 分钟前
Python自动化Office文档处理全攻略
python
紫雾凌寒42 分钟前
计算机视觉基础|轻量化网络设计:MobileNetV3
人工智能·python·深度学习·计算机视觉·mobilenet·mobilenetv3·轻量化网络设计
凌小添1 小时前
Python入门教程丨3.7 数据可视化
python·信息可视化·数据分析
邹飞鸣2 小时前
若依前后端分离框架修改3.8.9版本(重点在安全框架讲解与微信小程序登录集成)
安全·微信小程序·小程序
soumns丶涛2 小时前
“conda”不是内部或外部命令,也不是可运行的程序或批处理文件
windows·python·jupyter·conda
一休哥助手2 小时前
使用 LROPoller 处理 Azure 文档分析时的常见问题及解决方案
后端·python·flask
前端南玖2 小时前
小程序如何实现跨页面通信
javascript·小程序·taro
noravinsc2 小时前
django models 多条件检索
后端·python·django
初尘屿风2 小时前
基于Python的Flask微博话题舆情分析可视化系统设计与实现+毕业论文+指导搭建视频
开发语言·python·flask