当前位置:网站首页>【.NET Core】使用 NPOI 读写Excel 文件

【.NET Core】使用 NPOI 读写Excel 文件

2022-08-10 23:48:00 又被平均了

在这里插入图片描述
今天在本文中,我们将看到使用 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 文件

原网站

版权声明
本文为[又被平均了]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44231544/article/details/126269382