运行环境:win10 64位,Jupyter Notebook,openpyxl
一、需求概述
针对源系统下载导出的一张20w行的EXCEL表,把S列仅含“手机”的行挑出来,将该行的A列到R列复制给下一行后,删除该行。
二、需求分析
【方案一】原表上delete_rows( )删除条件行
找出S列中仅含“手机”的行并复制A:R列单元格到下一行,再使用delete_rows( )函数删除该行。(未采用,处理速度太慢,20w行用此方法太慢,网上资料意思是没删除一行都要重新刷新整表)
【方案二】复制到新表,for循环中用continue跳过条件行
使用复制的方式,即创建新表,把符合条件的行复制给新表。步骤1:找出S列中仅含“手机”的行并复制A:R列单元格到下一行;步骤2:遍历找出S列中仅含“手机”的行并跳过复制。
三、代码实现
【方案一】(本例中太慢,弃用)
import openpyxl
#参数配置
COL_NUM = 19 #设置条件列号,S列是19,读者可根据自身需求自定义
KEY_WORD = "手机" #设置判断条件,读者可根据自身需求自定义
INPUT_FILE = 'test_file.xlsx' # 输入文件名
OUTPUT_FILE = 'test_final.xlsx' # 输出文件名
wb=openpyxl.load_workbook(filename='INPUT_FILE')
ws=wb.active
row_number=0
row_sum = ws.max_row
k = 0
#找出S列中仅含“手机”的行并复制A:R列单元格到下一行
for i in range(1,row_sum+1):
if ws1.cell(row=i,column=COL_NUM).value == KEY_WORD:
for j in range(1,COL_NUM):
ws.cell(row=i+1,column=j).value = ws.cell(row=i,column=j).value #将前18列复制到i+1行
# k = k + 1
# print("Step1:已完成复制-",k,"- 行")
for row in ws.iter_rows(): #迭代遍历每行
if row[COL_NUM-1].value == KEY_WORD:
row_number = row[COL_NUM-1].row #关键步骤!!获得当前行的行号!!!
ws.delete_rows(row_number)
print(row_number)
wb.save(filename='OUTPUT_FILE')
【方案二】
#%%time
import openpyxl
#参数配置
COL_NUM = 19 #设置条件列号,S列是19,读者可根据自身需求自定义
KEY_WORD = "手机" #设置判断条件,读者可根据自身需求自定义
INPUT_FILE = 'test_file.xlsx' # 输入文件名
OUTPUT_FILE = 'test_final.xlsx' # 输出文件名
#打开待复制表
wb1 = openpyxl.load_workbook(INPUT_FILE)
ws1 = wb1.active
# 创建新的空表
wb2 = openpyxl.Workbook()
ws2 = wb2.active
row_sum = ws1.max_row
k = 0
m = 0
#找出S列中仅含“手机”的行并复制A:R列单元格到下一行
for i in range(1,row_sum+1):
if ws1.cell(row=i,column=COL_NUM).value == KEY_WORD:
for j in range(1,COL_NUM):
ws1.cell(row=i+1,column=j).value = ws1.cell(row=i,column=j).value #将前18列复制到i+1行
# k = k + 1
# print("Step1:已完成复制-",k,"- 行")
#找出S列中仅含“手机”的行并跳过
#openpyxl的delete_row函数太慢,每删除一行都会刷新原表
for row_value in ws1.values:
if row_value[18] == KEY_WORD:
# m = m + 1
continue
ws2.append(row_value)
# print("Step2:已删除-",m,"- 行")
wb2.save(OUTPUT_FILE)
#print("Step3:新的EXCEL已生成,耗时:")