本文给出了用openpyxl
删除excel满足指定条件的行或列的正确示范,同时给出了一些网络资料的常见错误供读者参考
1.正确示范✔
-
因为需要删除的行数不固定,正确示范应该采用
while
循环来遍历excel表,方便删除操作,网络上很多教程采用for
循环,存在循环过程中行号改变的错误 -
以下例子的功能为删除第五列为 True 的行,使用时需自行按照需求自行更改行列值和判断条件
from openpyxl import Workbook, load_workbookexcel_path = 'xxxx.xsl'wb = load_workbook(excel_path)ws=wb.activemax_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+=1wb.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和表格名sheetnamedef 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-8import openpyxlwb=openpyxl.load_workbook(filename='xxxxxx.xlsx')ws=wb.activefor 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-8import openpyxlwb=openpyxl.load_workbook(filename='xxxxxx.xlsx')ws=wb.activerow_number=0for 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
循环,在遍历的过程中因为删除导致行号改变了,而遍历的行号仍然按照原始数据的行号,导致有部分数据被跳过
来源地址:https://blog.csdn.net/weixin_44493291/article/details/128617507