本文给出了用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循环,在遍历的过程中因为删除导致行号改变了,而遍历的行号仍然按照原始数据的行号,导致有部分数据被跳过