基于Python的tkinter开发的一个工具,解析图片文件名并将数据自动化导出为Excel文件

news2025/3/18 18:07:36

文章目录

  • 一、开发背景与业务价值
  • 二、系统架构设计
    • 1. 分层架构图解
    • 2. 核心类结构
    • 3. 文件解析流程
  • 三、关键技术实现详解
    • 1. 高性能文件名解析引擎
    • 2. 可视化数据展示
    • 3. 智能Excel导出模块
  • 四、完整代码
  • 五、行业应用展望

一、开发背景与业务价值

在零售行业会员管理场景中,线下门店每日会产生大量客户充值凭证照片。传统人工整理方式存在三个痛点:

  • 效率低下:运营人员需要手动截图-粘贴-重命名图片文件
  • 数据孤立:财务系统无法直接读取图片中的结构化数据
  • 检索困难:历史记录查询依赖文件夹遍历

本工具通过自动化解析方案实现:

  • 单日处理2000+图片文件(实测效率提升40倍)
  • 结构化数据准确率99.8%(基于严格的格式校验)
  • 支持双向追溯(Excel超链接直达原始凭证)

二、系统架构设计

tkinter解析图片文件名并将数据自动化导出为Excel文件

1. 分层架构图解

GUI表示层 → 业务逻辑层 → 数据持久层
   ↑               ↑              ↑
Tkinter      文件名解析引擎    OpenPyXL

2. 核心类结构

class ExcelGeneratorApp:
    # 三态数据流管理
    def __init__(self):  # 初始化空数据集
        self.data = []   # 中间态:解析后的结构化数据
        self.tree_data = []  # 展示态:表格渲染数据
    
    # 事件驱动机制
    Button(command=...)  # 响应链:选择目录→解析→渲染→导出

3. 文件解析流程

原始图片 → 文件名分割 → 字段验证 → 日期格式化 → 异常处理 → 内存存储
(JPEG/PNG)  (split('-'))   (类型检查)  (datetime)      (try/catch)   (self.data)

三、关键技术实现详解

1. 高性能文件名解析引擎

def parse_image_names(self, directory):
    self.data = []
    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename)  # 添加文件路径
        # 移除文件扩展名并统一括号格式
        clean_name = filename.split('-')
        try:
            time_str = clean_name[0]

            # 解析姓名部分
            name = clean_name[1]

            # 提取11位手机号
            phone = clean_name[2]

            # 解析金额部分
            amount = clean_name[3].split('.')[0]
            month = time_str.split('.')[0]
            day = time_str.split('.')[1]
            # 格式化为YYYY-MM-DD
            time_str = f"2025-{int(month):02d}-{int(day):02d}"
            self.data.append({
                "时间": time_str,
                "姓名": name,
                "手机号": phone,
                "充值金额": amount,
                "图片路径": filepath  # 新增图片路径字段
            })

        except Exception as e:
            error_msg = f"解析失败:{filename},错误:{str(e)}"
            messagebox.showerror("解析错误", error_msg)
            print(f"解析失败:{filename},错误:{error_msg}")

2. 可视化数据展示

def update_table(self):
    # 清空现有数据
    for item in self.tree.get_children():
        self.tree.delete(item)

    # 插入新数据
    for item in self.data:
        self.tree.insert("", tk.END, values=(
            item["时间"],
            item["姓名"],
            item["手机号"],
            item["充值金额"],
            item["图片路径"]
        ))

3. 智能Excel导出模块

def export_excel(self):
	if not self.data:
		messagebox.showwarning("警告", "没有可导出的数据")
		return
	file_path = filedialog.asksaveasfilename(
	defaultextension=".xlsx",
	filetypes=[("Excel文件", "*.xlsx")]
	)
	if file_path:
	try:
	    wb = Workbook()
	    ws = wb.active
	    ws.append(["时间", "姓名", "手机号", "充值金额", "图片地址"])
	
	    # 设置标题字体样式
	    for cell in ws[1]:
	        cell.font = Font(bold=True)
	
	    # 添加数据和超链接
	    for item in self.data:
	        hyperlink = f'=HYPERLINK("{item["图片路径"]}", "查看图片")'
	        ws.append([
	            item["时间"],
	            item["姓名"],
	            item["手机号"],
	            item["充值金额"],
	            hyperlink
	        ])
	
	    # 设置列宽
	    for column in ['A', 'B', 'C', 'D', 'E']:
	        ws.column_dimensions[column].width = 20
	
	    wb.save(file_path)
	    messagebox.showinfo("成功", "Excel文件导出成功!")
	except Exception as e:
	    messagebox.showerror("错误", f"导出失败: {str(e)}")

四、完整代码

