跳至頁尾內容
USING IRONXL

如何在 C# 中建立 Excel 文件:Interop vs IronXL

介紹

程式生成Excel文件是許多C#應用程式中的基本需求。 雖然Microsoft.Office.Interop是傳統的C# Excel文件生成方法。 然而,它有一些限制,如需要安裝Microsoft Excel並依賴於主要互操作程式集。 現代的Excel程式庫替代品如IronXL允許您建立Excel工作簿、處理多個工作表、以及生成不需Microsoft Office的XLSX或CSV文件。本文比較了不同程式庫如何處理Excel文件建立,為.NET開發者提供範例程式碼和指導。

快速比較概覽

功能

Excel Interop

IronXL

EPPlus

ClosedXML

NPOI

GemBox

Aspose

需要安裝Excel

伺服器部署

不推薦

平台支持

僅限Windows

跨平台

跨平台

跨平台

跨平台

跨平台

跨平台

XLS支持

XLSX支持

學習曲線

陡峭

簡單

簡單

簡單

中等

簡單

中等

商業授權

Office授權

從$liteLicense

從€449

免費(MIT)

免費(Apache)

從€590

從$999

記憶體效率

卓越

卓越

注意:"Excel Interop"需要安裝Microsoft Excel,並附帶主要互操作程式集。 替代程式庫如IronXL允許您建立Excel文件、工作簿和工作表,而不需要Office,並支持xls、CSV文件和多個工作表。

為什麼要超越Excel Interop?

Microsoft.Office.Interop.Excel替代品是必要的,因為Excel Interop需要在每個運行應用程式的機器上安裝Microsoft Excel。 這種依賴性使得部署帶來挑戰,尤其是在Microsoft明確警告反對於伺服器自動化的情況下。 使用Interop而不安裝Excel會導致異常、警告訊息或無法成功建立Excel文件。 應用程式還會遭受COM依賴性問題、版本衝突和因為Excel在後台執行而造成的性能不佳。

現代的Excel程式庫,如IronXL,消除了這些問題。 您可以建立Excel文件、寫入資料至工作表、生成CSV或XML文件、處理新的Excel工作簿,而不依賴於Office、Excel應用程式物件或主要互操作程式集。 開發者也可以使用Visual Studio、Visual Basic或主控台應用程式專案來實現Windows或跨平台環境中的Excel自動化。

開始使用IronXL的免費試用以完全消除這些依賴性。

使用Interop建立Excel文件

首先讓我們看看使用Excel Interop的傳統方法:

using Excel = Microsoft.Office.Interop.Excel;
// Create Excel application instance
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
// Add data to cells
worksheet.Cells[1, 1] = "Product";
worksheet.Cells[1, 2] = "Price";
worksheet.Cells[2, 1] = "Widget";
worksheet.Cells[2, 2] = 9.99;
// Save and cleanup
workbook.SaveAs(@"C:\temp\products.xlsx");
workbook.Close();
excelApp.Quit();
// Release COM objects
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
using Excel = Microsoft.Office.Interop.Excel;
// Create Excel application instance
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
// Add data to cells
worksheet.Cells[1, 1] = "Product";
worksheet.Cells[1, 2] = "Price";
worksheet.Cells[2, 1] = "Widget";
worksheet.Cells[2, 2] = 9.99;
// Save and cleanup
workbook.SaveAs(@"C:\temp\products.xlsx");
workbook.Close();
excelApp.Quit();
// Release COM objects
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
Imports Excel = Microsoft.Office.Interop.Excel

' Create Excel application instance
Dim excelApp As New Excel.Application()
Dim workbook As Excel.Workbook = excelApp.Workbooks.Add()
Dim worksheet As Excel.Worksheet = CType(workbook.Sheets(1), Excel.Worksheet)

' Add data to cells
worksheet.Cells(1, 1) = "Product"
worksheet.Cells(1, 2) = "Price"
worksheet.Cells(2, 1) = "Widget"
worksheet.Cells(2, 2) = 9.99

' Save and cleanup
workbook.SaveAs("C:\temp\products.xlsx")
workbook.Close()
excelApp.Quit()

' Release COM objects
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
$vbLabelText   $csharpLabel

此程式碼需要安裝Excel,需要手動清理COM物件,並且無法在非Windows平台上運行。 在處理多個工作表、儲存為不同文件格式或在伺服器環境中工作時,這種複雜性會增加。 這就是為什麼許多開發者尋找不需要Microsoft Office的Excel程式庫的原因。

