User Tools

Site Tools


prog:csharp:250226-001:index

C#讀寫Excel的4種方案 [OpenXml、NPOI、EPPlus、Spire.Office] (2025-02-26)

Local Backup

簡介

  • 專案中需使用C#讀寫Excel,每天定時將資料輸出到Excel表格中。在參考了很多的方案後,找到了4個常用的方案,並提供了一些小小Demo。更多功能和範例可以參考官方文件。
    • 1、Microsoft.Office.Interop.Excel:不建議使用。
    • 2、OpenXml:微軟官方提供的SDK。
    • 3.NPOI:第三方開源框架,口碑很好。
    • 4.EPPlus:只能用來讀寫Excel,筆者目前使用最多。
    • 5、Spire.Office for .NET:商業解決方案,功能完善強大。免費版功能也夠用。
    • IDE:Visual Studio 2019 和Visual Studio 2022
    • 框架:.NET Framework 4.8 和.NET 6.0

1、Microsoft.Office.Interop.Excel

  • 最原始的操作庫,相容性一般,偶爾會出現記憶體洩漏和檔案無法解除佔用的問題(也可能是我太菜),不建議使用。

2、OpenXml

3、NPOI

  • 在Java中,有Apache POI這樣一個API用來操作Office。
  • 在C#中,有開源免費的NPOI,NPOI 是POI 專案的.NET 版本。
  • 使用方法:
    public void TestNPOI()
    {
        string sourceFile = @"D:\sourceFile.xlsx";
        string targetFile = @"D:\targetFile.xlsx";
     
        IWorkbook workbook = new XSSFWorkbook(sourceFile);
        ISheet sheet1 = workbook.GetSheet("Sheet1");
     
        sheet1.CreateRow(0).CreateCell(0).SetCellValue(1);
        sheet1.CreateRow(1).CreateCell(0).SetCellValue(2);
        sheet1.CreateRow(2).CreateCell(0).SetCellValue(3);
     
        FileStream fs = new FileStream(targetFile, FileMode.Create);
        workbook.Write(fs);
        workbook.Close();
    }
  • NPOI在使用過程中有些不習慣,特別是在設定單元格內容時,和傳統的思考方式不太一樣。

4、EPPlus

  • EPPlus透過LicenseContext來區分商業應用(Commercial)和非商業應用(NonCommercial)。
  • 使用方法:
    public void TestEPPlus()
    {
        string sourceFile = @"D:\sourceFile.xlsx";
        string targetFile = @"D:\targetFile.xlsx";
     
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;//指明非商业应用
        ExcelPackage package = new ExcelPackage(sourceFile);//加载Excel工作簿
        ExcelWorksheet sheet1 = package.Workbook.Worksheets["Sheet1"];//读取工作簿中名为"Sheet1"的工作表
     
        sheet1.Cells[1, 1].Value = "A";//设置单元格内容
        sheet1.Cells[2, 2].Value = "B";
        sheet1.Cells[3, 3].Value = "C";
     
        sheet1.Cells[1, 2].Value = "1";
        sheet1.Cells[2, 2].Value = "2";
        sheet1.Cells[3, 2].Value = "3";
     
        //package.Save();//将更改保存到原文件
        package.SaveAs(targetFile);//将更改保存到新的文件,类似于另存为
    }
  • 筆者目前使用最多的框架,操作簡單,符合使用習慣。但EPPlus只能用來讀寫Excel,不能讀寫Word等其他文件。

5、Spire.Office for .NET

  • Spire.Office提供了一整套的Office解決方案,可以讀寫、展示Word、Excel、PDF等。分為收費版和免費版。
  • 使用方法:
    public void TestSpireOffice()
    {
        string sourceFile = @"D:\sourceFile.xlsx";
        string targetFile = @"D:\targetFile.xlsx";
     
        Workbook workbook = new Workbook();
        workbook.LoadFromFile(sourceFile);//加载Excel工作簿
        Worksheet sheet1 = workbook.Worksheets["Sheet1"];//读取工作簿中名为"Sheet1"的工作表
     
        sheet1.SetCellValue(1, 1, "A");//设置单元格内容
        sheet1.SetCellValue(2, 1, "B");
        sheet1.SetCellValue(3, 1, "C");
     
        sheet1.SetCellValue(1, 2, "1");
        sheet1.SetCellValue(2, 2, "2");
        sheet1.SetCellValue(3, 2, "3");
     
        workbook.Save();//将更改保存到原文件
        workbook.SaveToFile(targetFile);//将更改保存到新的文件,类似于另存为
    }
  • Spire.Office的收費版可以在WinForm中直接展示Word、Excel、PDF檔案內容,但免費版不能展示Excel。一個替代方式是先將Excel轉換成PDF,再展示PDF,但這個方案只能展示前三頁。

總結:

  • 3 person(s) visited this page until now.

prog/csharp/250226-001/index.txt · Last modified: 2025/02/26 09:48 (external edit)