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

C# VSTO Excel:如何为ListObject创建多级表头?

Excel ListObject 多级表头实现方案

可行性说明

可行,但Excel的ListObject(表控件)原生不支持多级表头,需要通过在ListObject上方添加合并单元格的独立表头行来模拟实现多级效果,视觉上与ListObject的原生表头形成层级关系。

实现步骤与代码示例

以下以两种常用的C#操作Excel的库为例,给出具体实现:

方案1:使用EPPlus(无需安装Excel客户端)

先安装EPPlus NuGet包:Install-Package EPPlus

using OfficeOpenXml;
using OfficeOpenXml.Table;
using System.IO;

// 获取业务数据
var salesData = GetSalesList();

// 创建并操作Excel文件
using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("销售数据");
    
    // 1. 添加一级表头(第1行)
    worksheet.Cells["A1"].Value = "基础信息";
    worksheet.Cells["D1"].Value = "产品数据";
    // 合并对应单元格
    worksheet.Cells["A1:C1"].Merge = true;
    worksheet.Cells["D1:E1"].Merge = true;
    // 设置一级表头样式
    using (var header1Range = worksheet.Cells["A1:E1"])
    {
        header1Range.Style.Font.Bold = true;
        header1Range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
        header1Range.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
    }
    
    // 2. 创建ListObject(表),从第2行开始加载数据(包含原生表头)
    var tableRange = worksheet.Cells["A2"].LoadFromCollection(salesData, true, TableStyles.Medium2);
    var salesTable = worksheet.Tables[tableRange.Address];
    
    // 设置ListObject表头(二级表头)样式
    salesTable.HeaderRowRange.Style.Font.Bold = true;
    
    // 自动调整列宽
    worksheet.UsedRange.Columns.AutoFit();
    
    // 保存文件
    package.SaveAs(new FileInfo(@"C:\Temp\SalesReport.xlsx"));
}

方案2:使用Microsoft Office Interop Excel(需安装Excel客户端)

先添加对Microsoft.Office.Interop.Excel的引用。

using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;

// 获取业务数据
var salesData = GetSalesList();

// 启动Excel应用
var excelApp = new Application { Visible = true };
var workbook = excelApp.Workbooks.Add();
var worksheet = (Worksheet)workbook.Worksheets[1];

// 1. 添加一级表头(第1行)
worksheet.Cells[1, 1] = "基础信息";
worksheet.Cells[1, 4] = "产品数据";
// 合并单元格
worksheet.Range["A1:C1"].Merge();
worksheet.Range["D1:E1"].Merge();
// 设置一级表头样式
var header1Range = worksheet.Range["A1:E1"];
header1Range.Font.Bold = true;
header1Range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
header1Range.VerticalAlignment = XlVAlign.xlVAlignCenter;

// 2. 准备ListObject的二级表头与数据
var headers = new List<string> { "ID", "Sales", "Buyer", "ProductSoldQty", "ProductShipQty" };
// 写入二级表头(第2行)
for (int i = 0; i < headers.Count; i++)
{
    worksheet.Cells[2, i + 1] = headers[i];
}
// 写入业务数据(从第3行开始)
for (int rowIdx = 0; rowIdx < salesData.Count; rowIdx++)
{
    var item = salesData[rowIdx];
    worksheet.Cells[rowIdx + 3, 1] = item.ID;
    worksheet.Cells[rowIdx + 3, 2] = item.Sales;
    worksheet.Cells[rowIdx + 3, 3] = item.Buyer;
    worksheet.Cells[rowIdx + 3, 4] = item.ProductSoldQty;
    worksheet.Cells[rowIdx + 3, 5] = item.ProductShipQty;
}

// 3. 创建ListObject(表),包含二级表头与数据
var tableRange = worksheet.Range["A2:E" + (salesData.Count + 2)];
var salesTable = worksheet.ListObjects.Add(
    XlListObjectSourceType.xlSrcRange, 
    tableRange, 
    Type.Missing, 
    XlYesNoGuess.xlYes
);
salesTable.Name = "销售数据表";
salesTable.TableStyle = XlListObjectTableStyle.xlTableStyleMedium2;

// 自动调整列宽
worksheet.UsedRange.Columns.AutoFit();

注意事项

  • ListObject的原生表头始终为单行,多级效果是通过上方独立的合并行模拟,两者仅视觉关联,逻辑上是分开的。
  • 若需要表头随滚动固定,可设置冻结窗格:worksheet.Application.ActiveWindow.FreezePanes = worksheet.Cells[3, 1];(冻结前两行)。
  • 操作ListObject时,确保其区域不包含上方的一级表头行,避免破坏结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:45