【问题标题】:Format a Excel Cell Range as a Table using NPOI使用 NPOI 将 Excel 单元格区域格式化为表格
【发布时间】:2020-12-07 09:05:29
【问题描述】:

我正在使用 NPOI 来处理 Excel(.xlsx) 文件数据和格式。我想知道是否有办法将单元格范围格式化为表格。

// something like.
ITable table = worksheet.FormatAsTable("A1:C4");

在互联网上做了一些研究,但还没有运气。任何帮助将不胜感激!

【问题讨论】:

  • This link 很有用:它是 Java POI 的示例,但 NPOI 是它的 .NET 端口,并且具有类似(如果不相同)的 API。
  • 有效!!非常感谢!!

标签: c# excel npoi


【解决方案1】:

[2021/05/28 更新]: 谢谢提醒。发现不设置ctTable的id、name和displayName会报这个错误Removed Part: /xl/tables/table1.xml part with XML error. (Table) Load error. Line 1, column 247.(下面的示例代码已修复)


根据@Gian Paolo 提供的评论和link,使用 NPOI 实现“格式为表格”的 C# 方法如下:

Install-Package NPOI -Version 2.5.3

// NPOI dependencies
using NPOI.OpenXmlFormats.Spreadsheet;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;


IWorkbook workbook = new XSSFWorkbook();
XSSFSheet worksheet = workbook.CreateSheet("Grades") as XSSFSheet;

InsertTestData(worksheet);

// Format Cell Range As Table
XSSFTable xssfTable = worksheet.CreateTable();
CT_Table ctTable = xssfTable.GetCTTable();
AreaReference myDataRange = new AreaReference(new CellReference(0, 0), new CellReference(3, 2));
ctTable.@ref = myDataRange.FormatAsString();
ctTable.id = 1;
ctTable.name = "Table1";
ctTable.displayName = "Table1";
ctTable.tableStyleInfo = new CT_TableStyleInfo();
ctTable.tableStyleInfo.name = "TableStyleMedium2"; // TableStyleMedium2 is one of XSSFBuiltinTableStyle
ctTable.tableStyleInfo.showRowStripes = true;
ctTable.tableColumns = new CT_TableColumns();
ctTable.tableColumns.tableColumn = new List<CT_TableColumn>();
ctTable.tableColumns.tableColumn.Add(new CT_TableColumn() { id = 1, name = "ID" });
ctTable.tableColumns.tableColumn.Add(new CT_TableColumn() { id = 2, name = "Name" });
ctTable.tableColumns.tableColumn.Add(new CT_TableColumn() { id = 3, name = "Score" });

using (FileStream file = new FileStream(@"test.xlsx", FileMode.Create))
{
    workbook.Write(file);
}
// Function to Populate Test Data
private void InsertTestData(XSSFSheet worksheet)
{
    worksheet.CreateRow(0);
    worksheet.GetRow(0).CreateCell(0).SetCellValue("ID");
    worksheet.GetRow(0).CreateCell(1).SetCellValue("Name");
    worksheet.GetRow(0).CreateCell(2).SetCellValue("Score");
    worksheet.CreateRow(1);
    worksheet.GetRow(1).CreateCell(0).SetCellValue(1);
    worksheet.GetRow(1).CreateCell(1).SetCellValue("John");
    worksheet.GetRow(1).CreateCell(2).SetCellValue(82);
    worksheet.CreateRow(2);
    worksheet.GetRow(2).CreateCell(0).SetCellValue(2);
    worksheet.GetRow(2).CreateCell(1).SetCellValue("Sam");
    worksheet.GetRow(2).CreateCell(2).SetCellValue(90);
    worksheet.CreateRow(3);
    worksheet.GetRow(3).CreateCell(0).SetCellValue(3);
    worksheet.GetRow(3).CreateCell(1).SetCellValue("Amy");
    worksheet.GetRow(3).CreateCell(2).SetCellValue(88);
}

结果:

【讨论】:

  • 我正在尝试您的方法,但是当我打开 excel 文件时出现此错误:“已删除部分:/xl/tables/table1.xml 部分带有 XML 错误。(表)加载错误。第 1 行,第 247 列。”
  • @RobNone 有同样的问题。你解决了吗?
  • @KamilSpisak 答案已更新,可以看看它是否有效。
  • @Rohim Chou 非常感谢,它的工作就像一个魅力!此外,我设法通过使用:ctTable.autoFilter = new CT_AutoFilter(); ctTable.autoFilter.@ref = myDataRange.FormatAsString(); 向标题添加过滤,然后结果看起来与问题的屏幕截图完全相同。
  • @KamilSpisak 以防万一有人来寻找过滤器,设置 @ref 道具对我不起作用。为了使过滤器正常工作,我必须执行以下操作:ctTableCatStat.autoFilter = new CT_AutoFilter();ctTableCatStat.autoFilter.filterColumn = new List&lt;CT_FilterColumn&gt;();ctTableCatStat.autoFilter.filterColumn.Add(new CT_FilterColumn() { colId = 1, showButton = true }); 最后一个只是对您要过滤的每一列重复
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多