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

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

效果图:

输入用户名
在这里插入图片描述
输入数据
在这里插入图片描述
输入信息后点击添加到表格,检查后方便批量保存到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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 (35)分配类排序

前言 分配类排序是数据结构中的一种重要排序方法,其核心思想是利用分配和收集过程对元素进行排序,而无需比较元素之间的关键字。这种方法突破了基于关键字比较的排序算法的时间下界,可以达到线性时间复杂度O(n)。 一、分配类排序的基本概念 分…

sftp+sshpass

实现场景,要求客户端定时将本地的日志文件传输到服务器。 工作环境ubuntu,注意不通操作系统的版本不通,依赖的工具的版本也有所不同 实现目标需要客户端满足安装工具: 1、下载安装sshpass ---安装命令:sudo apt-ge…

Java 环境配置 + IntelliJ IDEA 使用指南

文章目录 一、Java 程序的运行必须经过3 个步骤:编写、编译、运行(1)Java 和 JavaScript 的区别(2)JDK、JRE、JVM 的关系(3)是否需要 Maven? 二、软件下载2.1、JDK下载与安装 —— 是…

013路由协议-OSPF

OSPF具有更适用于规模较大的网络环境,收敛更快速、依据带宽来计算路径成本等。 计算方式: 100M/当前端口的带宽 如果小于1就按照1来计算 例如: 当前端口的带宽是1.54M 路径成本 100/1.54 65 当前端口的带宽是 1000M 路径成本 100/100 0.…

刷题日志【4】

目录 1、猜数字大小 1、猜数字大小 题意有点抽象,我大概讲一下,就是在1——n里面会有一个目标数,我们通过猜数字的方式逼近这个数字,直到解出这个数,之前我们是用二分法求最快达到求解的问题,这道题多了每…

关于TDSQL(MySQL)的简单知识分享

0. 前言 最近在系统改造过程中,接触到了国产分布式数据库TDSQL,记录一下关于TDSQL的部分知识点。 1. TDSQL简介 TDSQL是腾讯推出的一款兼容MySQL的自主可控、高一致性分布式数据库产品。 1.1 TDSQL优点: 数据强一致性高性能低成本线性水…

学习记录:js算法(一百二十三):不同路径 II

文章目录 不同路径 II思路一 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。 网格中的障碍物…

优秀的3d建模是数据可视化的视觉核心2

空间与深度感知的增强:3D建模提供了数据的三维表示,使得用户能够直观地理解数据在空间中的分布和关系。这种深度感知是二维数据可视化无法比拟的,它有助于揭示数据之间的隐藏联系和模式。 复杂数据的直观化:对于高维或复杂的数据集…

在Docker中运行MySQL的思考:挑战与解决方案

引言 在云计算和容器化技术日益普及的今天,Docker作为一种轻量级的容器化平台,已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而,并非所有应用都适合在Docker容器中…

Jenkins流水线初体验(六)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…

cdh agent 龙蜥系统安装

1、环境配置(都在cdh_install.gz.tar和cdh.gz.tar中) #安装JDK rpm -ivh jdk-8u191-linux-x64.rpm#安装时间同步 yum install ntp vi /etc/ntp.conf #将server 0.centos.pool.ntp.org iburst注释 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst …

微信小程序开发之tcp客户端开发

一、前提 首先,保证基础库不能低于2.18.0 二、tcp实现 微信小程序提供了 wx.createTCPSocket API,允许我们创建 TCP 连接。 示例:TCP 连接的基本使用 const tcpSocket wx.createTCPSocket()tcpSocket.onConnect(() > {console.log(TCP …

6.2 JavaScript Apis - 事件流

6.2 JavaScript Apis -事件流、事件委托 文章目录 6.2 JavaScript Apis -事件流、事件委托一、事件流1.1 事件捕获1.2 事件冒泡1.3 阻止冒泡1.4 解绑事件1.5 阻止默认行为 二、事件委托2.1 介绍2.2 tab栏切换改造 三、其他事件3.1 页面加载事件3.1.1 load 事件3.1.2 DOMContent…

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率,也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像,采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…

SpringBoot3整合SpringMVC

一、实现过程: (1).创建程序 (2).引入依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

【C++】闰年判断问题完整解析与代码优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的解法分析 &#x1f4af;老师解法分析代码 1&#xff08;未优化版本&#xff09;分析 代码 2&#xff08;优化版本&#xff09;分析 &#x1f4af…

【深度学习】深刻理解ViT

ViT&#xff08;Vision Transformer&#xff09;是谷歌研究团队于2020年提出的一种新型图像识别模型&#xff0c;首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理&#xff08;如BERT和GPT&#xff09;&#xff0c;而ViT展示了其在视觉任务…

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力和梯度爆炸实验

目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…