如果使用 Xlwings 的单元格范围内的所有单元格都是空的,则删除整行

Delete entire row if all cells are empty in range of cells using Xlwings

提问人:Biplab1985 提问时间:10/29/2023 更新时间:10/30/2023 访问量:45

问:

我有很多方法,但我正在努力提高这段代码的性能。任何替代方案请提出建议。 我正在尝试构建一个代码来删除整个行,如果一个范围内的所有单元格都是空的,到目前为止,我已经尝试了下面的代码,它工作正常,但性能非常慢

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()

XLWINGS公司

评论

0赞 mouwsy 11/2/2023
如果可能的话,我建议使用熊猫,它可能会更快。首先,使用 和 将数据加载到数据帧中,然后使用 df = df.dropna(how='all') 删除空行,然后使用 .import pandas as pddf = pd.read_excel("example.xlsb")df.to_excel("example_results.xlsx")

答:

0赞 lucs100 10/29/2023 #1

你定义的是一个非常大的范围,从 A8 到 DW91242 - 远远超过 1100 万个细胞。您可以使用自动调整到仅使用的数据,这将大大减少代码需要考虑的单元格数量:del_rngSheet.used_rangedel_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()