使用openpyxl库在Python中删除指定行的Excel处理方法

本文给出了用openpyxl删除excel满足指定条件的行或列的正确示范,同时给出了一些网络资料的常见错误供读者参考

1.正确示范✔

  • 因为需要删除的行数不固定,正确示范应该采用while循环来遍历excel表,方便删除操作,网络上很多教程采用for循环,存在循环过程中行号改变的错误

  • 以下例子的功能为删除第五列为 True 的行,使用时需自行按照需求自行更改行列值和判断条件

  • from openpyxl import Workbook, load_workbook
    excel_path = 'xxxx.xsl'
    wb = load_workbook(excel_path)
    ws=wb.active
    max_row_num = ws.max_row #最大行数
    i = 0
    #以下例子的功能为删除第五列为 xxx 的行,使用时需自行按照需求自行更改行列值和判断条件
    row_n = 1 #起始行
    col_n = 5 #目标列
    while i < max_row_num:
        if ws.cell(row=row_n,column=col_n).value == 'xxx':
            ws.delete_rows(row_n)
        else:
            # print(ws.cell(row=row_n,column=5).value,row_n,sep='\t')
            row_n+=1
        i+=1
    wb.save(filename='xxxx.xlsx')
    wb.close    
    

    思路二:

  • 先遍历一遍把要删除的行号记录下来
  • 然后采用逆序删除,先删除行号大的,从下往上删
  • from openpyxl import load_workbook
    
    # 基于ws删除一些行和一些列,注意没有备份,
    def del_ws_rows_cols(ws, rowd, cold):  # 删除一些行和一些列,此程序不含保存操作。
        """基于ws删除一些行和一些列
        要删的行序数放在rowd表格中,要删的列序数放在cold表格中
        本程序的关键是删除的行或列序数都必须是从大的开始删除,这样才不会乱序"""
        # wb = load_workbook(flname)
        # ws = wb[sheetname]   
        rowd = sorted(rowd, reverse=True)  # 确保大的行数首先删除
        cold = sorted(cold, reverse=True)  # 确保大的列数首先删除
        for r in rowd:                     # rowd格式如:[1,3,5],表示要删除第1、3、5共三行。
            ws.delete_rows(r)
        for c in cold:                     # cold格式如:[2,6,10],表示要删除第2、6、10共三列
            ws.delete_cols(c)
        wb.save(flname)  # 记得要保存。
    
    
    # 基于文件名和表格名删除一些行和一些列,注意没有备份。
    # flsh是指文件名flname和表格名sheetname
    def del_flsh_rows_cols(flname, sheetname, rowd, cold):  # 基于文件名和表格名删除一些行和一些列
        """基于文件名和表格名删除一些行和一些列
        要删的行序数放在rowd表格中,要删的列序数放在cold表格中
        本程序的关键是删除的行或列序数都必须是从大的开始删除,这样才不会乱序"""
        wb = load_workbook(flname)
        ws = wb[sheetname]
        rowd = sorted(rowd, reverse=True)
        cold = sorted(cold, reverse=True)
        for r in rowd:
            ws.delete_rows(r)
        for c in cold:
            ws.delete_cols(c)
        wb.save(flname)  # 记得要保存。
    

    2.错误示范❌

    错误示范一:

    #coding:utf-8
    import openpyxl
    wb=openpyxl.load_workbook(filename='xxxxxx.xlsx')
    ws=wb.active
    for i in range(1,ws.max_row,1): #从第一行开始到最后一行逐行进行
        if ws.cell(row=i,column=1).value=='序号': #如果该行第一列值为‘序号’
            ws.delete_rows(i) #则删除该行
            print('删除第-',i,'-行成功!')
    wb.save(filename='yyyyyyy.xlsx')
    

    错误示范二:

    #coding:utf-8
    import openpyxl
    wb=openpyxl.load_workbook(filename='xxxxxx.xlsx')
    ws=wb.active
    row_number=0
    for row in ws.iter_rows():#迭代遍历每行
        if row[1].value=='序号':#给定的条件,读者可根据自身需求自定义
            row_number=row[1].row#关键步骤!获得当前行的行号!
            ws.delete_rows(row_number)
    wb.save(filename='yyyyyyy.xlsx')
    wb.close
    

    这两种错误示范都是用了for循环,在遍历的过程中因为删除导致行号改变了,而遍历的行号仍然按照原始数据的行号,导致有部分数据被跳过

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用openpyxl库在Python中删除指定行的Excel处理方法

    发表评论