跳過到頁腳內容
與其他組件的比較
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的認可或贊助。 所有產品名稱、標誌和品牌均為其各自擁有者的財產。 比較資料僅供參考,並反映撰寫時的公開資訊。

常見問題解答

在 C# 中使用 Office.Interop 進行 Excel 操作的替代方法是什麼?

IronXL 是在 C# 中使用 Office.Interop 進行 Excel 操作的替代方案。它提供了用戶友好的 API,允許開發人員在不需要安裝 Microsoft Office 的情況下創建、讀取和編輯 Excel 檔案。

如何在 C# 中將 Excel 檔案轉換為 PDF?

您可以使用 IronXL 在 C# 中將 Excel 檔案轉換為 PDF,方法是使用 WorkBook.Load 載入 Excel 工作簿,然後再使用 WorkBook.SaveAs 方法將檔案儲存為 PDF 格式。

使用 IronXL.Excel 處理 Excel 檔案有哪些主要優點?

IronXL 提供更直覺的 API,讓程式碼維護更容易、專業的支援、定期的更新,以及在沒有安裝 Microsoft Office 的情況下處理 Excel 檔案的能力,使其成為開發人員的有力選擇。

IronXL 可以透過 NuGet 安裝嗎?

是的,IronXL 可以透過 NuGet 安裝。打開 Visual Studio 開發人員指令提示,然後輸入 Install-Package IronXL.Excel -Version x.x.x

使用 IronXL.Excel 可以執行哪些常見的 Excel 相關工作?

使用 IronXL.Excel,開發人員可以執行讀取和寫入 Excel 檔案、設定單元格樣式、使用公式、驗證資料、套用條件格式,以及處理圖片和圖表等工作。

在沒有 Microsoft Office 的情況下,如何用 C# 閱讀 Excel 檔案?

透過 IronXL,您可以使用 WorkBook.Load 載入工作簿,存取工作表,並使用直接的方法迭代行和儲存格,以 C# 語言讀取 Excel 檔案。

為何要選擇 IronXL 而非其他開放原始碼的 Excel 操作軟體?

IronXL 提供更容易使用的 API、Professional 支援、定期更新以及持續的功能需求,這些都是相較於 NPOI 等開放原始碼替代方案的優勢。

在 Excel 檔案處理方面,NPOI 與 IronXL.Excel 有何不同?

NPOI 是基於 Apache POI 專案的開放源碼函式庫,可在沒有 Microsoft Office 的情況下處理 Excel 檔案。IronXL 則提供更直覺的 API、專業的支援和定期的更新,適合商業應用。

使用 IronXL.Excel 將 Excel 工作表轉換為 DataTable 的流程為何?

若要使用 IronXL 將 Excel 工作表轉換為 DataTable,請使用 WorkBook.Load 載入工作簿,存取所需的工作表,並使用可用的方法將其轉換為 DataTable 以供進一步使用。

IronXL 如何增強 .NET 應用程式中的 Excel 檔案管理?

IronXL 透過提供簡潔直觀的 API,增強了 .NET 應用程式中的 Excel 檔案管理功能,可輕鬆完成讀取、編輯和建立 Excel 檔案等工作,而無需依賴 Microsoft Office 的安裝。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担产品测测试,产品开发和研究的责任时,Jordi 为持续的产品改进增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。