Python Excel删除空行空列:清理脏数据一键搞定
用openpyxl扫描工作表,整行全空就删、整列全空就删,从下往上删避免行号错乱,附完整代码。
场景痛点
从系统导出的表,中间夹着好多空行,末尾还拖着几列全是空的辅助列;直接发给别人不专业,手动删又怕删到数据。用 openpyxl 扫一遍,整行所有单元格都空就删、整列全空就删,从下往上操作,干净利落。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def is_row_empty(ws, row_idx: int, max_col: int) -> bool:
for col in range(1, max_col + 1):
v = ws.cell(row=row_idx, column=col).value
if v is not None and str(v).strip() != "":
return False
return True
def is_col_empty(ws, col_idx: int, max_row: int) -> bool:
for row in range(2, max_row + 1): # 跳过表头,表头有列名不算空
v = ws.cell(row=row, column=col_idx).value
if v is not None and str(v).strip() != "":
return False
return True
def clean_empty(file_path: str) -> None:
wb = load_workbook(file_path)
for ws in wb.worksheets:
max_row, max_col = ws.max_row, ws.max_column
# 1) 从下往上删空行(保留第 1 行表头)
for row_idx in range(max_row, 1, -1):
if is_row_empty(ws, row_idx, max_col):
ws.delete_rows(idx=row_idx, amount=1)
# 2) 从右往左删空列
for col_idx in range(max_col, 0, -1):
if is_col_empty(ws, col_idx, ws.max_row):
ws.delete_cols(idx=col_idx, amount=1)
print(f"[{ws.title}] 清理完成,剩余 {ws.max_row} 行 {ws.max_column} 列")
wb.save(file_path)
print("空行空列已清理")
if __name__ == "__main__":
clean_empty(r"D:\reports\销售明细.xlsx")
代码讲解
is_row_empty检查某一行从第 1 列到最后一列,只要有一个格子不是None且去空格后不为空,就认为这行非空。is_col_empty类似,但从第 2 行开始检查,把表头排除——表头即使没值也不能删列。- 删除空行从下往上遍历(
range(max_row, 1, -1)),删掉一行后上面行号不变,不会漏判。 - 删除空列从右往左遍历(
range(max_col, 0, -1)),同样是为了列号不错乱。 - 删完行后
ws.max_row变小了,删列时用最新的ws.max_row重新算。 - 保留第 1 行表头,避免把列标题删掉。
运行结果
打开文件,中间的空行、末尾的空列都被清掉,数据行紧挨着表头;控制台打印每张表清理后的行列数。
注意事项
- 「空」的判定标准是「值为 None 或去空格后为空字符串」,如果你的空行里有公式、空格、特殊字符,可能判定不准,按需要调整
is_row_empty。 - 从下往上删行、从右往左删列是必须遵守的顺序,反了会漏删。
- 合并单元格的行/列如果参与了合并,删的时候可能报错,建议先取消合并再清理。
- 删完之后
ws.auto_filter.ref、图表范围可能还指着旧范围,建议清理完再重设一次筛选和打印区域。 - 大表逐格判断空值较慢,几万行也在可接受范围;更大的表用 pandas 处理更快。

更新时间:2026-09-15 09:09:29
上一篇:Python Excel删除行和列:delete_rows与delete_cols用法