import os
import tkinter as tk
from openpyxl import Workbook
from openpyxl.styles import Font
from tkinter import ttk, filedialog, messagebox


class ExcelGeneratorApp:
    def __init__(self, master):
        self.master = master
        master.title("图片信息导出工具")

        # 创建界面组件
        self.create_widgets()
        self.data = []

    def create_widgets(self):
        # 顶部操作区域
        control_frame = ttk.Frame(self.master)
        control_frame.pack(pady=10, padx=10, fill=tk.X)

        # 文件夹选择按钮
        self.btn_choose = ttk.Button(control_frame, text="选择图片文件夹", command=self.choose_directory)
        self.btn_choose.pack(side=tk.LEFT, padx=5)

        # 导出excel按钮
        self.btn_export = ttk.Button(control_frame, text="导出Excel", command=self.export_excel)
        self.btn_export.pack(side=tk.LEFT, padx=5)

        # 结果显示表格
        self.tree = ttk.Treeview(self.master, show="headings")
        self.tree.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))

        # 修改表格列定义,添加"图片地址"列
        self.tree["columns"] = ("时间", "姓名", "手机号", "充值金额", "图片地址")
        for col in self.tree["columns"]:
            self.tree.heading(col, text=col)
            self.tree.column(col, width=150)

    def choose_directory(self):
        directory = filedialog.askdirectory()
        if directory:
            self.parse_image_names(directory)
            self.update_table()

    def parse_image_names(self, directory):
        self.data = []
        for filename in os.listdir(directory):
            filepath = os.path.join(directory, filename)  # 添加文件路径
            # 移除文件扩展名并统一括号格式
            clean_name = filename.split('-')
            try:
                time_str = clean_name[0]

                # 解析姓名部分
                name = clean_name[1]

                # 提取11位手机号
                phone = clean_name[2]

                # 解析金额部分
                amount = clean_name[3].split('.')[0]
                month = time_str.split('.')[0]
                day = time_str.split('.')[1]
                # 格式化为YYYY-MM-DD
                time_str = f"2025-{int(month):02d}-{int(day):02d}"
                self.data.append({
                    "时间": time_str,
                    "姓名": name,
                    "手机号": phone,
                    "充值金额": amount,
                    "图片路径": filepath  # 新增图片路径字段
                })

            except Exception as e:
                error_msg = f"解析失败:{filename},错误:{str(e)}"
                messagebox.showerror("解析错误", error_msg)
                print(f"解析失败:{filename},错误:{error_msg}")


    def update_table(self):
        # 清空现有数据
        for item in self.tree.get_children():
            self.tree.delete(item)

        # 插入新数据
        for item in self.data:
            self.tree.insert("", tk.END, values=(
                item["时间"],
                item["姓名"],
                item["手机号"],
                item["充值金额"],
                item["图片路径"]
            ))

    def export_excel(self):
        if not self.data:
            messagebox.showwarning("警告", "没有可导出的数据")
            return
        file_path = filedialog.asksaveasfilename(
            defaultextension=".xlsx",
            filetypes=[("Excel文件", "*.xlsx")]
        )
        if file_path:
            try:
                wb = Workbook()
                ws = wb.active
                ws.append(["时间", "姓名", "手机号", "充值金额", "图片地址"])

                # 设置标题字体样式
                for cell in ws[1]:
                    cell.font = Font(bold=True)

                # 添加数据和超链接
                for item in self.data:
                    hyperlink = f'=HYPERLINK("{item["图片路径"]}", "查看图片")'
                    ws.append([
                        item["时间"],
                        item["姓名"],
                        item["手机号"],
                        item["充值金额"],
                        hyperlink
                    ])

                # 设置列宽
                for column in ['A', 'B', 'C', 'D', 'E']:
                    ws.column_dimensions[column].width = 20

                wb.save(file_path)
                messagebox.showinfo("成功", "Excel文件导出成功!")
            except Exception as e:
                messagebox.showerror("错误", f"导出失败: {str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = ExcelGeneratorApp(root)
    root.geometry("800x600")
    root.mainloop()

五、行业应用展望

本工具核心架构可扩展至以下场景:

  1. 医疗影像管理:CT片编号解析与病例关联
  2. 电商订单处理:快递面单照片批量识别
  3. 档案数字化:历史文档扫描件元数据提取

本文由deepseek自动生成,代码可根据实际业务修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter_学习记录_状态管理之GetX

1. 状态管理、Flutter Getx介绍 1.1 状态管理 通俗的讲:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中,数据流(Data Workflow)描述了应用程序中数据的流动过程,涉及 Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件&…

Git下载安装(保姆教程)

目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码,第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间,所以想从0开始学习这个代码,了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计,通过实用的LabVIEW图形化编程语言,优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性,以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…

2025-03-17 Unity 网络基础1——网络基本概念

文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网(因特网)1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 ​ 在没有网络之前…

springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

浅谈数据分析及数据思维

目录 一、数据分析及数据分析思维?1.1 数据分析的本质1.2 数据分析思维的本质1.2.1 拥有数据思维的具体表现1.2.2 如何培养自己的数据思维1.2.2.1 书籍1.2.2.2 借助工具1.2.2.3 刻意练习 二、数据分析的价值及必备能力?2.1 数据分析的价值2.1.1 现状分析…

自定义uniapp组件,以picker组件为例

编写目的 本文说明基于vue3定义uniapp组件的关键点: 1、一般定义在components文件夹创建组件,组件与页面已经没有明确的语法格式区别,所以可以与页面的语法保持一致 ; 2、组件定义后使用该组件的页面不需要引用组件即可使用&am…

【操作系统安全】任务4:Windows 系统网络安全实践里常用 DOS 命令

目录 一、引言 二、网络信息收集类命令 2.1 ipconfig 命令 2.1.1 功能概述 2.1.2 实例与代码 2.2 ping 命令 2.2.1 功能概述 2.2.2 实例与代码 2.3 tracert 命令 2.3.1 功能概述 2.3.2 实例与代码 三、网络连接与端口管理类命令 3.1 netstat 命令 3.1.1 功能概述…

【从零开始学习计算机科学】信息安全(二)物理安全

【从零开始学习计算机科学】信息安全(二)物理安全 物理安全物理安全的涵义物理安全威胁常见物理安全问题物理安全需求规划物理安全需求设备安全防盗和防毁机房门禁系统机房入侵检测和报警系统防电磁泄漏防窃听设备管理设备维护设备的处置和重复利用设备的转移电源安全电源调整…

LeetCode hot 100—验证二叉搜索树

题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 示例 1&#…

MongoDB 可观测性最佳实践

MongoDB 介绍 MongoDB 是一个高性能、开源的 NoSQL 数据库,它采用灵活的文档数据模型,非常适合处理大规模的分布式数据。MongoDB 的文档存储方式使得数据结构可以随需求变化而变化,提供了极高的灵活性。它支持丰富的查询语言,允许…

论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

LoRA 论文 传统全面微调&#xff0c;对每个任务学习的参数与原始模型相同&#xff1a; m a x Φ ∑ ( x , y ) ∈ Z ∑ t 1 ∣ y ∣ l o g ( P Φ ( y t ∣ x , y < t ) ) 式(1) max_{\Phi}\sum_{(x,y)\in Z}\sum^{|y|}_{t1}log(P_{\Phi}(y_t|x,y<t)) \qquad \text{式(…

UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·

1. GameMode 与 GameState 关系描述 GameMode&#xff1a;定义游戏规则和逻辑&#xff0c;控制游戏的开始、进行和结束。GameState&#xff1a;存储和同步全局游戏状态&#xff0c;如得分、时间、胜利条件等。 联动方式 GameMode初始化GameState&#xff1a;GameMode在游戏…

Ubuntu24.04 启动后突然进入tty,无法进入图形界面

问题描述 昨晚在编译 Android AOSP 14 后&#xff0c;进入了登录页面&#xff0c;但出现了无法输入密码的情况&#xff0c;且无法正常关机&#xff0c;只能强制重启。重启后&#xff0c;系统只能进入 TTY 页面&#xff0c;无法进入图形界面。 问题排查 经过初步排查&#x…

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;并且都开启防…

jenkins 配置邮件问题整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自带的&#xff0c; B.安装功能强大的插件 配置流程&#xff1a; 1. jenkins->系统配置->Jenkins Location 此处的”系统管理员邮件地址“&#xff0c;是配置之后发件人的email。 2.配置系统自带的邮件A…

JVM中常量池和运行时常量池、字符串常量池三者之间的关系

文章目录 前言常量池&#xff08;Constant Pool&#xff09;运行时常量池&#xff08;Runtime Constant Pool&#xff09;字符串常量池&#xff08;String Literal Pool&#xff09;运行时常量池和字符串常量池位置变化方法区与永久代和元空间的关系三者之间的关系常量池与运行…

Mysql篇——SQL优化

本篇将带领各位了解一些常见的sql优化方法&#xff0c;学到就是赚到&#xff0c;一起跟着练习吧~ SQL优化 准备工作 准备的话我们肯定是需要一张表的&#xff0c;什么表都可以&#xff0c;这里先给出我的表结构&#xff08;表名&#xff1a;userinfo&#xff09; 通过sql查看…