栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

openpyxl不使用delete

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

openpyxl不使用delete

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/307428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号