作者: 锋小刀
微信搜索【Python与Excel之交】关注我的公众号查看更多内容

Hi~大家好!

今天这篇文章是根据批量填充数据的进阶版。基础版本就一段很简单的代码。虽然简单,但如果这个模板或者数据发生变化,还是要改来改去的,所以本文就在基础版本上进行改进,只需要动动鼠标就可以填充大量数据到Excel工作表中。

GUI界面设计

GUI是用PySimpleGUI库创建的,安装命令直接用pip命令安装即可!

在开始设计GUI界面时,要明确我们需要实现什么功能,可以先设计出图纸,再动手去写代码!本文根据需求,最后得出以下GUI界面图纸:

GUI界面中按钮和框的一些功能:

  • 通过打开文件按钮选择数据文件或者在输入框中输入数据文件文件路径,但只支持csvxlsxxls格式的文件,并把数据文件中的列标题传入选择或输入数据列标题框中。
  • 通过打开模板按钮选择模板文件或者在输入框中输入模板文件的路径,只支持xlsxxls格式的文件,并把模板表格中的空白单元格坐标传入选择或输入单元格坐标框中。
  • 通过选择或输入数据列标题框选择要填充的数据列。
  • 通过选择或输入单元格坐标框选择各个数据列填充的位置。
  • 通过继续按钮把数据列标题和单元格坐标存储入列表中。
  • 通过开始填充按钮开始填充数据。
  • 通过信息展示框展示操作信息。
  • 当数据列标题和单元格坐标选择错误时,可以通过删除元素按钮删除列表中的错误数据。
  • 通过退出程序按钮直接结束工具的运行

根据图纸和基本功能思路最后得出以下代码:

# 主题设置
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('文件不存在,请重新选择文件')

继续选择按钮只要实现的是:获取用户在选择或输入数据列标题框选择或输入单元格坐标框一次次输入的内容,存储到valuelistkeyslist列表中:

 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表格的工具,解放双手!相关推荐

  1. c#使用NPOI批量导出数据到excel表格里

    背景 我之前是做的Java开发的相关工作,c#开发还是第一次. 公司有这个需求,只好研究一下了. 我接手的是别人开发过两个报表的小玩意,万事开头难,刚开始为了搞清楚这些代码的意思走了不少弯路,下面说说 ...

  2. php批量导出excel表格,PHP批量导出数据为excel表格

    之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...

  3. python如何把数据写入excel表格中指定列

    Python可以使用openpyxl库来将数据写入Excel表格中指定的列.如果要将数据写入指定的列中,可以使用如下代码:worksheet.write(row_index, column_index ...

  4. 从浏览器里面的数据导出数据到Excel表格

    从浏览器里面的数据导出数据到Excel表格 开发工具与关键技术:Visual Studio 2015 作者:李仁海 撰写时间:2019.5.5 一. 导出数据到Excel表格 1. public.加上 ...

  5. python手撕分水岭算法

    python手撕分水岭算法 1 分水岭算法实现 主要思路就是: 利用一个优先队列与有序队列(有序队列其实可以不用).优先队列是按像素的灰度值排列的,灰度值低的先被淹. 通过统计像素的附近的点的标记种类 ...

  6. python写的一个-批量下载股票年报的小工具

    python写的一个-批量下载股票年报的小工具 from urllib import request import requests import os import openpyxl# print( ...

  7. 使用python将数据导出excel表格

      python可用于数据分析,有时候获得了数据需要导出以作其他作用.本文就介绍python导出excel表格的方法.   导出excel表格,python提供了两个库:xlwt,xlrd.本文只讨论 ...

  8. 7.3 MASS批量修改数据(Excel文件上传数据)

    7.3 MASS批量修改数据(Excel文件上传数据) 步骤1:输入事务码MASS进入 1处,输入需要修改的对象类型(参见对象类型清单) 2处,点击"执行"按钮 步骤2:选择需要修 ...

  9. python追加写入数据到excel表格

    目录 一.脚本结构 二.使用的模块 三.脚本实现 1.实时信息的获取 2.数据的记录 最近几周的测试工作中,有一项内容是需要不断地从界面上获取信息,所以我研究了一下 " 利用接口先将信息获取 ...

  10. Python爬虫项目:爬取JSON数据存储Excel表格与存储图片

    随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战.搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Googl ...

最新文章

  1. linux执行命令时报错:permission denied
  2. UA MATH566 统计理论 证明UMVUE的方法
  3. 10月网民上网高峰时段为晚上8点 比例升至6.64%
  4. linux 解压tar.jz,linux系统压缩文件和解压缩命令
  5. 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...
  6. VC编写程序在debug下正常,在release下错误
  7. 【设计模式】 模式PK:命令模式VS策略模式
  8. c语言字符合法,C语言字符数据的合法形式
  9. ssm整合之配置applicationContext-service.xml
  10. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
  11. 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
  12. warning: setUpNet DNN module was not built with CUDA backend; switching to CPU错误解决
  13. 4.s(15): error: A1867E: Immediate 0x00000002 out of range for this operation. Permitted values are
  14. 小红书api_【实习精选】oppo、小红书等名企实习汇总(96)
  15. 浏览器被23545等网站劫持,以Chrome为例亲测有效的两个解除劫持的方法
  16. fafa什么意思_Fafa是什么意思
  17. 项目干系人包括的人群
  18. MySQL建员工表案例
  19. win10系统休眠文件删除
  20. Java web项目创建笔记23 之《spring整合xxl-job》

热门文章

  1. Birt分类汇总报表(CUBES)空值转换为0
  2. PM、PO、PO、PMO、PMP的区别和介绍
  3. 英语词根研究和单词记忆
  4. 【戴明环】PDCA-问题闭环思维模型
  5. 华为路由器显示连接到服务器失败怎么办,华为路由器设置好了不能用怎么办 华为路由器无法上网问题-192路由网...
  6. 统计学的Python实现-005:最大值、最小值、极差
  7. java开发坦克大战小游戏
  8. 如何制作Excel表头
  9. 第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列
  10. L08-Linux解决Device eth0 does not seem to be present,delaying initialization问题