作者:吳祐賓
操作 Excel 時原以為使用 ADO 吃工作表就可以走天下,想不到踢到鐵板的日子來的這麼快。
C# 操作 Excel 方案有很多,清單和簡易心得如下:
- Microsoft.Office.Interop.Excel:依賴 Office,加上 SharpDevelop 太老舊,不建議使用
- OpenXml:微軟官方提供的SDK,只能使用 xlsx,所以放棄使用
- NPOI:Github 上的開源框架,用過的都說好
- EPPlus:專業讀寫 Excel 套件,$499 起跳
- Spire.Office for .NET:$2,999 起跳
- Aspose.Cells .NET:極致奢華,貴族使用
NPOI 是什麼?
NPOI 是一個免費開源的 .NET 函式庫,讓你不用安裝 Microsoft Office 也能讀寫 Excel 檔案(xls, xlsx)。
NPOI 源自於 APOI,Wiki 是這麼寫的:
Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則可以利用NPOI(POI for .NET)來存取POI的功能。
優點:
**免費開源:**基於 Apache 2.0 授權,可自由使用於商業和非商業專案。
**跨平台:**可在 Windows, Linux, macOS 等平台上使用。
**功能豐富:**支援大部分 Excel 功能,包含格式設定、公式計算、圖表操作等。
**效能良好:**讀寫速度快,記憶體佔用低。
**社群活躍:**擁有龐大的使用者群體和完善的技術文件。
應用場景:
程式化產生 Excel 報表
從 Excel 檔案匯入資料到資料庫
將資料從資料庫匯出到 Excel 檔案
自動化處理 Excel 文件
SharpDevelop 如何安裝 NPOI?
SharpDevelop 5.1 把 NuGet 移除,所以必須另外下載 NuGet 進行安裝,我在「SharpDevelop 使用 NuGet 套件管理器,以 Newtonsoft.Json 為例 」有詳細講述使用 NuGet 進行指令操作步驟,有興趣的人可以透過前面的連結仔細研究。
後來我發現,可以直接到 NuGet 官網直接下載套件及適用的版本,不需要使用 NuGet 程式就能完成。
NuGet 直接下載所需套件 - 以 NPOI 為例
在搜尋引擎以關鍵字 "nuget NPOI" 查找,可以找到 NPOI 2.7.2,按下右邊的「Download package」即可下載。
且慢,請注意圖片下方的 ".NET Framework",顯示的是支援的版本,從紅框處可以知道 NPOI 2.7.2 最低支援 .net461 以上。SharpDevelop 5 最高也只到 .NET Framework 4.5.2,所以要下載舊一點的版本。我是下載 NOPI 2.5.6,提供給各位評估使用。
下載的檔案是「npoi.2.5.6.nupkg」,副檔名為 nupkg,實際格式為 zip,可以使用任意解壓縮程式解開它。
SharpDevelop 導入 NPOI 方法
使用 SharpDevelop 開啟你的專案,在 Project 管理視窗點擊滑鼠右鍵,路徑 Add Reference > .NET Assembly Browser > Browse... > npoi.2.5.6 目錄 > lib > net45 選取以下檔案:
- NPOI.dll
- NPOI.OOXML.dll
- NPOI.OpenXml4Net.dll
- NPOI.OpenXmlFormats.dll
加入後就可以在你的專案使用 NPOI 了。
因 NPOI 2.5.6 導入後造成 SharpDevelop 出錯時
導入 NPOI 2.5.6 的 NPOI.OOXML.dll 時會出例外,這是 SharpDevelop 內部的錯誤,不影響編譯。如果要完全避免錯誤,可以使用 NPOI 2.5.1 的NPOI.OOXML.dll。
範例程式碼:建立簡單 Excel 報表
以下範例示範如何使用 NPOI 建立一個簡單的 Excel 報表,包含建立工作簿、工作表、儲存格,以及設定簡單的格式。
using NPOI.HSSF.UserModel; // 引用 NPOI 函式庫
using NPOI.SS.UserModel;
using System.IO;
public class NPOIExample
{
public static void CreateExcelReport()
{
// 建立新的工作簿
IWorkbook workbook = new HSSFWorkbook();
// 建立新的工作表
ISheet sheet = workbook.CreateSheet("銷售報表");
// 建立標題列
IRow headerRow = sheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("產品名稱");
headerRow.CreateCell(1).SetCellValue("數量");
headerRow.CreateCell(2).SetCellValue("單價");
headerRow.CreateCell(3).SetCellValue("總價");
// 建立資料列
IRow dataRow1 = sheet.CreateRow(1);
dataRow1.CreateCell(0).SetCellValue("產品 A");
dataRow1.CreateCell(1).SetCellValue(10);
dataRow1.CreateCell(2).SetCellValue(100);
dataRow1.CreateCell(3).SetCellValue(1000);
IRow dataRow2 = sheet.CreateRow(2);
dataRow2.CreateCell(0).SetCellValue("產品 B");
dataRow2.CreateCell(1).SetCellValue(20);
dataRow2.CreateCell(2).SetCellValue(50);
dataRow2.CreateCell(3).SetCellValue(1000);
// 設定格式
ICellStyle currencyStyle = workbook.CreateCellStyle();
currencyStyle.DataFormat = workbook.CreateDataFormat().GetFormat("#,##0.00");
dataRow1.GetCell(2).CellStyle = currencyStyle;
dataRow1.GetCell(3).CellStyle = currencyStyle;
dataRow2.GetCell(2).CellStyle = currencyStyle;
dataRow2.GetCell(3).CellStyle = currencyStyle;
// 將工作簿儲存到檔案
using (FileStream stream = new FileStream("銷售報表.xls", FileMode.Create, FileAccess.Write))
{
workbook.Write(stream);
}
}
}
程式碼說明:
- 引用 NPOI 函式庫: using NPOI.HSSF.UserModel; 引用 NPOI 函式庫,使用 HSSFWorkbook 建立 .xls 格式的 Excel 檔案。
- 建立工作簿和工作表: IWorkbook 代表整個 Excel 檔案, ISheet 代表一個工作表。
- 建立儲存格: IRow 代表一行, ICell 代表一個儲存格。使用 CreateRow 和 CreateCell 方法建立儲存格。
- 設定儲存格值: 使用 SetCellValue 方法設定儲存格的值。
- 設定格式: ICellStyle 代表儲存格的樣式,例如數字格式、字型、顏色等。
- 儲存檔案: 使用 FileStream 將工作簿儲存到檔案。
注意事項:
以上程式碼建立的是 .xls 格式的 Excel 檔案。如果要建立 .xlsx 格式的檔案,需要使用 XSSFWorkbook 類別。
NPOI 支援更複雜的操作,例如設定公式、合併儲存格、插入圖片等,可以參考 NPOI 的官方文件了解更多資訊。
NPOI 範例程式碼:讀取上述 Excel 報表
以下範例示範如何使用 NPOI 讀取前面建立的 "銷售報表.xls" 檔案,並將資料顯示在主控台。
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.IO;
public class NPOIExample
{
public static void ReadExcelReport()
{
// 開啟 Excel 檔案
using (FileStream stream = new FileStream("銷售報表.xls", FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new HSSFWorkbook(stream);
ISheet sheet = workbook.GetSheetAt(0); // 取得第一個工作表
// 讀取標題列
IRow headerRow = sheet.GetRow(0);
for (int i = 0; i < headerRow.LastCellNum; i++)
{
Console.Write(headerRow.GetCell(i).StringCellValue + "\t");
}
Console.WriteLine();
// 讀取資料列
for (int i = 1; i <= sheet.LastRowNum; i++)
{
IRow dataRow = sheet.GetRow(i);
for (int j = 0; j < dataRow.LastCellNum; j++)
{
ICell cell = dataRow.GetCell(j);
// 根據儲存格類型取得值
switch (cell.CellType)
{
case CellType.String:
Console.Write(cell.StringCellValue + "\t");
break;
case CellType.Numeric:
Console.Write(cell.NumericCellValue + "\t");
b 1 reak;
default:
Console.Write(" \t");
break;
}
}
Console.WriteLine();
}
}
}
}
程式碼說明:
開啟 Excel 檔案: 使用 FileStream 開啟 "銷售報表.xls" 檔案。
讀取工作表: 使用 workbook.GetSheetAt(0) 取得第一個工作表。
讀取標題列: 使用 sheet.GetRow(0) 取得第一行 (標題列)。
讀取資料列: 使用 sheet.LastRowNum 取得最後一列的索引,迴圈讀取每一列資料。
取得儲存格值: 使用 dataRow.GetCell(j) 取得儲存格,並根據 cell.CellType 判斷儲存格類型,取得對應的值。
顯示資料: 將讀取到的資料顯示在主控台。
注意事項:
以上程式碼讀取的是 .xls 格式的 Excel 檔案。如果要讀取 .xlsx 格式的檔案,需要使用 XSSFWorkbook 類別。
程式碼中使用 switch 判斷儲存格類型,讀取不同類型的儲存格值。實際應用中,可能需要處理更多不同的儲存格類型和格式。
希望以上範例程式碼和說明能幫助你使用 NPOI 讀取 Excel 檔案!
總結
NPOI 是免費開源的 .NET 函式庫,讓你輕鬆讀寫 Excel 檔案。它功能豐富、效能良好,且跨平台支援 Windows、Linux 和 macOS。不用依賴 Office,就能處理格式設定、公式計算、圖表操作等。無論產生報表、匯入匯出資料或自動化處理,NPOI 都是 SharpDevelop 使用者的絕佳選擇!還在煩惱 Excel 操作嗎?快試試 NPOI 吧!
和你分享
沒有留言:
張貼留言