当前位置:网站首页>【.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 文件
边栏推荐
猜你喜欢
[C language] binary search (half search)
CDN原理与应用简要介绍
3. 容器功能
Web APIs BOM- 操作浏览器之综合案例
“蔚来杯“2022牛客暑期多校训练营3 DF题解
Why do programming languages have the concept of variable types?
2. 依赖管理和自动配置
9. Rest style request processing
In 22 years, the salary of programmers nationwide in January was released, only to know that there are so many with annual salary of more than 400,000?
回收站的文件删了怎么恢复,回收站文件恢复的两种方法
随机推荐
高校就业管理系统设计与实现
CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】
13. 内容协商
5. Lombok
Web-based meal ordering system in epidemic quarantine area
ROS Experimental Notes - Install QPEP and Intel-MKL
李彦宏拆墙交朋友,大厂“塑料友情”能否帮百度啃下硬骨头?
Geogebra 教程之 02 Geogebra初学者的 8 个基本要素
[Data Visualization] Chart Design Principles
Talking about jsfuck coding
10. 接收参数相关注解
Three-column layout implementation
C language% (%d,%c...)
【C语言】猜数字游戏的实现
12. Handling JSON
HGAME 2022 Final Pokemon v2 writeup
oai 采样频率计算
特殊类与类型转换
部分准备金银行已经过时
【C语言】数据储存详解