
IronXL 和 NPOI 的比较
IronXL和 NPOI 都是无需 Office.Interop 即可运行的.NET Excel 库——无需安装 Microsoft Excel。 本比较涵盖了它们用于读取、写入和操作 Excel 文件的 API,并提供了开发人员最常遇到的操作的代码示例。
如何在 C# 中使用 Excel 的 NPOI
- 安装 C# 库以使用 NPOI 读取 Excel 文件
- 实例化XSSFWorkbook对象以存储 Excel 文件
- 使用
GetSheetAt方法获取指定的工作表 - 通过向
GetRow方法传递行索引来访问每一行。 - 使用
GetCell方法访问行中的每个单元格
什么是NPOI?
NPOI 是 POI Java 项目的 .NET 版本,网址为http://poi.apache.org/ 。 POI 是一个开源项目,可以帮助您读取/写入 xls、doc、ppt 文件。 它有着广泛的应用。
例如,你可以用它来:
- 在您的服务器上未安装Microsoft Office套件的情况下生成Excel报告,并比在后台调用Microsoft Excel ActiveX更高效
- 从 Office 文档中提取文本,以帮助您实现全文索引功能(此功能通常用于创建搜索引擎)。
- 从 Office 文档中提取图像 生成包含公式的Excel 表格。
NPOI 和 Excel
NPOI 是 Apache POI Java项目的 C# 移植版。 它是免费且开源的。 此外,它不需要互操作性,这意味着用户无需安装 Excel 即可使用该开发者的应用程序。
IronXL 和 Excel
IronXL 是一个适用于 VB 和 C# 的 Excel API。 使用 IronXL,您可以在 .NET 中读取、编辑和创建 Excel 电子表格文件。
NPOI 和IronXL有什么区别?
| NPOI | IronXL |
|---|---|
| 单元格范围 | 单元格范围 |
| 单元格样式(边框、颜色、填充、字体、数字、对齐方式) | 单元格视觉样式:字体、大小、背景图案、边框、对齐方式和数字格式。 |
| 公式计算 | 公式 |
| 数据验证 | 数据验证 |
| 条件格式 | 条件格式 |
| 图像 | 图像 |
| 图表 | 图表 |
表 1 - 功能对比
正在评估 IronXL 作为 NPOI 替代方案的团队可以通过30 天免费试用版测试完整的 API。
IronXL 和 NPOI 的安装
你可以通过手动下载、通过 NuGet 或使用 Visual Studio 中的 NuGet 包管理器来安装这两个库。 以下是简要概述; 有关分步操作指南,请参阅IronXL入门指南。
NPOI 安装
使用 NuGet 安装 NPOI
要通过 NuGet 安装 NPOI,请打开 Visual Studio 开发人员命令提示符并输入以下命令:

图 1 - NuGet NPOI 安装
Visual Studio NuGet 包管理器和 NPOI
请按照以下步骤通过 Visual Studio 中的 NuGet 包管理器安装 IronXL 或 NPOI:
在解决方案资源管理器中右键单击项目
- 选择"管理 NuGet 程序包"
- 浏览您的套餐
- 点击安装

图 2 - NPOI 的 NuGet 包管理器
IronXL 安装
下载 IronXL
要下载 IronXL,请访问以下网址并点击"下载"按钮。

图 3 - 下载 IronXL
使用 NuGet 安装 IronXL
要通过NuGet安装IronXL,请打开Visual Studio开发者命令提示符并输入以下内容:

图 4 - NuGet IronXL 安装
Visual Studio NuGet 包管理器和 IronXL
请按照以下步骤通过 Visual Studio 中的 NuGet 包管理器安装 IronXL:
在解决方案资源管理器中右键单击项目
- 选择"管理 NuGet 程序包"
- 浏览您的套餐
- 点击安装

