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