python openpyxl 进阶版(批量数据筛选和写入)
上一篇文章讲述了openpyxl基本操作,包括openpyxl的安装,Excel文档、表格的打开,基本内容的写入和读取。这篇文章重点介绍openpyxl根据条件筛选,批量选取写入数据。
一、重点应用
现有表1表2,表内均有大量数据,现根据特定条件将表2内容写入表1中指定位置。
二、需要的工具
正则表达式re,用于筛选表格行数和列数。如果不懂re,也没有关系,本文只用re的匹配表达规则,是固定用法,大家看一遍记住即可。
三、正菜(实例操作)
1、话不多说,上表
2、工作要求:
现要求将表2中 “将X村” 人员的工资收入按 户主姓名 复制到 表1 中 相同 户主姓名 对应的 工资收 栏 里面
3、工作思路:
分析条件要求
第一步:找出表2中 “将X村”
第二步 : 在第一步的基础上,找出“户主姓名”一栏内容,与表1中“户主姓名”一栏匹配,如果名字相同,则开始赋值
4、代码:
1、基础代码:
引入第三方库 openpyxl,re;导入工作表
import re
import openpyxl
wb1 = openpyxl.load_workbook(r'C:\Users\Administrator\Desktop\表1.xlsx')
wb1book =wb1['附件2']
wb2 = openpyxl.load_workbook(r'C:\Users\Administrator\Desktop\表2.xlsx')
wb2book = wb2['附件2']
**‘附件2’**是表1,表2内的子工作表名字
2、找出表2中 “将X村”,并找到关键横坐标,即可选出所在“将X村”的户主姓名,因为他们横坐标相同,户主姓名纵坐标是固定的‘E’:
for i in wb2book['C']:
if i.value == '将X村':
print(i)
s = str(i)
s1 = re.match(r'(.+).C(\d+)>$', s)
s2 = int(s1.group(2))
wb2book['E%d'%(s2)]
在C列中找出值为 “将X村” 的单元格,通过 print 函数 打印,值为 <Cell ‘附件2’.C967>这样的数据,其中对我们有用的就是 C967,即符合条件的坐标,通过正则RE筛选出 横坐标(962) 并赋值给 s2 ,第一行的结果就是s2 = 967, wb2book[‘E%d’%(s2)] 就是全部在‘将X村’ 的 户主姓名
3、取 表1中 “户主姓名” 与 表2筛选出来的“户主姓名”匹配,如果相同,则对工资性收入赋值 并保存:
for j in wb1book['E']:
if j.value == wb2book['E%d'%(s2)].value: #wb2book['E%d'%(s2)]是上一步得出的
print(j)
l = str(j)
l1 = re.match(r'(.+).E(\d+)>$', l)
l2 = int(l1.group(2))
wb1book['H%d' % (l2)] = wb2book['H%d' % (s2)].value
wb1.save(r'C:\Users\Administrator\Desktop\表1.xlsx')
3、执行完的结果:
3、总结:
附全部代码
import re
import openpyxl
wb1 = openpyxl.load_workbook(r'C:\Users\Administrator\Desktop\表1.xlsx')
wb1book =wb1['附件2']
wb2 = openpyxl.load_workbook(r'C:\Users\Administrator\Desktop\表2.xlsx')
wb2book = wb2['附件2']
for i in wb2book['C']:
if i.value == '将X村':
s = str(i)
s1 = re.match(r'(.+).C(\d+)>$', s)
s2 = int(s1.group(2))
# print(wb2book['E%d'%(s2)])
for j in wb1book['E']:
if j.value == wb2book['E%d'%(s2)].value:
print(j)
l = str(j)
l1 = re.match(r'(.+).E(\d+)>$', l)
l2 = int(l1.group(2))
wb1book['H%d' % (l2)] = wb2book['H%d' % (s2)].value
wb1.save(r'C:\Users\Administrator\Desktop\表1.xlsx')
1、比较难理解的就是根据条件,选出对应的坐标,用于控制指定内容的选取和写入
2、这个例子掌握后,后面的“转移收入”和“财产收入”也可以一次性写入,大家可以尝试下
3、如果对RE不太了解,可以搜一下re教程,这属于固定用法。本文re主要用于在字符串中,筛选出对应的列坐标。