今天在本文中,我们将看到使用 NPOI 在 C#.NET Core 中读取和写入 Excel 文件。在上一篇文章中,我们看到了OpenXML SDK(Microsoft 的开源 SDK)在 Office Word、Excel 和 PowerPoint 中的使用。我们还研究了另一个名为EPPlus的易于使用的库。
今天,在本文中,我们将从以下方面介绍NPOI的使用
- 创建 .NET Core 应用程序
- 配置 NPOI Nuget 包
- 读取 Excel 文件
- 编写 Excel 文件
如果有兴趣了解更多信息,请参阅以下参考资料。
我们将研究使用NPOI .NET Core 库处理excel 的一种更简单的方法。
请注意,无需安装 Microsoft Office 即可使用 C# 读取、创建 Excel 。今天,我们将看到一种可行且易于实施的方法。
入门
让我们创建一个 .NET Core 项目,您可以选择任何项目模板。这里我们将使用 . NET Core 3.1 或 .NET 5控制台项目。
NuGet 的包名称是 NPOI。让我们安装这个包,
PM> Install-Package NPOI -Version 2.5.1
或者请从 Nuget 包管理器安装,
注意:请使用最新的可用版本
让我们看一个简单的 Excel 文件,其中包含下面的列和行详细信息。让我们尝试使用我们的NPOI API 读取文件
使用NPOI读取 excel 文件的内容
POC 示例如下。这个即用型 API 可以在 .NET Core 控制台中使用,或者 可以根据您的要求修改或改进测试项目或 ASP.NET Core 应用程序或逻辑。
static string ReadExcel()
{
DataTable dtTable = new DataTable();
List<string> rowList = new List<string>();
ISheet sheet;
using (var stream = new FileStream("TestData.xlsx", FileMode.Open))
{
stream.Position = 0;
XSSFWorkbook xssWorkbook = new XSSFWorkbook(stream);
sheet = xssWorkbook.GetSheetAt(0);
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
if (cell == null || string.IsNullOrWhiteSpace(cell.ToString())) continue;
{
dtTable.Columns.Add(cell.ToString());
}
}
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row == null) continue;
if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
if (!string.IsNullOrEmpty(row.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(row.GetCell(j).ToString()))
{
rowList.Add(row.GetCell(j).ToString());
}
}
}
if(rowList.Count>0)
dtTable.Rows.Add(rowList.ToArray());
rowList.Clear();
}
}
return JsonConvert.SerializeObject(dtTable);
}
执行上述 API 后,可以轻松读取所有 Excel 详细信息。
- 在上面的示例中,我使用了文件“testdata.xlsx”作为输入。我已将此文件保存在输出目录bin\Debug\netcoreapp2.1 中。
- 此外,如果需要,您可以像 ex 一样将文件保存在本地。 字符串 strDoc = @”C:\Users\Public\Documents\testdata .xlsx ” 。
可以使用他们选择的映射逻辑将上述输出细节映射到相应的类对象。
使用NPOI将数据导出/写入 Excel 文件
现在我们来看看创建数据或将数据写入 Excel 文件。
下面是我们要保存为 Excel 文件的示例数据/对象。
我正在同一个项目文件夹中创建一个新的 Excel 文件以保持一切从简。(将在项目的“bin”文件夹中创建 Excel 文件)。完整的示例 API 如下所示。
static void WriteExcel()
{
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="1001", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="1002", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="1003", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="1004", Name="LMNO", City ="City4", Country="UK"},
};
// Lets converts our object data to Datatable for a simplified logic.
// Datatable is most easy way to deal with complex datatypes for easy reading and formatting.
DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
var memoryStream = new MemoryStream();
using (var fs = new FileStream("Result.xlsx", FileMode.Create, FileAccess.Write))
{
IWorkbook workbook = new XSSFWorkbook();
ISheet excelSheet = workbook.CreateSheet("Sheet1");
List<String> columns = new List<string>();
IRow row = excelSheet.CreateRow(0);
int columnIndex = 0;
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
row.CreateCell(columnIndex).SetCellValue(column.ColumnName);
columnIndex++;
}
int rowIndex = 1;
foreach (DataRow dsrow in table.Rows)
{
row = excelSheet.CreateRow(rowIndex);
int cellIndex = 0;
foreach (String col in columns)
{
row.CreateCell(cellIndex).SetCellValue(dsrow[col].ToString());
cellIndex++;
}
rowIndex++;
}
workbook.Write(fs);
}
}
执行“workbook.Write(fs)”后,会将文件保存到“bin”文件夹位置。您可以根据需要修改生成文件的位置。
执行上述 API 后,将创建一个新的 Excel 文件,并将上述自定义对象转换为相应的 Excel 列和行详细信息,如下所示
其他参考 :
使用 OpemXML SDK 读/写 Excel 文件 .NET Core
使用 EPPlus 在 .NET Core 中读取/写入 Excel 文件