前言
实习时公司要求将一堆excel表的数据通过筛选写入到一个新的表中,考虑到工作量之大,写了比较简易的脚本,不是特别的完善。因为各表中的数据格式不一,很难写一个较完整的脚本,只能通过不断调试来完成表格,但还是缩减了我个人的工作量。
环境
Python 3.7.9
导入插件 pip install openpyxl==3.1.1
脚本编写
- 加载好对应的表格。wb2我没有做一个列表将所有表格放入进行循环匹配,因为所有表格格式、对应行数、匹配文字都不一样!如果要做成列表调试就更繁琐了。这里则采用手动去更改wb2的表格,每导入到wb1一次就需要自行更改wb2成下一个你需要导入的表格名称。
from openpyxl import load_workbook # 加载Excel文件 wb1 = load_workbook('D:/Users/Desktop/该表负责收集数据.xlsx')#即模板 wb2 = load_workbook('C:/reno/从该表中筛选数据.xlsx')#需要筛选的数据
- 选择工作表。excel表中有多个活动工作表,你需要指定你要进行筛选数据的工作表
ws1 = wb1.active # 默认第一个表是活动工作表 ws2 = wb2['4G常规温升'] # 假设4G常规温升表是活动工作表
-
指定列的索引,根据实际情况调整。下面是你需要指定哪一行哪一列的数据进行比较筛选,以及对应哪一行列的文字匹配。
target_col_index = 2 # wb2表需要匹配目标的文本在第二列 target_col_index1 = 1 # wb1表需要匹配目标的文本在第一列 k_col_index = 10 # 正上 k列的数据 m_col_index = 12 # 正下 m列的数据 o_col_index = 14 #背面 o列的数据 s_col_index = 18 # 侧上 s列的数据 u_col_index = 20 # 侧下 u列的数据 result_col_index = 13 # 写入ws1表的第12列
例如wb1表的第一列是这样的:
- 指定文本。也就是上列出现的场景,你要在列表里列举出来以便后面循环遍历的时候能够在对应的场景进行数据筛选。
# 指定文本 target_texts =['4G微信视频','4G腾讯视频','待机充电标配充电(非极速)','待机充电标配充电(极速)','30℃待机充电标配充电','手机搬家标配充电','待机充电标配充电']
-
正片开始。使用无限for循环大法(脑袋不想想那么多逻辑了,直接无脑循环)
# 遍历第一个表,找到包含指定文本的单元格 for target_text in target_texts: for row in range(1, ws2.max_row + 1): # 假设第二行为标题行 cell = ws2.cell(row=row, column=target_col_index) if cell.value == target_text:# 找到文字匹配的行,获取行号 row_num = cell.row # 转换为行号 # 在第二个表中找到对应的行 k_value = ws2.cell(row=int(row_num), column=k_col_index).value m_value = ws2.cell(row=int(row_num), column=m_col_index).value o_value = ws2.cell(row=int(row_num), column=o_col_index).value s_value = ws2.cell(row=int(row_num), column=s_col_index).value u_value = ws2.cell(row=int(row_num), column=u_col_index).value # 比较数值大小,筛选大的值 if str(k_value) > str(m_value): result_text = str(k_value) else: result_text = str(m_value) if str(s_value) > str(u_value): result_text1 = str(s_value) else: result_text1 = str(u_value) for row in range(1, ws1.max_row + 1): # 假设第一行为标题行 cell = ws1.cell(row=row, column=target_col_index1) if cell.value == target_text:# 找到文字匹配的行,输出到ws1表中对应的行列 ws1.cell(row=row, column=result_col_index).value = result_text ws1.cell(row=row+1, column=result_col_index).value = o_value ws1.cell(row=row+2, column=result_col_index).value = result_text1 # 保存修改后的第一个Excel文件 wb1.save('D:\原始数据收集.xlsx')
总结
调试过程还是比较繁琐,不适合短作业用,如果有大量的表格数据需要进行筛选可以考虑采用。