图 5 - IronXL 的 NuGet 包管理器
使用 NPOI 和IronXL读取和写入 Excel 文件
使用 NPOI 读取 Excel 文件
以下代码演示了如何使用 NPOI 读取 Excel 文件并显示其内容。 添加以下代码并包含必要的命名空间:
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using System.IO;
using System.Collections.Generic;Imports NPOI.SS.UserModel
Imports NPOI.XSSF.UserModel
Imports System.Data
Imports System.IO
Imports System.Collections.Generic以下代码读取一个现有的 Excel 文件,并将其显示在数据网格视图中。
public void ReadExcelNPOI()
{
DataTable dtTable = new DataTable();
List<string> lstRows = new List<string>();
ISheet objWorksheet;
string strPath = @"c:\temp\NPOI_Test.XLSX";
// Use FileStream to open the Excel file
using (var fStream = new FileStream(strPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
fStream.Position = 0;
XSSFWorkbook objWorkbook = new XSSFWorkbook(fStream);
objWorksheet = objWorkbook.GetSheetAt(0);
IRow objHeader = objWorksheet.GetRow(0);
int countCells = objHeader.LastCellNum;
// Add columns to the DataTable based on the header row of Excel
for (int j = 0; j < countCells; j++)
{
ICell objCell = objHeader.GetCell(j);
if (objCell == null || string.IsNullOrWhiteSpace(objCell.ToString())) continue;
{
dtTable.Columns.Add(objCell.ToString());
}
}
// Add rows to the DataTable, looping through each row and cell
for (int i = (objWorksheet.FirstRowNum + 1); i <= objWorksheet.LastRowNum; i++)
{
IRow objRow = objWorksheet.GetRow(i);
if (objRow == null || objRow.Cells.All(d => d.CellType == CellType.Blank)) continue;
for (int j = objRow.FirstCellNum; j < countCells; j++)
{
ICell cell = objRow.GetCell(j);
if (cell != null && !string.IsNullOrEmpty(cell.ToString()) && !string.IsNullOrWhiteSpace(cell.ToString()))
{
lstRows.Add(cell.ToString());
}
}
if (lstRows.Count > 0)
dtTable.Rows.Add(lstRows.ToArray());
lstRows.Clear();
}
}
// Assuming dataGridView1 is a DataGridView control on a Form
dataGridView1.DataSource = dtTable;
}
private void button1_Click(object sender, EventArgs e)
{
ReadExcelNPOI();
}Public Sub ReadExcelNPOI()
Dim dtTable As New DataTable()
Dim lstRows As New List(Of String)()
Dim objWorksheet As ISheet
Dim strPath As String = "c:\temp\NPOI_Test.XLSX"
' Use FileStream to open the Excel file
Using fStream = New FileStream(strPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
fStream.Position = 0
Dim objWorkbook As New XSSFWorkbook(fStream)
objWorksheet = objWorkbook.GetSheetAt(0)
Dim objHeader As IRow = objWorksheet.GetRow(0)
Dim countCells As Integer = objHeader.LastCellNum
' Add columns to the DataTable based on the header row of Excel
For j As Integer = 0 To countCells - 1
Dim objCell As ICell = objHeader.GetCell(j)
If objCell Is Nothing OrElse String.IsNullOrWhiteSpace(DirectCast(objCell, Object).ToString()) Then
Continue For
End If
If True Then
dtTable.Columns.Add(DirectCast(objCell, Object).ToString())
End If
Next j
' Add rows to the DataTable, looping through each row and cell
For i As Integer = (objWorksheet.FirstRowNum + 1) To objWorksheet.LastRowNum
Dim objRow As IRow = objWorksheet.GetRow(i)
If objRow Is Nothing OrElse objRow.Cells.All(Function(d) d.CellType = CellType.Blank) Then
Continue For
End If
For j As Integer = objRow.FirstCellNum To countCells - 1
Dim cell As ICell = objRow.GetCell(j)
If cell IsNot Nothing AndAlso Not String.IsNullOrEmpty(DirectCast(cell, Object).ToString()) AndAlso Not String.IsNullOrWhiteSpace(DirectCast(cell, Object).ToString()) Then
lstRows.Add(DirectCast(cell, Object).ToString())
End If
Next j
If lstRows.Count > 0 Then
dtTable.Rows.Add(lstRows.ToArray())
End If
lstRows.Clear()
Next i
End Using
' Assuming dataGridView1 is a DataGridView control on a Form
dataGridView1.DataSource = dtTable
End Sub
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
ReadExcelNPOI()
End Sub使用 IronXL 读取 Excel 文件
以下代码演示了如何使用 IronXL 读取 Excel 文件并将其显示在数据网格视图中。 有关更多IronXL代码示例,请参阅文档。 添加以下代码并包含命名空间:
using IronXL;
using System.Data;Imports IronXL
Imports System.Data请注意其中包含 IronXL。 这是 IronXL 正常运行的必要条件。 添加以下几行:
private void button2_Click(object sender, EventArgs e)
{
// Load the Excel workbook
string strPath = @"c:\temp\NPOI_Test.XLSX";
WorkBook workbook = WorkBook.Load(strPath);
// Access the default worksheet
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert the worksheet to a DataTable
var dtTable = sheet.ToDataTable(true);
// Assuming dataGridView1 is a DataGridView control on a Form
dataGridView1.DataSource = dtTable;
}Private Sub button2_Click(ByVal sender As Object, ByVal e As EventArgs)
' Load the Excel workbook
Dim strPath As String = "c:\temp\NPOI_Test.XLSX"
Dim workbook As WorkBook = WorkBook.Load(strPath)
' Access the default worksheet
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the worksheet to a DataTable
Dim dtTable = sheet.ToDataTable(True)
' Assuming dataGridView1 is a DataGridView control on a Form
dataGridView1.DataSource = dtTable
End Sub如您所见,与 NPOI 的 40 多行代码相比, IronXL将读取和显示操作减少到大约 5 行代码,完全消除了手动行迭代和逐个单元格提取循环。 浏览IronXL的全部功能指南,了解更简化的常见 Excel 任务处理方法。
你应该选择哪个库?
NPOI 为.NET中的 Excel 操作提供了一个坚实、成熟的开源基础——它作为 Apache POI 的移植版本,受益于多年的社区贡献和广泛的格式覆盖。 对于主要需求是在免费的、社区驱动的软件包中读写电子表格的团队来说,NPOI 是一个可靠的选择。
团队经常遇到的摩擦点在于 NPOI 为常见操作需要编写大量的样板代码。 如上面的读取文件示例所示,IronXL 的方法只需要大约 5 行代码,而 NPOI 的方法需要 40 多行代码才能完成相同的操作——加载工作簿并将其显示在数据网格中——完全消除了手动行和单元格迭代循环。 减少代码表面积是一项投资,它能带来更轻松的维护和更少的漏洞藏身之处,从而获得回报。
IronXL还提供Professional支持、持续更新计划,以及直接向Iron Software工程师请求功能的功能。 社区驱动型项目在这方面提供了不同的权衡:更广泛的贡献者参与,但对具体问题的响应时间更难以预测。
除了许可费用之外,项目总成本还包括开发人员编写和维护 NPOI 底层 API 所需的额外样板代码所花费的时间,以及调试上述示例中显示的手动数据映射逻辑所花费的时间。 对于评估多年项目生命周期成本的团队来说,这些开发和维护成本通常会超过开源许可和商业许可之间的差异。
下载
该项目已在 GitHub 上开源:
IronXL 与 NPOI 对比示例准备好看看你的项目会有什么不同了吗? 立即开始为期 30 天的 IronXL 免费试用,在本地运行这些示例。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
相关文章



