2024/12/02

SharpDevelop 使用 NuGet 套件管理器,以 NPOI 為例

 作者:吳祐賓

 

 

 


 

 

操作 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);
        }
    }
}


程式碼說明:

  1.  引用 NPOI 函式庫: using NPOI.HSSF.UserModel; 引用 NPOI 函式庫,使用 HSSFWorkbook 建立 .xls 格式的 Excel 檔案。
  2. 建立工作簿和工作表: IWorkbook 代表整個 Excel 檔案, ISheet 代表一個工作表。
  3. 建立儲存格: IRow 代表一行, ICell 代表一個儲存格。使用 CreateRow 和 CreateCell 方法建立儲存格。
  4. 設定儲存格值: 使用 SetCellValue 方法設定儲存格的值。
  5. 設定格式: ICellStyle 代表儲存格的樣式,例如數字格式、字型、顏色等。
  6. 儲存檔案: 使用 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 吧!



和你分享



See also



沒有留言:

張貼留言