
IronXL 與 NPOI 的比較
IronXL和NPOI都是.NET的Excel程式庫,可以在不需要Office.Interop的情況下運行,不需要安裝Microsoft Excel。 此比較涵蓋其讀取、寫入和操控Excel文件的API,並提供開發人員最常遇到的操作的程式碼範例。
如何在C#中使用NPOI處理Excel
- 安裝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#版本。 它是免費和開源的。 此外,它不需要Interop,這意味著使用者不需要安裝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,請導航到以下URL並點擊"下載"按鈕。

圖3 - 下載IronXL
通過NuGet安裝IronXL
要通過 NuGet 安裝 IronXL,請打開 Visual Studio 開發者命令提示符並輸入以下內容:

圖4 - NuGet IronXL安裝
Visual Studio NuGet套件管理器與IronXL
使用以下步驟通過Visual Studio中的NuGet套件管理器安裝IronXL:
- 右鍵點擊解決方案資源管理器中的專案
- 選擇管理NuGet套件
- 瀏覽您的套件
- 點擊安裝

圖5 - IronXL的NuGet套件管理器
從Excel文件中讀取和寫入使用NPOI和IronXL
使用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如您所見,IronXL將讀取和顯示操作減少到大約5行程式碼,相比之下,NPOI需要超過40行,完全省去了手動行迭代和逐個單元格提取迴圈。 瀏覽完整的IronXL功能指南,以獲得對常見Excel任務更簡化的方法。
您應選擇哪個程式庫?
NPOI為.NET中的Excel操作提供了一個穩健、經過驗證的開源基礎 - 其作為Apache POI移植的優勢使其受益於多年來的社區貢獻和廣泛的格式覆蓋。 對於主要需求是使用免費、社區驅動的包讀取和寫入試算表的團隊來說,NPOI是一個可靠的選擇。
通常團隊碰到的摩擦是NPOI在常見操作中需要大量模板程式碼。 如上所述的讀取文件範例所示,IronXL的方法需要大約5行程式碼,而NPOI同樣的操作需要超過40行程式碼 - 載入工作簿並在資料網格中顯示,完全消除了手動的行和單元格迭代迴圈。 這種程式碼面積的減少是一項回報良好的投資,因為它使維護更容易,尤其是在減少了錯誤出現的地方。
IronXL還包括專業支持、一致的更新計劃,以及直接從Iron Software工程師那裡請求功能的能力。 社區驅動的專案在這方面提供了不同的權衡:有更廣泛的貢獻者輸入,但對於特定問題回應時間的可預測性較低。
除了授權成本,專案的總成本還包括開發人員用於撰寫和維護NPOI較低級API所需的額外模板程式碼的開發時間,以及如上例所示的手動資料映射邏輯的除錯。 對於評估多年專案生命週期成本的團隊來說,這些開發和維護成本常常超出開源和商業授權之間的差額。
下載
此專案在 GitHub 上可用:
IronXL對比NPOI範例準備好在自己的專案中看到差異了嗎? 開始一個免費的30天IronXL試用,以在本地運行這些範例。

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
相關文章


