新手哈,一起来讨论,错误之处麻烦点出来。
前段时间想用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)