用Python手撕一个批量填充数据到excel表格的工具,解放双手!
作者: 锋小刀
微信搜索【Python与Excel之交】关注我的公众号查看更多内容
Hi~大家好!
今天这篇文章是根据批量填充数据
的进阶版。基础版本就一段很简单的代码。虽然简单,但如果这个模板或者数据发生变化,还是要改来改去的,所以本文就在基础版本上进行改进,只需要动动鼠标就可以填充大量数据到Excel工作表中。
GUI界面设计
GUI是用PySimpleGUI库创建的,安装命令直接用pip命令安装即可!
在开始设计GUI界面时,要明确我们需要实现什么功能,可以先设计出图纸,再动手去写代码!本文根据需求,最后得出以下GUI界面图纸:
GUI界面中按钮和框的一些功能:
- 通过
打开文件按钮
选择数据文件或者在输入框中输入数据文件文件路径,但只支持csv
、xlsx
、xls
格式的文件,并把数据文件中的列标题传入选择或输入数据列标题框
中。 - 通过
打开模板按钮
选择模板文件或者在输入框中输入模板文件的路径,只支持xlsx
和xls
格式的文件,并把模板表格中的空白单元格坐标传入选择或输入单元格坐标框
中。 - 通过
选择或输入数据列标题框
选择要填充的数据列。 - 通过
选择或输入单元格坐标框
选择各个数据列填充的位置。 - 通过
继续按钮
把数据列标题和单元格坐标存储入列表中。 - 通过
开始填充按钮
开始填充数据。 - 通过
信息展示框
展示操作信息。 - 当数据列标题和单元格坐标选择错误时,可以通过
删除元素按钮
删除列表中的错误数据。 - 通过
退出程序
按钮直接结束工具的运行
根据图纸和基本功能思路最后得出以下代码:
# 主题设置
sg.theme('BrownBlue')# 布局设置
layout = [# 选择数据文件框和按钮 file_types 后面跟的是支持的文件格式,传入的是元组,元组中只包含一个元素时,需要在元素后面添加逗号[sg.Text('请选择文件:', font=("微软雅黑", 12)),sg.InputText(key='please_select_file', size=(78, 1), font=("微软雅黑", 10), enable_events=True),sg.FileBrowse('打开文件', file_types=(("Text Files", "*.csv*"), ("Text Files", "*.xls*")), font=("微软雅黑", 12))],# 选择模板框和按钮 xls包括xlsx格式[sg.Text('请选择模板:', font=("微软雅黑", 12)),sg.InputText(key='template', size=(78, 1), font=("微软雅黑", 10), enable_events=True),sg.FileBrowse('打开模板', file_types=(("Text Files", "*.xls*"),), font=("微软雅黑", 12))],[sg.Text('请选择或输入数据列标题:', font=("微软雅黑", 12)),sg.Combo(values='', tooltip='请选择或输入数据列:', font=("微软雅黑", 10), auto_size_text=True,size=(15, 10), key='value'),sg.Text('请选择或输入单元格坐标:', font=("微软雅黑", 12)),sg.Combo(values='', tooltip='请选择或输入单元格坐标:', font=("微软雅黑", 10), auto_size_text=True,size=(15, 10), key='keys'),sg.Button('继续', font=("微软雅黑", 12)),sg.Button('开始填充', font=("微软雅黑", 12))],[sg.Text('信息展示:', justification='center')],[sg.Output(size=(100, 10), font=("微软雅黑", 10))],[sg.Text('', font=("微软雅黑", 12), size=(0, 0)), sg.Button('删除元素', font=("微软雅黑", 12)),sg.Text('', font=("微软雅黑", 12), size=(62, 0)), sg.Button('退出程序', font=("微软雅黑", 12))]
]
# 创建窗口
window = sg.Window('数据填充工具', layout, font=("微软雅黑", 12), default_element_size=(80, 1))
# 事件循环
while True:# 退出按钮event, values = window.read()if event in (None, '退出程序'):break
window.close()
界面效果:
事件循环设置
打开文件按钮
只要实现的是传入数据文件,然后获取数据文件的标题行并传入对应的框中:
if event == 'please_select_file':fileName = values['please_select_file']if os.path.exists(fileName):# 因为pandas读取文件因格式而异,所以需要判断if fileName.split('.')[-1] == 'csv':df = pd.read_csv(fileName, encoding='utf-8')# 获取标题行keys = df.columns.to_list()# 传入相应的的框window["value"].Update(values=keys, font=("微软雅黑", 10), size=(15, 8))elif fileName.split('.')[-1] == 'xls' or 'xlsx':df = pd.read_excel(fileName, encoding='utf-8')keys = df.columns.to_list()window["value"].Update(values=keys, font=("微软雅黑", 10), size=(15, 8))else:print('文件格式不正确,请重新选择文件!')sg.popup('文件格式不正确,请重新选择文件!')else:print('文件不存在,请重新选择文件!')sg.popup('文件不存在,请重新选择文件!')
打开模板按钮
只要实现的是传入模板文件,以及获取模板表格中的空白表格坐标;其中,之所以使用openpyxl
打开模板文件,是因为后面是openpyxl进行填充数据的。而列表推导式
中,第一个for循环取出单元格对象,第二个循环把对象内容转换为字符串格式,通过正则表达式取出单元格坐标,最后通过if判断单元格内容是否为None,是的话就传入列表中,需要注意的是:如果是合并单元格的,会被分开计算为单个单元格
。
if event == 'template':fileName = values['template']if os.path.exists(fileName):wb = openpyxl.load_workbook(fileName)sheets = wb.sheetnames # 获取全部sheetws = wb[sheets[0]] # 默认获取第一个工作表data_row = []# 列表推导式,获取模板表格中的空白表格坐标data = [data_row.append(i) for row in ws.rows for i inre.findall("<.*? '.*?'.([A-Z]+\d+)>", str("{}".format(row))) if ws[str(i)].value == None]window["keys"].Update(values=data_row, font=("微软雅黑", 10), size=(15, 8))else:print('文件不存在,请重新选择文件')sg.popup('文件不存在,请重新选择文件')
继续选择按钮
只要实现的是:获取用户在选择或输入数据列标题框
和选择或输入单元格坐标框
一次次输入的内容,存储到valuelist
和keyslist
列表中:
if event == '继续':if values['value'] and values['keys']:a = values['value']b = values['keys']valuelist.append(a)keyslist.append(b)print(f'选择: {a}:{b} 完毕,请继续;或者点击开始进行数据填充!')else:print('数据列标题或者单元格坐标未选择!')sg.popup('数据列标题或单元格坐标未选择!')
判断两个列表中的内容是否存在,存在就把数据传入Datainput
函数中,并开始填充:
# 开始填充按钮
if event == '开始填充':if len(keyslist) and len(valuelist) != 0:Datainput(valuelist, keyslist)else:print('数据列标题或者单元格坐标未选择!')sg.popup('数据列标题或单元格坐标未选择!')
删除元素按钮
只要用python自带函数remove
来删除列表中的元素:
if event == '删除元素':if values['value'] or values['keys']:a = values['value']b = values['keys']if a:keyslist.remove(a)print('删除成功!')else:valuelist.remove(b)print('删除成功!')
数据填充函数
Datainput函数接收通过开始填充按钮传入的列标题和单元格坐标,并开始填充数据:
def Datainput(key, value):for p in range(len(df[key[0]])): # 计算excel工作表其中一列数据的数目,然后进行遍历这个数值sheet = wb.copy_worksheet(ws) # 复制原有工作表sheet.title = str(df[key[0]][p]) # 设置工作表名称for i in range(len(key)): # 计算excel工作表中标题数目sheet[value[i]].value = df[key[i]][p] # 写入数据print('正在填充,请稍等!')# 弹窗进度条sg.one_line_progress_meter('正在填充,请稍等!', p + 1, 100, orientation='h',bar_color=('#F47264', '#FFFFFF'))wb.save("猫眼电影信息.xlsx")print('已完成...')sg.popup('已完成!') # 弹窗
打包运行
打包可以通过pyinstaller
库,安装只需要pip命令即可!安装后在命令行窗口cd到文件所在的文件目录中,最后用下面命令进行打包。
pyinstaller -F -w 名称.py
运行展示:
结语
把一个简单的脚本制作成一个可运行的工具,代码量变多了,但用起来方便了很多,只要是能节省时间,解放双手(虽然还要动手),避免重复性、机器式操作。
以上便是本文全部内容,代码在测试过程中暂未发现什么bug,可正常运行。如果你感兴趣的话,点个赞和在看支持一下呗。
公众号文章链接:
https://mp.weixin.qq.com/s?__biz=MzU2Njg5MDYyMg==&mid=2247486179&idx=1&sn=5772f1892dd942fc8244395937dc5ac3&chksm=fca4d3f2cbd35ae491b9f2df6b3d4520475e6556aa142d3e65251dee913f9a1653a15ada25a1&token=1956692089&lang=zh_CN#rd
完整源码和工具可在公众号后台发送填充数据
获取!
用Python手撕一个批量填充数据到excel表格的工具,解放双手!相关推荐
- c#使用NPOI批量导出数据到excel表格里
背景 我之前是做的Java开发的相关工作,c#开发还是第一次. 公司有这个需求,只好研究一下了. 我接手的是别人开发过两个报表的小玩意,万事开头难,刚开始为了搞清楚这些代码的意思走了不少弯路,下面说说 ...
- php批量导出excel表格,PHP批量导出数据为excel表格
之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...
- python如何把数据写入excel表格中指定列
Python可以使用openpyxl库来将数据写入Excel表格中指定的列.如果要将数据写入指定的列中,可以使用如下代码:worksheet.write(row_index, column_index ...
- 从浏览器里面的数据导出数据到Excel表格
从浏览器里面的数据导出数据到Excel表格 开发工具与关键技术:Visual Studio 2015 作者:李仁海 撰写时间:2019.5.5 一. 导出数据到Excel表格 1. public.加上 ...
- python手撕分水岭算法
python手撕分水岭算法 1 分水岭算法实现 主要思路就是: 利用一个优先队列与有序队列(有序队列其实可以不用).优先队列是按像素的灰度值排列的,灰度值低的先被淹. 通过统计像素的附近的点的标记种类 ...
- python写的一个-批量下载股票年报的小工具
python写的一个-批量下载股票年报的小工具 from urllib import request import requests import os import openpyxl# print( ...
- 使用python将数据导出excel表格
python可用于数据分析,有时候获得了数据需要导出以作其他作用.本文就介绍python导出excel表格的方法. 导出excel表格,python提供了两个库:xlwt,xlrd.本文只讨论 ...
- 7.3 MASS批量修改数据(Excel文件上传数据)
7.3 MASS批量修改数据(Excel文件上传数据) 步骤1:输入事务码MASS进入 1处,输入需要修改的对象类型(参见对象类型清单) 2处,点击"执行"按钮 步骤2:选择需要修 ...
- python追加写入数据到excel表格
目录 一.脚本结构 二.使用的模块 三.脚本实现 1.实时信息的获取 2.数据的记录 最近几周的测试工作中,有一项内容是需要不断地从界面上获取信息,所以我研究了一下 " 利用接口先将信息获取 ...
- Python爬虫项目:爬取JSON数据存储Excel表格与存储图片
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战.搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Googl ...
最新文章
- linux执行命令时报错:permission denied
- UA MATH566 统计理论 证明UMVUE的方法
- 10月网民上网高峰时段为晚上8点 比例升至6.64%
- linux 解压tar.jz,linux系统压缩文件和解压缩命令
- 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...
- VC编写程序在debug下正常,在release下错误
- 【设计模式】 模式PK:命令模式VS策略模式
- c语言字符合法,C语言字符数据的合法形式
- ssm整合之配置applicationContext-service.xml
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
- 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
- warning: setUpNet DNN module was not built with CUDA backend; switching to CPU错误解决
- 4.s(15): error: A1867E: Immediate 0x00000002 out of range for this operation. Permitted values are
- 小红书api_【实习精选】oppo、小红书等名企实习汇总(96)
- 浏览器被23545等网站劫持,以Chrome为例亲测有效的两个解除劫持的方法
- fafa什么意思_Fafa是什么意思
- 项目干系人包括的人群
- MySQL建员工表案例
- win10系统休眠文件删除
- Java web项目创建笔记23 之《spring整合xxl-job》
热门文章
- Birt分类汇总报表(CUBES)空值转换为0
- PM、PO、PO、PMO、PMP的区别和介绍
- 英语词根研究和单词记忆
- 【戴明环】PDCA-问题闭环思维模型
- 华为路由器显示连接到服务器失败怎么办,华为路由器设置好了不能用怎么办 华为路由器无法上网问题-192路由网...
- 统计学的Python实现-005:最大值、最小值、极差
- java开发坦克大战小游戏
- 如何制作Excel表头
- 第45章 	DCMI—OV2640摄像头—零死角玩转STM32-F429系列
- L08-Linux解决Device eth0 does not seem to be present,delaying initialization问题