使用封闭的 XML 编写 excel - 添加自定义列名

Writing a excel using closed XML - adding custom column names

我需要将 object 的列表写到 excel sheet 作为 table,其中每一列代表 object 属性或值.对于下面的方法,我在单独的列表中传递列名,在列表中传递数据 objects,我设法让数据显示如下,但我仍然无法让列正确显示。

我参考了以下文档,但找不到正确显示标题的方法。 https://github.com/closedxml/closedxml/wiki/Inserting-Tables

代码

public string CreateExcelFile<T>(IEnumerable<T> list, string sheetName, string headerTitle, List<string> titles, string fileName, string savedPath)
{
    var wb = new XLWorkbook();
    var ws = wb.Worksheets.Add(sheetName);

    ws.Cell(1, 1).Value = headerTitle;                  // sets excel sheet header

    var rangeTitle = ws.Range(3, 1, 3, titles.Count);   // range for row 3, column 1 to row 3, column titles.Count
    rangeTitle.AddToNamed("Titles");

    // Need to add columns names with in rangeTitle 
    //rangeTitle.InsertData(titles);

    // write data from row 4 onwards
    if (list != null && list.Any())
    {
        ws.Cell(4, 1).InsertData(list);                
    }
    else
    {
        ws.Cell(4, 1).Value = "No data to show";
    }

    // styles
    var titlesStyle = wb.Style;
    titlesStyle.Font.Bold = true;
    titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
    titlesStyle.Fill.BackgroundColor = XLColor.Amber;

    // style titles row
    wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle;

    ws.Columns().AdjustToContents();
    var filePath = savedPath + string.Format("{0}.xlsx", fileName);
    wb.SaveAs(filePath);

    return filePath;
}

输出excel

我正在尝试获取输出 - 我需要获取存储在黄色突出显示行的标题中的值。

有人能帮忙吗?

我通过执行以下操作设法让列显示。

// Need to add columns names with in rangeTitle 
for (int i = 0; i < titles.Count; i++)
{
    var columnNumber = i + 1;
    ws.Cell(3, columnNumber).Value = titles[i];
}

这暂时有效。但是,我想知道是否有更好的方法来做事(无需像上面那样手动分配列名)。

ws.Cell(3, 1).Value = new [] { titles };

如果将 Value 设置为数组,ClosedXML 会将数组中的每个 object 写入其自己的行,每列 object 中的一个 属性 . (参见 https://github.com/ClosedXML/ClosedXML/wiki/Copying-IEnumerable-Collections

在这种情况下,我们传入的数组只有一个 object – 标题数组。该内部数组被写入目标行,并且内部数组中的每个项目都被写入该行中的列。

您可以使用插入Table。数据插入为 Excel Table:

ws.Cell(1, 1).InsertTable(list.AsEnumerable());