openpyxl设置行高后delete_rows无法彻底删除行的问题求助
解决openpyxl删除行后残留"幽灵空行"的问题
问题原因
当你通过row_dimensions设置或取消行高后,openpyxl会在工作表的row_dimensions字典中保留所有被操作过的行的维度记录。即使调用delete_rows删除了行,这些行维度元数据不会被自动清理,Excel读取文件时会根据这些元数据认为那些行依然存在,从而出现滚动条能滑到原最后一行的"幽灵空行"。
解决方案
删除行之后,手动清理row_dimensions中超出当前有效行范围的记录。因为删除行后,工作表的最大行号会更新,我们只需要保留行号≤当前最大行的维度信息即可。
修改后的代码
from openpyxl import Workbook # 创建工作簿并激活工作表 wb = Workbook() ws = wb.active # 写入测试数据 for row in range(1, 101): for col in range(1, 6): ws.cell(row=row, column=col).value = f"Cell {row}-{col}" # 设置行高 for row in ws.iter_rows(): ws.row_dimensions[row[0].row].height = 14.4 # 取消行高 for row in ws.iter_rows(): ws.row_dimensions[row[0].row].height = None # 删除指定行 ws.delete_rows(35, 100-35) # 关键:清理残留的行维度信息 max_row = ws.max_row # 遍历row_dimensions的键(转成列表避免遍历中修改字典报错) for row_num in list(ws.row_dimensions.keys()): if row_num > max_row: del ws.row_dimensions[row_num] # 保存工作簿 wb.save('test.xlsx')
验证效果
运行修改后的代码,打开生成的test.xlsx:
- 工作表中只有前34行有内容
- 滚动条只能滑到第34行,不会出现到原100行的空行残留
内容的提问来源于stack exchange,提问作者Officer Obie
相关产品推荐
相关产品推荐

