openpyxl有关删除行的问题

新手哈,一起来讨论,错误之处麻烦点出来。

前段时间想用python来处理Excel,比来比去还是用openpyxl吧。发现导下来的发票数据表中有许多不规则的空行,想想很简单,就用for一下保存,结果只少了一行,度度上找来找去都说的是用这种方法。后来重新打开处理过的文件再for,。。。重复了好多次才删完。找原因啊,估计是内存中删除一行后行号什么都已经变了,后面就判断为不能删除的,所以一次是删不完了。那么我就用笨办法,先用fo滚一遍,把要删除的行号纳入列表,然后把列表倒序一下,再执行删除,结果OK了。

from openpyxl import load_workbook

wb = load_workbook('2022-01.xlsx')

l_empty = 0

t_empty = 0

emptyRowIndex = []  #这个用来存放准备删除的行号

for sheet in wb.sheetnames:

rows = wb[sheet].max_row

if rows == 1:      #我的表中只有一个表头,没有数据,所以删除整张表

wb.remove(wb[sheet])

else:      #这个表里是有数据,但是有不规则的空行,需要删除

for row in range(2, rows + 1):

# 获取每一行的单元格

row_cells = wb[sheet][row]

if all(cell.value is None for cell in row_cells):      #判断整行是否为空

#wb[sheet].delete_rows(row[0]) ======>>>>> 原来用这种方式删除行会导致行号不连续,导致后面行号不对,导致每次只能删除一两行,所以采用下面的方式

emptyRowIndex.append(row)

l_empty += 1

emptyRowIndex.sort(reverse=True) # 倒序删除 对需要删除的行号进行排序,从大到小这样才能正确删除指定的行

for l in emptyRowIndex:

wb[sheet].delete_rows(l)

print(sheet, ':::::',l_empty)

emptyRowIndex = []

t_empty += l_empty

l_empty = 0

wb.save('nnn/2022-01_01.xlsx')

print('Total empty rows deleted:', t_empty)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值