IronXL的比較如何?

IronXL消除了這些並發症,擁有不需Microsoft Office的現代直觀的Excel自動化API:

using IronXL;
// Create workbook without Excel
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Add data using familiar syntax
worksheet["A1"].Value = "Product";
worksheet["B1"].Value = "Price";
worksheet["A2"].Value = "Widget";
worksheet["B2"].Value = 9.99;
// Apply formatting
worksheet["A1:B1"].Style.Font.Bold = true;
worksheet["B2"].FormatString = "$#,###";
// Save with one line
workbook.SaveAs("products.xlsx");
using IronXL;
// Create workbook without Excel
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Add data using familiar syntax
worksheet["A1"].Value = "Product";
worksheet["B1"].Value = "Price";
worksheet["A2"].Value = "Widget";
worksheet["B2"].Value = 9.99;
// Apply formatting
worksheet["A1:B1"].Style.Font.Bold = true;
worksheet["B2"].FormatString = "$#,###";
// Save with one line
workbook.SaveAs("products.xlsx");
Imports IronXL

' Create workbook without Excel
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")

' Add data using familiar syntax
worksheet("A1").Value = "Product"
worksheet("B1").Value = "Price"
worksheet("A2").Value = "Widget"
worksheet("B2").Value = 9.99

' Apply formatting
worksheet("A1:B1").Style.Font.Bold = True
worksheet("B2").FormatString = "$#,###"

' Save with one line
workbook.SaveAs("products.xlsx")
$vbLabelText   $csharpLabel

在C#中建立Excel文件的方法:Interop與IronXL:圖1 - IronXL輸出

IronXL允許您程式生成Excel文件、新工作簿和多個工作表。 您可以寫入資料、顯示資料,並處理XLS、XLSX、CSV或XML文件,而不需安裝Microsoft Excel或引用主要互操作程式集。 這使得它成為.NET Framework、.NET Core、主控台應用程式和跨平台環境中完全管理的Excel程式庫。

由於IronXL可通過NuGet包獲得,您可以直接將其新增到您的Visual Studio專案中,而無需擔心安裝Microsoft Office。無需管理Excel應用程式物件或手動釋放COM物件,減少異常或警告訊息的風險。 了解有關用IronXL建立Excel文件或探索Excel公式和計算的更多資訊。

現在開始使用IronXL。
green arrow pointer

其他程式庫的比較如何?

EPPlus實施方案

EPPlus提供了一個簡潔的API,但自版本5起需要授權配置,詳細請參見Stack Overflow 執行緒

using OfficeOpenXml;
// Set license context (required from v5+)
ExcelPackage.License.SetNonCommercialPersonal("Test");
using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("Products");
    worksheet.Cells[1, 1].Value = "Product";
    worksheet.Cells[1, 2].Value = "Price";
    worksheet.Cells[2, 1].Value = "Widget";
    worksheet.Cells[2, 2].Value = 9.99;
    package.SaveAs(new FileInfo("products.xlsx"));
}
using OfficeOpenXml;
// Set license context (required from v5+)
ExcelPackage.License.SetNonCommercialPersonal("Test");
using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("Products");
    worksheet.Cells[1, 1].Value = "Product";
    worksheet.Cells[1, 2].Value = "Price";
    worksheet.Cells[2, 1].Value = "Widget";
    worksheet.Cells[2, 2].Value = 9.99;
    package.SaveAs(new FileInfo("products.xlsx"));
}
Imports OfficeOpenXml

' Set license context (required from v5+)
ExcelPackage.License.SetNonCommercialPersonal("Test")

Using package As New ExcelPackage()
    Dim worksheet = package.Workbook.Worksheets.Add("Products")
    worksheet.Cells(1, 1).Value = "Product"
    worksheet.Cells(1, 2).Value = "Price"
    worksheet.Cells(2, 1).Value = "Widget"
    worksheet.Cells(2, 2).Value = 9.99
    package.SaveAs(New FileInfo("products.xlsx"))
End Using
$vbLabelText   $csharpLabel

在C#中建立Excel文件的方法:Interop與IronXL:圖2 - EPPlus輸出

