使用xlwt库写Excel时如何从第二行开始写入避免覆盖表头
问题原因
- 核心是数据写入的行号计算逻辑错误:你用
int(i/5)计算行号时默认从第0行开始写入,刚好覆盖了第0行存储的表头内容 - 代码还存在变量拼写错误:定义表头行号时写的是
rom_num=0,后续调用用的是row_num,会出现变量未定义的异常;且循环里的row_num += 1没有被用到写入逻辑中,属于无效代码
修复方案
表头已经占用了第0行,所有业务数据要从第1行开始写入,只需要在计算数据行号时额外加1做偏移即可,同时修正变量拼写问题。
修复后代码
import xlwt from decimal import Decimal wb = xlwt.Workbook(encoding='utf-8') ws = wb.add_sheet('datas', cell_overwrite_ok=True) # 表头加粗样式 head_style = xlwt.XFStyle() head_style.font.bold = True columns = ['col1', 'col2', 'col3', 'col4', 'col5'] row_num = 0 # 修正变量拼写错误 # 写入表头(占第0行) for col_num in range(len(columns)): ws.write(row_num, col_num, columns[col_num], head_style) # 业务数据样式 data_style = xlwt.XFStyle() rows = [20, Decimal('50000.00'), Decimal('10.00'), Decimal('40000.00'), Decimal('90000.00'), 21, Decimal('31000.00'), Decimal('2000.00'), Decimal('41000.00'), Decimal('74000.00')] for i,e in enumerate(rows): # 行号 = 表头占用的1行 + 数据本身的行索引 cur_row = 1 + int(i/5) cur_col = int(i)%5 ws.write(cur_row, cur_col, e, data_style) wb.save('output.xls')
更易维护的写法建议
可以先把一维的业务数据按5个一组拆成二维数组,行号逻辑更清晰,不容易出错:
# 把一维数组按列数拆分,每行5个元素 row_datas = [rows[i:i+5] for i in range(0, len(rows), 5)] # 行号从1开始写入,跳过表头所在的第0行 for row_idx, row_data in enumerate(row_datas): for col_idx, val in enumerate(row_data): ws.write(row_idx + 1, col_idx, val, data_style)
内容的提问来源于stack exchange,提问作者D_P
相关产品推荐
相关产品推荐

