Python Excel生成自动序号列:每行递增1从1开始
用openpyxl在表最前面加一列自动序号,从1开始逐行递增,适合导出报表时给用户一个稳定的行号,附完整代码。
场景痛点
导出的报表没有序号,同事找第几行全靠肉眼数。手动在第一列拖 1、2、3 到几百行,拖错一格就乱。用 openpyxl 在最前面插一列「序号」,从 1 开始逐行递增,过滤、筛选后顺序也稳。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def add_serial_column(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 在最前面插入一列,作为序号列
ws.insert_cols(idx=1, amount=1)
ws.cell(row=1, column=1, value="序号")
# 2) 从第 2 行开始逐行写序号,遇到整行空就跳过
serial = 1
for row in range(2, ws.max_row + 1):
# 判断这一行是不是空行:除序号列外任意列有值才算有效行
row_has_value = any(
ws.cell(row=row, column=col).value not in (None, "")
for col in range(2, ws.max_column + 1)
)
if row_has_value:
ws.cell(row=row, column=1, value=serial)
serial += 1
# 空行不写序号,留空
# 3) 序号列窄一点就行
ws.column_dimensions["A"].width = 6
print(f"共写入 {serial - 1} 个序号")
wb.save(file_path)
if __name__ == "__main__":
add_serial_column(r"D:\reports\销售明细.xlsx")
代码讲解
ws.insert_cols(idx=1, amount=1)在 A 列前插一空列,把原表整体右移;然后把 A1 写成「序号」表头。- 从第 2 行开始遍历,用一个计数器
serial从 1 开始递增。 - 每行先检查除序号列外有没有值:有值才写序号并
serial += 1,空行跳过不写,这样序号是连续的 1、2、3……而不是被空行打断。 - 序号列宽度设成 6,刚好放下三位数字。
- 如果你就是要按行号硬编(不管空行),把判断去掉,直接
ws.cell(row=row, column=1, value=row - 1)。
运行结果
打开文件,最左边多出一列「序号」,表头下从 1 开始逐行递增,每一条数据一个号;空行不占号。A 列宽度收窄,整体美观。
注意事项
- 插入列后原来的列号全部右移一位,后续再按列名找列时要重新读表头,别用旧列号。
- 序号是写死的数值,不是 Excel 的
ROW()公式;筛选/排序后序号不会自动跟着变,这通常是好事,因为它代表导出时的原始顺序。 - 想让序号跟着筛选走,可以写公式
=ROW()-1而不是写死数字,按需选择。 - 空行判断里把空字符串也当成空,避免「看起来空其实有个空格」的行被算成有效行。
- 已经有序号列的表再跑一次会插出第二列序号,注意别重复执行。

更新时间:2026-09-15 09:14:56