使用Xlwings删除指定区域全空行的代码性能优化求助
优化Xlwings删除指定区域全空行的性能方案
原代码性能差的核心原因是逐单元格读取值,每次cell.value都是一次Python与Excel的跨进程交互,几万行×几百列的场景下,交互次数会达到数百万次,直接拖慢速度。以下是针对性的优化方案:
核心优化思路
- 批量读取所有数据到Python内存,仅一次Excel交互
- 在Python中快速筛选全空行
- 批量合并连续空行后删除,减少Excel操作次数
优化后代码
import xlwings as xw wb = xw.Book("example.xlsb") ws = wb.sheets[1] del_rng = ws.range("A8:DW91242") # 关闭Excel屏幕更新,避免界面刷新消耗性能 ws.api.Application.ScreenUpdating = False # 一次性读取指定区域的所有数据到Python二维列表(仅1次Excel交互) data = del_rng.value start_excel_row = del_rng.row # 获取区域起始行号(这里是8) # 筛选出所有全空行对应的Excel实际行号 empty_excel_rows = [] for row_idx, row_data in enumerate(data): # 检查该行所有单元格是否均为空 if all(cell is None for cell in row_data): empty_excel_rows.append(start_excel_row + row_idx) # 从大到小排序空行号,避免删除行后后续行号错位 empty_excel_rows.sort(reverse=True) # 批量合并连续行,减少删除操作次数 if empty_excel_rows: current_start = empty_excel_rows[0] current_end = current_start for row in empty_excel_rows[1:]: if row == current_end - 1: current_end = row else: # 删除当前连续空行范围 ws.range(f"{current_end}:{current_start}").delete() current_start = row current_end = row # 处理最后一组连续空行 ws.range(f"{current_end}:{current_start}").delete() # 恢复屏幕更新 ws.api.Application.ScreenUpdating = True
优化点说明
- 批量读取数据:
del_rng.value直接将整个区域的数据一次性导入Python,替代原代码中逐单元格读取的逻辑,彻底减少跨进程交互次数。 - 合并连续行删除:将连续的空行合并成一个范围删除,比如原本要删除10次,合并后可能只需要2-3次,大幅降低Excel操作开销。
- 关闭屏幕更新:临时关闭Excel的界面刷新,避免大量删除操作导致的屏幕闪烁,进一步提升运行速度。
内容的提问来源于stack exchange,提问作者Biplab1985
相关产品推荐
相关产品推荐

