Xlsxwriter未给数据集首行添加边框问题排查求助
问题原因
你的代码存在索引匹配错误:
- 你通过
df.to_excel(..., startrow=3)把数据集首行写入了Excel第4行(对应代码里的row=3) - 但后续循环中仅对
row >=4的单元格添加边框格式,导致row=3(数据首行)完全未被处理,保留了初始无格式状态,因此没有边框。
修复方案
调整循环的行判断逻辑,将数据首行(row=3)纳入边框处理范围,同时修正df.iloc的索引计算:
修改后的完整代码
import pandas as pd import io # 示例数据集(可替换为你的实际数据) df = pd.DataFrame({ 'col1': [1,2,3], 'col2': [4,5,6], 'col3': [7,8,9], 'col4': [10,11,12], 'col5': [13,14,15], 'col6': [16,17,18], 'col7': [19,20,21], 'col8': [22,23,24], 'col9': [25,26,27], 'col10': [28,29,30] }) # In-memory buffer output = io.BytesIO() with pd.ExcelWriter(output, engine='xlsxwriter') as writer: # 数据写入Excel第4行(代码索引3) df.to_excel(writer, sheet_name='Sheet1', startrow=3, startcol=1, index=False, header=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] # 定义格式 header_format = workbook.add_format({'bold': True, 'align': 'center', 'valign': 'vcenter', 'border': 1}) subheader_format = workbook.add_format({'bold': True, 'align': 'center', 'border': 1}) bordered_format = workbook.add_format({'border': 1}) # 合并表头(Excel第2行) worksheet.merge_range('F2:G2', 'portfolio', header_format) worksheet.merge_range('H2:I2', 'inversion information', header_format) worksheet.merge_range('J2:K2', '% of inversion', header_format) # 写入列标题(Excel第3行,代码索引2) start_col = 1 # B列 for col_num, column_name in enumerate(df.columns): worksheet.write(2, col_num + start_col, column_name, subheader_format) # 获取数据维度 num_rows, num_cols = df.shape first_row = 1 # 合并表头行(Excel第2行) last_row = 3 + num_rows - 1 # 修正:数据最后一行索引为startrow + 行数 -1 first_col = start_col last_col = start_col + num_cols - 1 # 批量添加边框 for row in range(first_row, last_row + 1): for col in range(first_col, last_col + 1): if row >= 3: # 从数据首行(代码索引3,Excel第4行)开始处理 # 索引修正:row=3对应df的第0行,用row-3定位 value = df.iloc[row - 3, col - start_col] worksheet.write(row, col, value, bordered_format) elif row == 2: continue # 列标题已设置格式,跳过 elif row == 1 and col < 5: # 合并表头前的空单元格添加边框 worksheet.write_blank(row, col, None, bordered_format) # 保存文件 with open('mypath/rbd_inversion.xlsx', 'wb') as f: f.write(output.getvalue())
关键修改点
- 行判断条件从
row >=4改为row >=3,确保数据首行被处理 df.iloc索引从row-4改为row-3,匹配代码行索引与df的行对应关系- 修正
last_row计算,避免循环处理超出数据范围的空行
内容的提问来源于stack exchange,提问作者user22083723
相关产品推荐
相关产品推荐

