数据分析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"])# 转为 DataFramenew_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("输入错误", "请填写所有字段!")returntry:# 验证数量为数字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.rhkb.cn/news/488720.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala的泛型2

package test55 //隐式转换 //1.隐式函数 //2.隐式类 //3.隐式对象 //4.函数的隐式参数//泛型:类型参数化。 //Pair 约定一对数据 class Pair[T](var x:T, var y:T) //泛型的应用场景: //1.泛型函数 //2.泛型类 //3.泛型特质 object test2 {def main(arg…

【刷题22】BFS解决最短路问题

目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图:从A到I,怎样走路径最短 一个队列一个哈希表队列:一层一层递进,直到目的地为止哈希表&…

Google Cloud Database Option(数据库选项说明)

关系数据库 在关系数据库中,信息存储在表、行和列中,这通常最适合结构化数据。因此,它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL(结构化查询语言)。它们为数据提供 ACID 一致性模式&am…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢?1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承?2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

PAT甲级-1114 Family Property

题目 题目大意 共有n个户主,每个户主的房产按照“ 户主id 父亲id 母亲id 孩子个数 孩子的id 房产数 房产面积 ”的格式给出。如果父亲或母亲不存在,值为-1。每个户主及其父亲母亲孩子可以构成一个家庭,不同户主如果有相同的家人,…

如何不重启修改K8S containerd容器的内存限制(Cgroup方法)

1. 使用crictl 查看容器ID crictl ps2. 查看Cgroup位置 crictl inspect 容器ID3. 到容器Cgroup的目录下 使用上个命令就能找到CgroupPath 4 . 到cgroup目录下 正确目录是 : /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf68e18…

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学,让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域,与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…

Scala中求汉罗塔游戏

记:f(n,"A","B","C")表示n个盘子从A柱子上移动到C柱子上,借用B柱子的过程 f(要移动的盘子的个数,起点,辅助柱子,终点) 1.基本情况(直接能求的):f(1,"A",&…

mac 安装CosyVoice (cpu版本)

CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址:https://github.com/FunAudioLLM/CosyVoice.git 下载项目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…

C++50道经典面试题

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 作为一种通用且面向对…

家里养几条金鱼比较好?

金鱼,作为备受喜爱的家庭水族宠物,其饲养数量一直是众多养鱼爱好者关注的焦点。究竟养几条金鱼最为适宜,实则需要综合考量多方面因素,方能达到美观、健康与和谐的理想养鱼境界。 从风水文化的视角来看,金鱼数量有着诸…

启明智显ZX7981PC:5G时代的新选择,全屋网络无缝覆盖

在这个飞速发展的5G时代,每一个细微的科技进步都在推动着我们的生活向更加智能、便捷的方向发展。近日,启明智显再次引领科技潮流,正式发布其最新的5G CPE产品——ZX7981PC。作为继7981PG与7981PM之后的又一次迭代升级,ZX7981PC凭…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 ,否则为 0 ) and表示(全为1时才为1,否则为0) and表示(全为1时才为1,否则为0),逻辑或用|或 o r 表示 ( 有 1 就为 1 ,都为 0 才为 0 ) or表示…

讲解如何使用NLTK?外加数据清理实例演示

一、如何使用NLTK? 定义:自然语言工具包(Natural Language Toolkit),它是一个将学术语言技术应用于文本数据集的 Python 库,称为“文本处理”的程序设计是其基本功能,专门用于研究自然语言的语…

【PlantUML系列】状态图(六)

一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…

ARM循环程序和子程序设计

1、计算下列两组数据的累加和并存入到sum1和 sum2 单元中。datal:0x12,0x935,0x17,0x100,0x95,0x345。 data2:0x357,0x778,0x129,0x188,0x190,0x155,0x167。 1.定义数据段 ;定义数据段,类型为data(表示为数据段),权限为可读可写(程序可以读取和修改这…

【Vue3进阶】组件通信进阶使用方法——defineProps、defineExpose、defineEmits

组件通信 父传子 defineProps 在 Vue 3 中&#xff0c;defineProps 是一个用于在 <script setup> 语法中定义组件的 props 的函数。这个函数提供了一种更加明确和类型安全的方式来定义子组件的 props&#xff0c;使得子父组件之间的数据传递更加清晰和可维护。以下是 …

day11 性能测试(4)——Jmeter使用(黑马的完结,课程不全)直连数据库+逻辑控制器+定时器

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 1.1 断言&#xff08;3种&#xff09; 1.2 关联&#xff08;3种&#xff09; 1.3 录制脚本 2、Jmeter直连数据库 2.1 直连数据库——使用场景 2.2 直连数据库——操作步骤 2.2.1 案例1&…

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车&#xff08;Enter&#xff09;如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…