Python Excel插入行和列:insert_rows与insert_cols用法
用openpyxl的insert_rows、insert_cols在指定位置插入空行空列,已有数据自动下移右移,附完整代码。
场景痛点
表已经做好了,突然要在第 3 行前面塞一行「合计」,或者在 B 列前面插一列「备注」。手动点插入再往下拖格式,表多了就累。用 openpyxl 的 insert_rows、insert_cols,指定位置和数量,已有数据会自动下移、右移,不用自己搬。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def demo_insert(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 在第 3 行前面插入 1 行空行(原第 3 行及以后下移)
ws.insert_rows(idx=3, amount=1)
# 2) 在第 3 行插入 3 行
# ws.insert_rows(idx=3, amount=3)
# 3) 在第 2 列(B 列)前面插入 1 列空列
ws.insert_cols(idx=2, amount=1)
# 4) 给新插入的行/列填内容
ws.cell(row=3, column=1, value="小计")
ws.cell(row=3, column=2, value="—") # 因为刚插了一列,原来的B列现在是C列
ws.cell(row=3, column=3, value=6600.0)
ws.cell(row=1, column=2, value="备注") # 新插入的列的表头
# 5) 插入后列号会变化,注意引用顺序
print("当前最大列:", ws.max_column, "最大行:", ws.max_row)
wb.save(file_path)
print("插入完成")
if __name__ == "__main__":
demo_insert(r"D:\reports\销售明细.xlsx")
代码讲解
ws.insert_rows(idx=3, amount=1)在第 3 行前面插入amount个空行;原第 3 行及以后的数据整体下移,不会被覆盖。ws.insert_cols(idx=2, amount=1)在第 2 列(B 列)前面插入空列;原 B 列及以后的数据整体右移。- 关键坑:插入列之后,原来的列号会变。比如先
insert_cols(idx=2),原来的 B 列变成了 C 列,再写值时要按新列号写,别按旧的列号。 - 插入行列不会自动复制格式,新行/新列是空样式;需要的话再用前面讲过的字体、边框代码补样式。
- 插入操作对公式的影响:openpyxl 会尽量调整公式引用,但复杂公式可能不准,含大量公式的表建议先验证。
运行结果
打开文件,第 3 行变成空行(已填入「小计」),B 列变成新插入的「备注」空列,原来的数据整体下移一行、右移一列,没有覆盖。
注意事项
idx是从 1 开始的行号/列号,不是从 0 开始;insert_rows(idx=1)才是在最顶部插行。- 插入位置如果超出当前表范围,openpyxl 不会报错,但也不会自动扩展,建议先
print(ws.max_row, ws.max_column)看清楚。 - 插入行/列后,合并单元格、数据验证、图表的位置可能不会按预期移动,复杂表建议手动检查。
- 频繁插入大量行列性能较差,几万行表建议用 pandas 读出来处理后重写,而不是反复 insert。
- 插入后记得
wb.save,否则不落盘。

更新时间:2026-09-15 09:05:56
上一篇:Python Excel合并单元格与取消合并:merge_cells用法详解