数据分析python小工具录入产品信息到Excel

news2025/2/23 16:57:11

在没有后台管理系统的时候,有时候为了方便起见,想提供一个输入框让运营人员直接输入,然后数据就会以数据库的形式存进数据库

效果图:

输入用户名
在这里插入图片描述
输入数据
在这里插入图片描述
输入信息后点击添加到表格,检查后方便批量保存到excel
在这里插入图片描述

代码

import tkinter as tk
from tkinter import ttk, messagebox, simpledialog, filedialog
from tkcalendar import DateEntry
import pandas as pd
import os

# 全局变量保存用户名
cached_username = None

# 保存到 Excel 的函数
def save_to_excel():
    table_name = table_name_var.get()

    if not table_name:
        messagebox.showwarning("输入错误", "请填写表名!")
        return

    # 获取表格数据
    rows = tree.get_children()
    if not rows:
        messagebox.showwarning("数据错误", "没有可保存的数据!")
        return

    # 收集表格数据
    new_data = []
    for row in rows:
        new_data.append(tree.item(row)["values"])

    # 转为 DataFrame
    new_df = pd.DataFrame(new_data, columns=["日期", "产品线", "SKU", "数量", "用户"])

    # 指定保存的文件路径
    file_path = filedialog.asksaveasfilename(
        defaultextension=".xlsx",
        filetypes=[("Excel Files", "*.xlsx")],
        title="选择保存路径",
        initialfile="database.xlsx"
    )
    if not file_path:
        return

    # 检查文件是否存在并累加数据
    if os.path.exists(file_path):
        try:
            # 读取现有数据
            with pd.ExcelWriter(file_path, mode="a", engine="openpyxl", if_sheet_exists="overlay") as writer:
                existing_data = pd.read_excel(file_path, sheet_name=table_name, engine="openpyxl")
                combined_data = pd.concat([existing_data, new_df], ignore_index=True)
                combined_data.to_excel(writer, sheet_name=table_name, index=False)
        except Exception:
            # 如果工作表不存在,仅保存新数据
            with pd.ExcelWriter(file_path, mode="a", engine="openpyxl") as writer:
                new_df.to_excel(writer, sheet_name=table_name, index=False)
    else:
        # 文件不存在时创建新的 Excel 文件
        with pd.ExcelWriter(file_path, engine="openpyxl") as writer:
            new_df.to_excel(writer, sheet_name=table_name, index=False)

    # 成功提示
    messagebox.showinfo("保存成功", f"数据已保存到 {file_path}{table_name} 表中。")
    tree.delete(*rows)  # 清空表格

# 添加数据到表格
def add_to_table():
    date = date_var.get()
    product_line = product_line_var.get()
    sku = sku_var.get()
    quantity = quantity_var.get()

    if not (date and product_line and sku and quantity):
        messagebox.showwarning("输入错误", "请填写所有字段!")
        return

    try:
        # 验证数量为数字
        quantity = int(quantity)
        # 添加到表格(包括隐藏列)
        tree.insert("", "end", values=(date, product_line, sku, quantity, cached_username))
        # 清空输入框
        product_line_var.set("")
        sku_var.set("")
        quantity_var.set("")
    except ValueError:
        messagebox.showerror("输入错误", "数量必须是整数!")

# 主程序启动
if __name__ == "__main__":
    # 弹出用户名输入框
    cached_username = simpledialog.askstring("用户名输入", "请输入用户名:")
    if not cached_username:
        messagebox.showerror("错误", "用户名不能为空,程序将退出!")
        exit()

    # 创建主窗口
    root = tk.Tk()
    root.title("批量数据处理窗口")

    # 表名输入
    tk.Label(root, text="表名:").grid(row=0, column=0, padx=10, pady=5, sticky="e")
    table_name_var = tk.StringVar()
    tk.Entry(root, textvariable=table_name_var, width=30).grid(row=0, column=1, padx=10, pady=5)

    # 日期选择
    tk.Label(root, text="日期:").grid(row=1, column=0, padx=10, pady=5, sticky="e")
    date_var = tk.StringVar()
    date_picker = DateEntry(root, textvariable=date_var, width=27, background="darkblue", foreground="white", borderwidth=2)
    date_picker.grid(row=1, column=1, padx=10, pady=5)

    # 产品线输入
    tk.Label(root, text="产品线:").grid(row=2, column=0, padx=10, pady=5, sticky="e")
    product_line_var = tk.StringVar()
    tk.Entry(root, textvariable=product_line_var, width=30).grid(row=2, column=1, padx=10, pady=5)

    # SKU输入
    tk.Label(root, text="SKU:").grid(row=3, column=0, padx=10, pady=5, sticky="e")
    sku_var = tk.StringVar()
    tk.Entry(root, textvariable=sku_var, width=30).grid(row=3, column=1, padx=10, pady=5)

    # 数量输入
    tk.Label(root, text="数量:").grid(row=4, column=0, padx=10, pady=5, sticky="e")
    quantity_var = tk.StringVar()
    tk.Entry(root, textvariable=quantity_var, width=30).grid(row=4, column=1, padx=10, pady=5)

    # 添加按钮
    tk.Button(root, text="添加到表格", command=add_to_table).grid(row=5, column=0, columnspan=2, pady=10)

    # 表格(Treeview)
    columns = ("日期", "产品线", "SKU", "数量", "用户")
    tree = ttk.Treeview(root, columns=columns, show="headings", height=10)

    # 显示前四列
    for col in columns[:-1]:
        tree.heading(col, text=col)
        tree.column(col, width=100, anchor="center")

    # 隐藏用户列
    tree.heading("用户", text="用户")
    tree.column("用户", width=0, anchor="center", stretch=False)

    tree.grid(row=6, column=0, columnspan=2, padx=10, pady=5)

    # 保存按钮
    tk.Button(root, text="保存到Excel", command=save_to_excel).grid(row=7, column=0, columnspan=2, pady=10)

    # 运行主循环
    root.mainloop()

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

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

