跳過到頁腳內容
與其他組件的比較
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 還提供專業支援、持續更新計劃,以及直接向 Iron Software 工程師請求功能的功能。 社群驅動型計畫在這方面提供了不同的權衡:更廣泛的貢獻者參與,但對特定問題的回應時間更難以預測。

除了授權費用之外,專案總成本還包括開發人員編寫和維護 NPOI 底層 API 所需的額外樣板程式碼所花費的時間,以及在上述範例中顯示的手動資料映射邏輯所花費的時間。 對於評估多年專案生命週期成本的團隊來說,這些開發和維護成本通常會超過開源許可和商業許可之間的差異。

下載

該專案已在 GitHub 上開源:

IronXL 與 NPOI 對比範例

準備好看看你的專案會有什麼不同了嗎? 立即開始為期 30 天的 IronXL 免費試用,在本地運行這些範例。

請注意NPOI 為其各自所有者的註冊商標。 本網站與NPOI沒有任何關聯,也未獲得NPOI的認可或贊助。 所有產品名稱、標誌和品牌均為其各自擁有者的財產。 比較僅供參考,反映了撰寫時的公開信息。

常見問題解答

在 C# 中操控 Excel 的 Office.Interop 替代方案是什麼?

IronXL 是 C# 中操控 Excel 的 Office.Interop 替代方案。它提供了一個用戶友好的 API,使開發者無需安裝 Microsoft Office 即可創建、讀取和編輯 Excel 文件。

如何在 C# 中將 Excel 文件轉換為 PDF?

您可以使用 IronXL 在 C# 中將 Excel 文件轉換為 PDF,方法是使用 WorkBook.Load 加載 Excel 工作簿,然後使用 WorkBook.SaveAs 方法將文件保存為 PDF 格式。

使用 IronXL 來操控 Excel 文件的主要優勢是什麼?

IronXL 提供了一個更直觀的 API 以簡化代碼維護、專業支持、定期更新,以及在無需安裝 Microsoft Office 的情況下處理 Excel 文件,這使其成為開發者的強大選擇。

IronXL 可以通過 NuGet 安裝嗎?

是的,IronXL 可以通過 NuGet 安裝。打開 Visual Studio 開發者命令提示符,然後輸入 Install-Package IronXL.Excel -Version x.x.x

使用 IronXL 可以執行哪些常見的 Excel 相關任務?

使用 IronXL,開發者可以執行如讀寫 Excel 文件、設置單元格樣式、使用公式、驗證數據、應用條件格式、處理圖像和圖表等任務。

如何在 C# 中無需 Microsoft Office 讀取 Excel 文件?

使用 IronXL,您可以在 C# 中讀取 Excel 文件,方法是使用 WorkBook.Load 加載工作簿,訪問工作表,並使用簡單的方式迭代行和單元格。

為什麼選擇 IronXL 而不是開源替代方案來操控 Excel?

IronXL 提供了更用戶友好的 API、專業支持、定期更新以及持續的功能請求,這與 NPOI 等開源替代方案相比是其優勢。

NPOI 和 IronXL 在操控 Excel 文件方面有何不同?

NPOI 是基於 Apache POI 項目的開源庫,用於在無需 Microsoft Office 的情況下處理 Excel 文件。然而,IronXL 提供了一個更直觀的 API、專業支持和定期更新,使其適合商業應用。

將 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 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我