在生產環境中測試,無水印。
在任何需要的地方都能運行。
獲得 30 天的全功能產品。
在幾分鐘內上手運行。
試用產品期間完全訪問我們的支援工程團隊
正如您所知,Excel 可能是世界上最常用的電子表格應用程式。 使用者包括開發人員和一般大眾,但此文章可能會更吸引開發人員。 最初,開發人員在其各種應用程式中處理 Excel 的選擇並不多。 然而,Office 套件中內建了 VBA(Visual Basic for Applications),您可以根據自己的需求操作任何 Office 產品。
開發者使用 VBA 在 Excel 中自定義與 Excel 及其數據的互動,甚至其視覺功能。 但是,最終這還是不夠。 開發者們希望得到更多功能,因此他們開始使用 Office.Interop。
在本文中,我將比較兩個不依賴 Office.Interop 的非常好的 Excel 庫來處理 Excel。 它們是:
NPOI
您將會看到和學習每個 Excel 庫能做到的事情,然後透過程式碼範例和逐步教程來比較這兩個庫。 儘管本文無法涵蓋這兩個 Excel 庫的所有功能,但它將解釋每個庫最常見和最受歡迎的用法。
GetSheetAt
方法獲取特定工作表GetRow
方法來存取每一行GetCell
方法訪問行中的每個單元格NPOI 是 POI Java 項目的 .NET 版本,位於 [http://poi.apache.org/](http://poi.apache.org/" target="_blank" rel="nofollow)。 POI 是一個開源項目,可以幫助您讀寫 xls、doc、ppt 文件。 它有廣泛的應用範圍。
例如,您可以用它來:
NPOI 是 Apache 的[POI Java](http://poi.apache.org/" target="_blank" rel="nofollow) 專案的 C# 版本。 它是免費且開源的。 此外,它無需 Interop,也就是說用戶無需安裝 Excel 即可使開發者的應用程式正常運行。
IronXL 是一個用於 VB 和 C# 的 Excel API。 使用 IronXL,您可以在 .NET 中讀取、編輯和創建 Excel 試算表檔案。
表格 1 - 功能比較
您可以通過手動下載、使用 NuGet 或在 Visual Studio 的 NuGet 套件管理器中安裝這兩個庫。 以下是一個快速概覽。
要透過 NuGet 安裝 NPOI,請開啟 Visual Studio 開發人員命令提示字元並輸入以下內容:
圖 1 - NuGet NPOI 安裝
使用以下步驟通過 Visual Studio 的 NuGet 套件管理器安裝 IronXL 或 NPOI:
圖 2 - 用於 NPOI 的 NuGet 套件管理器
要下載 IronXL,請導航至以下網址,然後點擊“下載”按鈕。
圖 3 - 下載 IronXL
要通過NuGet安裝IronXL,請打開Visual Studio開發者命令提示符,然後輸入以下內容:
圖 4 - NuGet 安裝 IronXL
使用以下步驟在 Visual Studio 中透過 NuGet 套件管理器安裝 IronXL:
圖 5 - IronXL 的 NuGet 套件管理器
以下程式碼展示如何使用 NPOI 讀取 Excel 檔案並顯示其內容。 添加以下程式碼並包含必要的命名空間:
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
Imports NPOI.SS.UserModel
Imports NPOI.XSSF.UserModel
以下程式碼讀取現有的 Excel 文件並將其顯示在資料網格檢視中。
public void ReadExcelNPOI()
{
DataTable dtTable = new DataTable();
List<string> lstRows = new List<string>();
ISheet objWorksheet;
string strPath = @"c:\temp\NPOI_Test.XLSX";
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;
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());
}
}
for (int i = (objWorksheet.FirstRowNum + 1); i <= objWorksheet.LastRowNum; i++)
{
IRow objRow = objWorksheet.GetRow(i);
if (objRow == null) continue;
if (objRow.Cells.All(d => d.CellType == CellType.Blank)) continue;
for (int j = objRow.FirstCellNum; j < countCells; j++)
{
if (objRow.GetCell(j) != null)
{
if (!string.IsNullOrEmpty(objRow.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(objRow.GetCell(j).ToString()))
{
lstRows.Add(objRow.GetCell(j).ToString());
}
}
}
if (lstRows.Count > 0)
dtTable.Rows.Add(lstRows.ToArray());
lstRows.Clear();
}
}
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";
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;
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());
}
}
for (int i = (objWorksheet.FirstRowNum + 1); i <= objWorksheet.LastRowNum; i++)
{
IRow objRow = objWorksheet.GetRow(i);
if (objRow == null) continue;
if (objRow.Cells.All(d => d.CellType == CellType.Blank)) continue;
for (int j = objRow.FirstCellNum; j < countCells; j++)
{
if (objRow.GetCell(j) != null)
{
if (!string.IsNullOrEmpty(objRow.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(objRow.GetCell(j).ToString()))
{
lstRows.Add(objRow.GetCell(j).ToString());
}
}
}
if (lstRows.Count > 0)
dtTable.Rows.Add(lstRows.ToArray());
lstRows.Clear();
}
}
dataGridView1.DataSource = dtTable;
}
private void button1_Click(object sender, EventArgs e)
{
ReadExcelNPOI();
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
以下程式碼示範如何使用IronXL讀取Excel文件並在資料網格視圖中顯示。 添加以下程式碼並包含命名空間:
using IronXL;
using IronXL;
Imports IronXL
注意包含IronXL。 這是 IronXL 運作所必需的。 新增接下來的幾行:
private void button2_Click(object sender, EventArgs e)
{
string strPath = @"c:\temp\NPOI_Test.XLSX";
WorkBook workbook = WorkBook.Load(strPath);
WorkSheet sheet = workbook.DefaultWorkSheet;
var dtTable = sheet.ToDataTable(true);
dataGridView1.DataSource = dtTable;
}
private void button2_Click(object sender, EventArgs e)
{
string strPath = @"c:\temp\NPOI_Test.XLSX";
WorkBook workbook = WorkBook.Load(strPath);
WorkSheet sheet = workbook.DefaultWorkSheet;
var dtTable = sheet.ToDataTable(true);
dataGridView1.DataSource = dtTable;
}
Private Sub button2_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim strPath As String = "c:\temp\NPOI_Test.XLSX"
Dim workbook As WorkBook = WorkBook.Load(strPath)
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
Dim dtTable = sheet.ToDataTable(True)
dataGridView1.DataSource = dtTable
End Sub
正如您所見,這一切減少了大量的工作。
那麼為什麼選擇IronXL? 正如您所見,IronXL 擁有易於使用的 API,能保持您的代碼整潔。 使用IronXL的程式庫以清晰、可讀的代碼為榮,這是一項能夠回報的投資,因為這可以減少理解代碼所需的時間和精力,並且允許在不破壞其他功能的情況下進行更改。
IronXL 更直觀且同樣強大如 NPOI。 當然,擁有授權金鑰後,您便能享有付費軟件的最重要優勢:您將獲得我們的專業支持、穩定且可靠的更新計劃,並可向 Iron Software 支持人員提出功能需求,他們樂意為您提供協助。 這是開源軟體無法提供的。
此專案可在 GitHub 上獲得: IronXL vs NPOI 示例