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

IronXL 和 NPOI 的比较

您可能知道,Excel 可能是世界上使用最广泛的电子表格应用程序。 用户包括开发者和普通大众,但开发者可能会对这篇文章更感兴趣。 最初,开发人员在各种应用程序中使用 Excel 的选择并不多。 但是,Office 套件中内置了 VBA(Visual Basic for Applications),您可以根据需要使用 VBA 来操作任何 Office 产品。

开发人员使用 Excel 中的 VBA 来自定义他们与 Excel 及其数据的交互,甚至是其可视化功能。 但最终,这还不够。 开发人员想要更多功能,因此他们开始使用 Office.Interop。

在本文中,我将比较两个非常优秀的 Excel 库,它们无需依赖 Office.Interop 即可与 Excel 配合使用。 它们是:

  • IronXL
  • NPOI

您将看到并了解每个 Excel 库的功能,然后通过代码示例和分步教程对两者进行比较。 虽然本文无法涵盖这两个 Excel 库的所有功能,但会解释它们各自最常见和最流行的用途。

什么是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 Excel 库的通用库功能

NPOI IronXL
单元格范围 单元格范围
单元格样式(边框、颜色、填充、字体、数字、对齐方式) 单元格视觉样式:字体、大小、背景图案、边框、对齐方式和数字格式。
公式计算 公式
数据验证 数据验证
条件格式 条件格式
图像 图像
图表 图表

表 1 - 功能对比


IronXL 和 NPOI 的安装

你可以通过手动下载、通过 NuGet 或使用 Visual Studio 中的 NuGet 包管理器来安装这两个库。 以下是简要概述。

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 文件并将其显示在数据网格视图中。 添加以下代码并包含命名空间:

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

如你所见,这一切加起来就大大减少了工作量。

结论

那么,为什么选择 IronXL? 如您所见,IronXL 拥有易于使用的 API,可保持您的代码简洁。 使用 IronXL 的库拥有简洁、易读的代码,这是一项值得的投资,因为它减少了理解代码功能所需的时间和精力,并且允许在不破坏现有功能的情况下对其进行更改。

IronXL 各方面都更加直观易用,同时功能也与 NPOI 一样强大。 当然,有了许可证密钥,您就可以享受付费软件最重要的优势:您可以获得我们的专业支持、持续可靠的更新计划,以及向 Iron Software 支持人员请求功能的能力,他们很乐意为您提供帮助。 这是开源软件无法提供的。

下载

该项目已在 GitHub 上开源:

IronXL 与 NPOI 对比示例

请注意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 机器人,将他对技术的热爱与创造力相结合。