提问人:Biplab1985 提问时间:10/29/2023 更新时间:10/30/2023 访问量:45
如果使用 Xlwings 的单元格范围内的所有单元格都是空的,则删除整行
Delete entire row if all cells are empty in range of cells using Xlwings
问:
我有很多方法,但我正在努力提高这段代码的性能。任何替代方案请提出建议。 我正在尝试构建一个代码来删除整个行,如果一个范围内的所有单元格都是空的,到目前为止,我已经尝试了下面的代码,它工作正常,但性能非常慢
import xlwings as xw
wb=xw.Book("example.xlsb")
del_rng = wb.sheets[1].range("A8:DW91242")
for i in range(del_rng.shape[0],0,-1):
row=del_rng.rows[i-1]
if all(cell.value is None for cell in row):
row.delete()
答:
0赞
lucs100
10/29/2023
#1
你定义的是一个非常大的范围,从 A8 到 DW91242 - 远远超过 1100 万个细胞。您可以使用自动调整到仅使用的数据,这将大大减少代码需要考虑的单元格数量:del_rng
Sheet.used_range
del_rng
import xlwings as xw
wb=xw.Book("example.xlsb")
del_rng = wb.sheets[1].used_range
for i in range(del_rng.shape[0],0,-1):
row=del_rng.rows[i-1]
if all(cell.value is None for cell in row):
row.delete()
评论
0赞
Biplab1985
10/29/2023
不,性能仍然很慢。我可以为B列制作它吗,如果B列值中的单元格为空,请删除整行
0赞
lucs100
10/29/2023
这取决于这是否适用于您的用例。如果这是有效的,你可以尝试一下,看看它是否仍然很慢。
0赞
Biplab1985
10/29/2023
不,它没有帮助。仍然偏慢。这只是我许多项目的自动化之一。如果用户必须手动删除行,那么我无法在我的项目中提高效率 有没有其他方法可以加快执行速度,请建议
0赞
Biplab1985
10/30/2023
#2
如果这对其他人有帮助,我会花 2 天时间。
我创建了 2 个 LastRow Range 变量: Var 1 表示 A 列,它包含最后一行空白 Var 2 表示 B 列,用于保存空白行的起始行或非空行的末尾 然后我删除了范围
现在它删除得非常快
我使用了以下代码:
lastRow_A = wb.sheets[1].range(7,1).end('down').row
lastRow_A=lastRow_A-1
lastRow_B = wb.sheets[1].range(7,2).end('down').row
lastRow_B=lastRow_B+1
wb.sheets[1].range(f"A{lastRow_A}:B{lastRow_B}").api.EntireRow.Delete()
评论
df = df.dropna(how='all')
删除空行,然后使用 .import pandas as pd
df = pd.read_excel("example.xlsb")
df.to_excel("example_results.xlsx")