EPPlus允許您建立Excel電子表格、寫入和顯示資料,並導出到XLSX文件或CSV文件。 然而,它不支持舊的XLS格式,並且商業用途需要商業授權。 在.NET Core或.NET Framework中工作的開發者可以通過NuGet包將EPPlus整合到Visual Studio專案和主控台應用程式中。

ClosedXML方案

ClosedXML提供了一個具有直觀API的開放源程式碼解決方案:

using ClosedXML.Excel;
using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Products");
    worksheet.Cell("A1").Value = "Product";
    worksheet.Cell("B1").Value = "Price";
    worksheet.Cell("A2").Value = "Widget";
    worksheet.Cell("B2").Value = 9.99;
    workbook.SaveAs("products.xlsx");
}
using ClosedXML.Excel;
using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Products");
    worksheet.Cell("A1").Value = "Product";
    worksheet.Cell("B1").Value = "Price";
    worksheet.Cell("A2").Value = "Widget";
    worksheet.Cell("B2").Value = 9.99;
    workbook.SaveAs("products.xlsx");
}
Imports ClosedXML.Excel

Using workbook As New XLWorkbook()
    Dim worksheet = workbook.Worksheets.Add("Products")
    worksheet.Cell("A1").Value = "Product"
    worksheet.Cell("B1").Value = "Price"
    worksheet.Cell("A2").Value = "Widget"
    worksheet.Cell("B2").Value = 9.99
    workbook.SaveAs("products.xlsx")
End Using
$vbLabelText   $csharpLabel

在C#中建立Excel文件的方法:Interop與IronXL:圖3 - ClosedXML輸出

ClosedXML支持XLSX文件和Excel工作表,使其可以在未安裝Microsoft Office的情況下輕鬆建立Excel工作表。 它可以跨多個工作表工作,處理CSV和XML文件,並通過NuGet包整合到.NET項目中。

NPOI 針對遺留支持

NPOI處理XLS和XLSX格式,但API更為複雜:

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook = new XSSFWorkbook();
ISheet worksheet = workbook.CreateSheet("Products");
IRow headerRow = worksheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("Product");
headerRow.CreateCell(1).SetCellValue("Price");
IRow dataRow = worksheet.CreateRow(1);
dataRow.CreateCell(0).SetCellValue("Widget");
dataRow.CreateCell(1).SetCellValue(9.99);
using (FileStream file = new FileStream("products.xlsx", FileMode.Create))
{
    workbook.Write(file);
}
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook = new XSSFWorkbook();
ISheet worksheet = workbook.CreateSheet("Products");
IRow headerRow = worksheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("Product");
headerRow.CreateCell(1).SetCellValue("Price");
IRow dataRow = worksheet.CreateRow(1);
dataRow.CreateCell(0).SetCellValue("Widget");
dataRow.CreateCell(1).SetCellValue(9.99);
using (FileStream file = new FileStream("products.xlsx", FileMode.Create))
{
    workbook.Write(file);
}
Imports NPOI.SS.UserModel
Imports NPOI.XSSF.UserModel
Imports System.IO

Dim workbook As IWorkbook = New XSSFWorkbook()
Dim worksheet As ISheet = workbook.CreateSheet("Products")
Dim headerRow As IRow = worksheet.CreateRow(0)
headerRow.CreateCell(0).SetCellValue("Product")
headerRow.CreateCell(1).SetCellValue("Price")
Dim dataRow As IRow = worksheet.CreateRow(1)
dataRow.CreateCell(0).SetCellValue("Widget")
dataRow.CreateCell(1).SetCellValue(9.99)

Using file As FileStream = New FileStream("products.xlsx", FileMode.Create)
    workbook.Write(file)
End Using
$vbLabelText   $csharpLabel

在C#中建立Excel文件的方法:Interop與IronXL:圖4 - NPOI輸出

NPOI允許程式生成Excel工作表和工作簿,支持多種文件格式,包括CSV、XLSX和XLS文件。 然而,其Java傳承使得API不如其他C# Excel程式庫直觀。

關鍵決策因素

什麼時候選擇IronXL

IronXL在需要跨平台Excel程式庫支持、全面的Excel功能和專業支援的企業應用程式中表現出色。 當您需要在未安裝Office的情況下建立Excel文件時,其直觀的API可以減少開發時間,而其穩健的性能可以有效處理大量資料集。 其內建的公式引擎和對多種格式(XLS、XLSX、CSV、TSV)的支持使其能適應各種業務需求。

替代考量

