openpyxl不使用delete_rows( )删除特定条件的行

   运行环境: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已生成,耗时:")

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值