You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())

关键修改点

  1. 行判断条件从row >=4改为row >=3,确保数据首行被处理
  2. df.iloc索引从row-4改为row-3,匹配代码行索引与df的行对应关系
  3. 修正last_row计算,避免循环处理超出数据范围的空行

内容的提问来源于stack exchange,提问作者user22083723

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:05:55