EPPlus適用於已使用版本4.5.3或更早(最後免費版本)或已擁有EPPlus商業許可的項目。 ClosedXML適合沒有製圖需求且需要基本電子錶需要的開源項目。 當XLS支持至關重要且需要最小化許可成本時,NPOI仍然十分相關。

與其他商業選項的比較:GemBox.Spreadsheet提供與IronXL相似的功能,價格具競爭性,而Aspose.Cells提供了廣泛的功能但價格較高。 然而,IronXL的功能,性能和支持的組合經常為Excel操作.NET項目提供最好的價值。

從Interop到IronXL的遷移

從Excel Interop遷移到IronXL遵循一個簡單的模式。 欲獲取詳細指導,請參閱IronXL文件並探索程式碼範例

  1. 刪除COM引用 - 用IronXL替換Microsoft.Office.Interop.Excel引用
  2. 簡化物件建立 - 用直接的WorkBook建立替換Application/Workbook/Worksheet層次結構
  3. 更新單元格存取 - 從Cells[row, col]轉換為worksheet["A1"]標記
  4. 移除清理程式碼 - 消除Marshal.ReleaseComObject呼叫
  5. 測試跨平台 - 驗證目標部署平台上的功能

對於涉及Excel圖表條件格式的複雜遷移,IronXL提供了全面的支持。

瞭解限制

請注意,主要互操作程式集(PIA)不能在沒有安裝Excel的情況下運行—它們只不過是需要真實Office應用程式的COM物件的接口。 這種誤解通常導致在將應用程式部署到伺服器或嘗試在未安裝Office的情況下進行Excel自動化時遇到失敗。

關於安全性,IronXL進行定期的安全審計並保持DigiCert認證,提供企業級保護,沒有與COM介面相關的漏洞。 欲獲取詳細的安全資訊,請存取IronXL安全文件

結論

雖然Excel Interop曾在桌面應用程式中發揮過作用,但現代開發需要比Excel程式庫更靈活的替代品。 IronXL提供了攥妥不使用Interop建立Excel文件的最全面的替代方案,結合了易用性、企業功能和跨平台支持。

無論您是構建雲應用程式、在Docker容器中工作,還是開發跨平台解決方案,選擇一個不需要安裝Excel的程式庫,對於建立可擴展和可維護的應用程式至關重要。 下載IronXL以立即改變您的Excel自動化工作流。

常見問題

使用C#中的Excel Interop有哪些限制?

C#中的Excel Interop可能受到其依賴Microsoft Excel安裝、潛在的性能問題以及缺乏跨平台支持的限制。IronXL為電子表格操作提供了更高效和多功能的替代方案。

為什麼我應考慮使用IronXL而不是Excel Interop?

IronXL提供更強大的解決方案,具有跨平台功能、更快的性能和減少的記憶體使用。它不需要在伺服器上安裝Excel,這使其更適合於伺服器端應用程式。

IronXL能否高效處理大型資料集?

是的,IronXL經過優化以高效處理大型資料集。它比Excel Interop提供更好的性能和記憶體管理,使其非常適合處理大量資料。

IronXL與.NET Core相容嗎?

IronXL完全相容.NET Core,允許開發者建立能在多個平台上運作而不依賴於Microsoft Excel安裝的應用程式。

IronXL有哪些授權選項?

IronXL提供靈活的授權選項,包括單一開發者、團隊和企業授權,適合不同項目規模和預算。

IronXL支持將資料導出到Excel格式嗎?

IronXL支持將資料導出到多種Excel格式,如XLS、XLSX和CSV,提供滿足各種資料操作和展示需求的靈活性。

我可以使用IronXL來自動生成Excel報告嗎?

可以,IronXL設計用於促進自動化Excel報告的生成,提供資料篩選、圖表建立和公式處理等功能來簡化報告任務。

IronXL如何在Excel操作中確保資料準確性?

IronXL以其可靠的公式處理和單元格格式能力確保資料準確性,最小化錯誤並在Excel操作中保持資料完整性。

IronXL支持哪些程式語言?

IronXL主要設計用於C#,但也支持其他.NET語言,使其對於在.NET生態系統中工作的開發者來說是多用途的。

IronXL提供客戶支援嗎?

IronXL提供全面的客戶支援,包括文件、教程和直接協助,確保開發者能在項目中有效利用程式庫。

Curtis Chau
技術作家

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

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話