跳至页脚内容
与其他组件比较
NPOI 与 IronXL 的比较

IronXL 和 NPOI 的比较

IronXL和 NPOI 都是无需 Office.Interop 即可运行的.NET Excel 库——无需安装 Microsoft Excel。 本比较涵盖了它们用于读取、写入和操作 Excel 文件的 API,并提供了开发人员最常遇到的操作的代码示例。

什么是NPOI?

NPOI is the .NET version of the POI Java project at http://poi.apache.org/. POI 是一个开源项目,可以帮助您读取/写入 xls、doc、ppt 文件。 它有着广泛的应用。

例如,你可以用它来:

  • 无需在服务器上安装 Microsoft Office 套件即可生成 Excel 报表,比在后台调用 Microsoft Excel ActiveX 更高效。
  • 从 Office 文档中提取文本,以帮助您实现全文索引功能(此功能通常用于创建搜索引擎)。
  • 从 Office 文档中提取图像 生成包含公式的Excel 表格。

NPOI 和 Excel

NPOI is a C# port of the POI Java project by Apache. 它是免费且开源的。 此外,它不需要互操作性,这意味着用户无需安装 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 开发人员命令提示符并输入以下命令:

Install-Package NPOI -Version x.x.x
Graphical user interfaceDescription automatically generated

图 1 - NuGet NPOI 安装

Visual Studio NuGet 包管理器和 NPOI

请按照以下步骤通过 Visual Studio 中的 NuGet 包管理器安装 IronXL 或 NPOI:

在解决方案资源管理器中右键单击项目

  • 选择"管理 NuGet 程序包"
  • 浏览您的套餐
  • 点击安装
A screenshot of a computerDescription automatically generated

图 2 - NPOI 的 NuGet 包管理器

IronXL 安装

下载 IronXL

To download IronXL, navigate to the following URL and click the "Download" button.

Download IronXL

图 3 - 下载 IronXL

使用 NuGet 安装 IronXL

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

Install-Package IronXl.Excel -Version x.x.x
NuGet IronXL Installation

图 4 - NuGet IronXL 安装

Visual Studio NuGet 包管理器和 IronXL

请按照以下步骤通过 Visual Studio 中的 NuGet 包管理器安装 IronXL:

在解决方案资源管理器中右键单击项目

  • 选择"管理 NuGet 程序包"
  • 浏览您的套餐
  • 点击安装
A screenshot of a computerDescription automatically generated

图 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;
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
$vbLabelText   $csharpLabel

以下代码读取一个现有的 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 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
$vbLabelText   $csharpLabel

使用 IronXL 读取 Excel 文件

以下代码演示了如何使用 IronXL 读取 Excel 文件并将其显示在数据网格视图中。 有关更多IronXL代码示例,请参阅文档。 添加以下代码并包含命名空间:

using IronXL;
using System.Data;
using IronXL;
using System.Data;
Imports IronXL
Imports System.Data
$vbLabelText   $csharpLabel

请注意其中包含 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 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
$vbLabelText   $csharpLabel

如您所见,与 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 免费试用,在本地运行这些示例。

[{i:(NPOI 是其各自所有者的注册商标。 本网站与NPOI没有任何关联,也未获得NPOI的认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。)}]

常见问题解答

使用 Office.Interop 进行 C# 中 Excel 操作的替代方案是什么?

IronXL 是 C# 中 Excel 操作使用 Office.Interop 的替代方案。它提供了一个用户友好的 API,使开发人员可以创建、读取和编辑 Excel 文件,而无需安装 Microsoft Office。

如何在 C# 中将 Excel 文件转换为 PDF?

您可以通过在 C# 中使用 IronXL 加载 Excel 工作簿来将 Excel 文件转换为 PDF,然后使用 WorkBook.SaveAs 方法将文件保存为 PDF 格式。

使用 IronXL 进行 Excel 文件操作的主要好处是什么?

IronXL 提供了更直观的 API,用于更轻松的代码维护、专业支持、定期更新,以及无需安装 Microsoft Office 即可处理 Excel 文件,这使其成为开发人员的强大选择。

可以通过 NuGet 安装 IronXL 吗?

是的,可以通过 NuGet 安装 IronXL。打开 Visual Studio 开发者命令提示符,输入 Install-Package IronXL.Excel -Version x.x.x

使用 IronXL 可以执行哪些常见的 Excel 相关任务?

使用 IronXL,开发人员可以执行读取和写入 Excel 文件、样式化单元格、使用公式、验证数据、应用条件格式以及处理图像和图表等任务。

如何在没有 Microsoft Office 的情况下用 C# 读取 Excel 文件?

使用 IronXL,您可以通过 WorkBook.Load 加载工作簿来读取 C# 中的 Excel 文件,访问工作表,并使用直接的方法遍历行和单元格。

为什么选择 IronXL 而不是开源替代方案进行 Excel 操作?

IronXL 提供了更用户友好的 API、专业支持、定期更新和持续的功能请求,这些优势比开源替代方案如 NPOI 更为明显。

NPOI 与 IronXL 在 Excel 文件操作上有什么不同?

NPOI 是一个基于 Apache POI 项目的开源库,用于在没有 Microsoft Office 的情况下处理 Excel 文件。IronXL 通过提供更直观的 API、专业支持和定期更新,使其适合商业应用。

使用 IronXL 将 Excel 工作表转换为 DataTable 的过程是什么?

要使用IronXL将Excel工作表转换为DataTable,可以使用WorkBook.Load加载工作簿,访问所需的工作表,并使用可用的方法将其转换为DataTable以便进一步使用。

IronXL 如何在 .NET 应用程序中增强 Excel 文件管理?

IronXL 通过提供干净直观的 API,方便执行读取、编辑和创建 Excel 文件的任务,在 .NET 应用程序中增强了 Excel 文件管理,而无需依赖于 Microsoft Office 的安装。

Curtis Chau
技术作家

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

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我