相关文章

HTML和JavaScript实现商品购物系统

下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…

C# 探险之旅:第三节 - 有趣的变量命名

欢迎再次回到我们的C#魔法森林。今天,我们要一起探索一个既有趣又实用的技能——变量命名。想象一下,你正在为你的小精灵们(变量)起名字,好的名字不仅能让它们更容易被识别,还能让你的魔法书(代…

JavaEE 【知识改变命运】04 多线程(3)

文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因:1.线程是抢占式的2. 多线程修改同一个变量(程序的要求)3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…

ASP.NET|日常开发中连接Sqlite数据库详解

ASP.NET|日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表(以简单的用户表为例…

DS记录中

DataX/hdfswriter/doc/hdfswriter.md at master alibaba/DataX GitHub DataX 写入文档 https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/architecture/task-structure DS文档 DS 项目举例 流程 数据库(Datax) -> ODS (shell)->ADS(…

Node.js express

1. express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs.com.cn/简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用&#xff…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

分布式日志系统设计

一、分布式日志系统定义 分布式日志系统是一种用于收集、存储和分析大规模分布式系统日志的系统。它可以帮助开发人员和系统管理员实时监控和调试系统,提高系统可靠性和可用性,同时也可以用于日志分析和故障排查。 二、简单设计思路 日志收集&#xff…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

java+springboot+mysql私人会所管理系统

项目介绍: 使用javaspringbootmysql开发的私人会所管理系统,系统包含管理员、技师、用户角色,功能如下: 管理员:用户管理;服务项目;技师管理;房间管理;预约管理&#x…

Java面试之Happens-Before原则

此篇接上一篇的Java面试之volatile关键字。 首先,这是Java语言中的一个“先行发生”(Happens-Before)的原则。是判断数据是否存在竞争,线程是否安全的非常有用的手段,也是Java内存模型中定义的两项操作之间的偏序关系。 其次,Happ…

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解 0. 前言1. 神经网络基础1.1 神经网络简介1.2 神经网络的训练1.3 神经网络的应用 2. 从零开始构建前向传播2.1 计算隐藏层节点值2.2 应用激活函数2.3 计算输出层值2.4 计算损失值2.4.1 在连续变…

C++鼠标轨迹算法(鼠标轨迹模拟真人移动)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…

【AI知识】过拟合、欠拟合和正则化

一句话总结: 过拟合和欠拟合是机器学习中的两个相对的概念,正则化是用于解决过拟合的方法。 1. 欠拟合: 指模型在训练数据上表现不佳,不能充分捕捉数据的潜在规律,导致在训练集和测试集上的误差都很高。欠拟合意味着模…

汽车升级到底应不应该设置“可取消“功能

最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…

优选算法——分治(快排)

1. 颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) 题目展示: 题目分析:本题其实就要将数组最终分成3块儿,这也是后面快排的优化思路,具体大家来看下图。 这里我们上来先定义了3个指针&…

[Maven]下载安装、配置与简介

很多框架的下载使用的流程和思路是差不多的,这里以maven做详细介绍。 下载安装与配置变量 下载 首先,我们要使用maven,必须先下载它的相关文件。想要下载,我们可以直接搜索maven。找到它的官网。这里不绕弯子,直接给出…

Maven 安装配置(详细教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…

【AI知识】人工智能、机器学习、深度学习的概念与联系

下图来自博客 机器学习和深度学习概念入门 ,图中可明显看到人工智能、机器学习、深度学习三个概念的包含关系,下面简单介绍一下这三个概念已经它们之间的联系。 1. 人工智能(Artificial Intelligence,AI) 概念&#x…