跳過到頁腳內容
使用 IRONXL

ExcelDataReader 無法寫入 Excel 檔案:原因及 IronXL 如何解決此問題

許多開發人員在搜尋輕量級解決方案來處理 C# 中的 Excel 檔案時,都會選擇 ExcelDataReader。 該函式庫名稱聽起來彷彿能完整操控 Excel,但很快便顯露出根本性的限制:ExcelDataReader 完全無法寫入 Excel 檔案。 本指南釐清了這個常見的誤解,闡述其背後的架構原因,並展示 IronXL 如何透過在單一且整合的 .NET 程式庫中提供真正的雙向 Excel 支援(讀取與寫入),來解決此問題。

完成本教學後,您將了解 ExcelDataReader 為何在設計上為唯讀模式、如何將現有的讀取邏輯遷移至 IronXL,以及如何建立完整的 Excel 工作流程——包含建立工作簿、寫入儲存格值、套用公式、格式化資料及儲存輸出檔案——且完全無需依賴 Microsoft Office。

ExcelDataReader 能否寫入 Excel 工作簿資料?

ExcelDataReader 無法寫入 Excel 檔案:原因及 IronXL 的解決方案:圖 1 - ExcelDataReader

不。ExcelDataReader 設計上為唯讀函式庫,此限制是刻意為之。 ExcelDataReader 的官方 GitHub 儲存庫明確將該專案描述為"用於讀取 Microsoft Excel 檔案的函式庫"——其公開介面中完全不存在寫入 API、儲存方法,亦無任何儲存格值的設定器。 您可以親自瀏覽 ExcelDataReader NuGet 套件頁面來驗證此點,該頁面的套件說明特別強調了其唯讀的適用範圍。

ExcelDataReader 支援讀取 XLS、XLSX 和 CSV 格式,並能高效地完成這項任務。 此函式庫提供類似 ADO.NET 中 IDataReader 的串流式、僅前向讀取模式。 該架構非常適合快速擷取大型資料集,但與 Excel 寫入所需的隨機存取、可變模型在根本上不相容。

以下程式碼示範了使用 ExcelDataReader 時所遇到的限制:

using ExcelDataReader;
using System.Text;

// Register the encoding provider required for .NET 5+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

using var stream = File.Open("source.xlsx", FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);

while (reader.Read())
{
    string cellValue = reader.GetString(0); // Read a cell value
    Console.WriteLine(cellValue);
    // There is no Write(), Save(), or SetCellValue() method here
}
using ExcelDataReader;
using System.Text;

// Register the encoding provider required for .NET 5+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

using var stream = File.Open("source.xlsx", FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);

while (reader.Read())
{
    string cellValue = reader.GetString(0); // Read a cell value
    Console.WriteLine(cellValue);
    // There is no Write(), Save(), or SetCellValue() method here
}
Imports ExcelDataReader
Imports System.Text
Imports System.IO

' Register the encoding provider required for .NET 5+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

Using stream = File.Open("source.xlsx", FileMode.Open, FileAccess.Read)
    Using reader = ExcelReaderFactory.CreateReader(stream)
        While reader.Read()
            Dim cellValue As String = reader.GetString(0) ' Read a cell value
            Console.WriteLine(cellValue)
            ' There is no Write(), Save(), or SetCellValue() method here
        End While
    End Using
End Using
$vbLabelText   $csharpLabel

呼叫 Read() 後,完全不存在等效的 Write()Save() 對應項。 當您的應用程式需要產生報表、更新試算表儲存格、將資料匯出為 XLSX、套用公式或處理範本時,ExcelDataReader 將為您提供完整的工具箱。

這不是錯誤。 此為經過深思熟慮的範圍決定。 ExcelDataReader 專注於做好一件事,並僅止於此。 任何涉及將資料寫回 Excel 的工作流程,都需要使用完全不同的函式庫。

IronXL 如何解決寫作難題?

! ExcelDataReader 寫入 Excel 檔案:為什麼無法寫入以及 IronXL 如何解決此問題:圖 2 - IronXL

IronXL 提供統一的 API,讓您無需安裝 Microsoft Office 即可讀取、建立、修改及儲存 Excel 檔案。 該函式庫將 Excel 工作簿視為一個完全可變的、位於記憶體中的物件圖。 您可以載入或建立工作簿,透過引用導航到任何儲存格,設定值或公式,套用樣式,然後呼叫 SaveAs() -- 工作流程,該工作流程反映了人類在 Excel 中實際操作的方式。

IronXL 支援 XLSX、XLS、CSV、TSV 及 JSON 格式,適用於輸入與輸出。 它可在 .NET 10、.NET Standard 及 .NET Framework 上運行,因此同樣適用於主控台應用程式、ASP.NET Core Web API、桌面工具以及背景處理服務。

如何安裝 IronXL?

請使用以下任一指令從 NuGet 安裝 IronXL:

Install-Package IronXL
Install-Package IronXL
SHELL
dotnet add package IronXL
dotnet add package IronXL
SHELL

安裝完成後,IronXL 命名空間即可使用。 無需 COM 互通、無需 Office PIA、無需額外執行階段元件。

如何建立並撰寫您的第一個 Excel 檔案?

以下範例展示如何從頭建立工作簿、寫入標題列與資料列,並透過頂層語句儲存輸出結果:

using IronXL;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Report");

// Write header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Quantity";
sheet["C1"].Value = "Unit Price";

// Write a data row
sheet["A2"].Value = "Widget";
sheet["B2"].Value = 150;
sheet["C2"].Value = 9.99;

workBook.SaveAs("report.xlsx");
Console.WriteLine("Workbook saved.");
using IronXL;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Report");

// Write header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Quantity";
sheet["C1"].Value = "Unit Price";

// Write a data row
sheet["A2"].Value = "Widget";
sheet["B2"].Value = 150;
sheet["C2"].Value = 9.99;

workBook.SaveAs("report.xlsx");
Console.WriteLine("Workbook saved.");
Imports IronXL

Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workBook.CreateWorkSheet("Report")

' Write header row
sheet("A1").Value = "Product"
sheet("B1").Value = "Quantity"
sheet("C1").Value = "Unit Price"

' Write a data row
sheet("A2").Value = "Widget"
sheet("B2").Value = 150
sheet("C2").Value = 9.99

workBook.SaveAs("report.xlsx")
Console.WriteLine("Workbook saved.")
$vbLabelText   $csharpLabel

這將取代 ExcelDataReader 未能完整實現的整個工作流程。 沒有類包裝器,也沒有 static void Main() 儀式-只有頂級語句和一個已儲存的檔案。

如何在單一 IronXL 工作流程中進行讀取與寫入?

常見的需求是讀取現有的 Excel 檔案,轉換其中的資料,並將結果寫回檔案中。 ExcelDataReader 僅處理第一步,這意味著您需要引入第二個函式庫——這是不必要的複雜性,會增加依賴項管理的負擔,並可能引發版本衝突。

IronXL 涵蓋整個處理流程。以下範例將載入來源檔案、讀取 A 欄位的數值、進行轉換,並將修改後的工作簿儲存為新檔案:

using IronXL;

WorkBook workBook = WorkBook.Load("source.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// Read existing data
string originalValue = sheet["A1"].StringValue;
Console.WriteLine($"Original: {originalValue}");

// Modify existing data
sheet["A1"].Value = originalValue.ToUpper();

// Add new data alongside existing content
sheet["B1"].Value = DateTime.無w.ToString("yyyy-MM-dd");
sheet["C1"].Formula = "=LEN(A1)";

workBook.SaveAs("modified.xlsx");
Console.WriteLine("Modified workbook saved.");
using IronXL;

WorkBook workBook = WorkBook.Load("source.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// Read existing data
string originalValue = sheet["A1"].StringValue;
Console.WriteLine($"Original: {originalValue}");

// Modify existing data
sheet["A1"].Value = originalValue.ToUpper();

// Add new data alongside existing content
sheet["B1"].Value = DateTime.無w.ToString("yyyy-MM-dd");
sheet["C1"].Formula = "=LEN(A1)";

workBook.SaveAs("modified.xlsx");
Console.WriteLine("Modified workbook saved.");
Imports IronXL

Dim workBook As WorkBook = WorkBook.Load("source.xlsx")
Dim sheet As WorkSheet = workBook.DefaultWorkSheet

' Read existing data
Dim originalValue As String = sheet("A1").StringValue
Console.WriteLine($"Original: {originalValue}")

' Modify existing data
sheet("A1").Value = originalValue.ToUpper()

' Add new data alongside existing content
sheet("B1").Value = DateTime.Now.ToString("yyyy-MM-dd")
sheet("C1").Formula = "=LEN(A1)"

workBook.SaveAs("modified.xlsx")
Console.WriteLine("Modified workbook saved.")
$vbLabelText   $csharpLabel

WorkBook.Load() 呼叫將檔案作為可變物件讀入記憶體。 接著,您可以透過類似 Excel 的座標引用來瀏覽儲存格、更新數值、設定公式並節省——所有操作皆在單一函式庫與單一 API 模式下完成。

IronXL 支援哪些進階寫作功能?

IronXL 不僅能進行簡單的儲存格賦值,更完整地提供了企業應用程式通常所需的 Excel 各項功能。

如何應用公式與格式設定?

公式遵循標準的 Excel 語法。 格式設定採用流暢的物件模型,可直接對應至 Excel 的格式選項:

using IronXL;
using IronXL.Styles;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Analytics");

// Write labels
sheet["A1"].Value = "Revenue";
sheet["B1"].Value = "Cost";
sheet["C1"].Value = "Margin";

// Write data
sheet["A2"].Value = 50000;
sheet["B2"].Value = 32000;

// Write a calculated formula
sheet["C2"].Formula = "=A2-B2";

// Apply bold formatting to the header row
sheet["A1:C1"].Style.Font.Bold = true;

// Highlight the margin cell
sheet["C2"].Style.BackgroundColor = "#D4EDDA";
sheet["C2"].Style.Font.Bold = true;

workBook.SaveAs("analytics.xlsx");
using IronXL;
using IronXL.Styles;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Analytics");

// Write labels
sheet["A1"].Value = "Revenue";
sheet["B1"].Value = "Cost";
sheet["C1"].Value = "Margin";

// Write data
sheet["A2"].Value = 50000;
sheet["B2"].Value = 32000;

// Write a calculated formula
sheet["C2"].Formula = "=A2-B2";

// Apply bold formatting to the header row
sheet["A1:C1"].Style.Font.Bold = true;

// Highlight the margin cell
sheet["C2"].Style.BackgroundColor = "#D4EDDA";
sheet["C2"].Style.Font.Bold = true;

workBook.SaveAs("analytics.xlsx");
Imports IronXL
Imports IronXL.Styles

Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workBook.CreateWorkSheet("Analytics")

' Write labels
sheet("A1").Value = "Revenue"
sheet("B1").Value = "Cost"
sheet("C1").Value = "Margin"

' Write data
sheet("A2").Value = 50000
sheet("B2").Value = 32000

' Write a calculated formula
sheet("C2").Formula = "=A2-B2"

' Apply bold formatting to the header row
sheet("A1:C1").Style.Font.Bold = True

' Highlight the margin cell
sheet("C2").Style.BackgroundColor = "#D4EDDA"
sheet("C2").Style.Font.Bold = True

workBook.SaveAs("analytics.xlsx")
$vbLabelText   $csharpLabel

公式支援文件涵蓋算術、邏輯、日期時間、字串及統計函數。 儲存格格式設定指南說明了數字格式、日期格式以及自訂格式字串。

如何將 CSV 資料匯出至 Excel?

IronXL 可將 CSV 檔案直接轉換為 XLSX 格式,讓您能新增標題、套用格式,並以下游使用者所期待的結構化格式儲存:

using IronXL;

// Load a CSV file as if it were a workbook
WorkBook csvWorkBook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkBook.DefaultWorkSheet;

// Apply a bold header style to the first row
csvSheet["A1:Z1"].Style.Font.Bold = true;

// Save as XLSX
csvWorkBook.SaveAs("converted.xlsx");
Console.WriteLine("CSV converted to XLSX.");
using IronXL;

// Load a CSV file as if it were a workbook
WorkBook csvWorkBook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkBook.DefaultWorkSheet;

// Apply a bold header style to the first row
csvSheet["A1:Z1"].Style.Font.Bold = true;

// Save as XLSX
csvWorkBook.SaveAs("converted.xlsx");
Console.WriteLine("CSV converted to XLSX.");
Imports IronXL

' Load a CSV file as if it were a workbook
Dim csvWorkBook As WorkBook = WorkBook.LoadCSV("data.csv", fileFormat:=ExcelFileFormat.CSV)
Dim csvSheet As WorkSheet = csvWorkBook.DefaultWorkSheet

' Apply a bold header style to the first row
csvSheet("A1:Z1").Style.Font.Bold = True

' Save as XLSX
csvWorkBook.SaveAs("converted.xlsx")
Console.WriteLine("CSV converted to XLSX.")
$vbLabelText   $csharpLabel

此單一工作流程取代了原本需要 ExcelDataReader 進行讀取,並搭配獨立寫入函式庫進行輸出的多函式庫流程。

如何將 ExcelDataReader 與 IronXL 進行並列比較?

下表概述了這兩套函式庫在最常見的 Excel 開發情境中的功能差異:

功能比較:ExcelDataReader 與 IronXL
能力 ExcelDataReader IronXL
讀取 XLSX / XLS
讀取 CSV
撰寫 / 建立 XLSX
撰寫公式
套用儲存格樣式
條件格式
建立圖表
匯出為 CSV / TSV
Office 依賴項
相容於 .NET 10

當僅需讀取功能且二進位檔大小是考量重點時,ExcelDataReader 仍是值得考慮的選項。 凡涉及輸出情境,IronXL 皆為合適的工具。

何時該使用 IronXL?

每當您的應用程式需要建立或修改 Excel 檔案時,IronXL 都是最佳選擇。 以下情境代表 ExcelDataReader 無法滿足的實際業務需求:

  • 報表生成:根據資料庫查詢、API 回應或記憶體內運算,產生 Excel 報表。 請參閱 Excel 報表建立指南,以獲取結構化的操作指引。
  • 資料匯出:將應用程式資料(集合、DataTables 或 DataSets)轉換為 XLSX 格式,以便下載或歸檔。 "DataTable 轉 Excel"教學範例中展示了確切的 API 用法。
  • 範本處理:載入包含佔位符儲存格的 XLSX 範本,動態填入資料,然後儲存已填入資料的結果。
  • 批次檔案修改:遍歷工作簿目錄,透過程式碼套用變更,並儲存每個檔案。IronXL 可獨立處理多個開啟的工作簿。
  • 發票與財務文件生成:建立包含公式、數字格式、合併儲存格及樣式化標題的結構化文件。
  • CSV 轉 XLSX 轉換:接受以逗號分隔的檔案上傳,將其重新格式化為結構化工作簿,並向使用者提供 XLSX 格式下載檔。

過去需要同時使用讀取函式庫與寫入函式庫——或依賴透過 COM 進行 Excel 自動化——的商業應用程式,現在僅需 IronXL 即可整合完成。

針對進階輸出情境,條件格式化文件圖表建立指南涵蓋了完整的格式化與視覺化功能。 授權頁面概述了生產環境部署選項,而完整的 API 參考文件則詳盡記載了每個類別與方法。

如何開始免費試用?

IronXL 提供免費開發授權。 請安裝 NuGet 套件,使用您自己的檔案執行上述範例,並在購買正式授權前確認輸出結果符合您的需求。

IronXL 入門指南》透過可執行的程式碼,逐步引導您完成安裝、首次使用模式及常見應用情境。 教學指南部分詳細介紹了讀取工作流程,若您的應用程式同時需要讀取與寫入操作,此內容將非常實用。

立即開始免費試用,即可使用完整功能集,包括匯出格式、進階格式設定、公式評估以及多工作表工作簿管理。 對於需要大規模評估此套件的團隊,IronSuite 組合包包含 IronXL,並與 IronPDF、IronOCR 及其他生產力套件一併提供,享有優惠的組合價格。

ExcelDataReader 是否仍值得使用?

ExcelDataReader 是一個維護完善、目標明確的開源函式庫。 若您的應用程式僅讀取 Excel 檔案而從不寫入——例如將上傳的 XLSX 檔案匯入資料庫的資料導入管道——ExcelDataReader 便是一個合理且輕量化的選擇。其串流模型在處理超大檔案時能有效節省記憶體。

問題在於需求擴展時便會產生。 許多應用程式最初僅作為唯讀匯入工具,但隨後往往會演進為產生確認匯出、錯誤報告,或原始檔案的修改副本。 此時,ExcelDataReader 的功能範圍限制便成為阻礙,而在專案中途遷移至讀寫型函式庫,其造成的干擾遠大於從一開始就採用讀寫型函式庫。

從一開始就選擇 IronXL,即可同時滿足這兩種情境的需求。 IronXL 讀取教學示範了使用 IronXL 進行讀取同樣直觀——儲存格參照、範圍迭代、DataSet 匯出以及類型安全的值存取,皆透過相同的熟悉 API 運作。

接下來該怎麼做?

ExcelDataReader 是一個唯讀函式庫。 此限制為預設設定,不會變更。 若您的專案需要以任何形式撰寫、修改或匯出 Excel 檔案,您需要一個專為雙向 Excel 存取所建構的函式庫。

IronXL 具備此功能,且無需依賴 Office、無需處理 COM 互通的複雜性,也無需將多個套件組合成脆弱的多庫堆疊。 請從 NuGet 安裝,將現有的讀取程式碼替換為 IronXL 的對應方法,並在需要時新增寫入操作——該 API 在讀取與寫入方向上均保持一致。

請參閱 IronXL 文件以了解該程式庫的完整功能範圍。 請參閱操作指南,了解如何執行特定任務,例如寫入 Excel 檔案建立試算表以及讀取現有工作簿。 當您準備評估正式授權方案時,定價與授權頁面列出了所有可用的方案等級。

常見問題解答

ExcelDataReader 可以寫入 Excel 檔案嗎?

不,ExcelDataReader 不能寫入 Excel 檔案。它專門用於讀取 Excel 資料。

使用 ExcelDataReader 有什麼限制?

ExcelDataReader 的一個重大限制在於它無法寫入 Excel 文件,儘管它的名稱暗示它具有完整的 Excel 功能。

如何克服 ExcelDataReader 的寫入限制?

您可以使用 IronXL 來克服此限制,IronXL 允許在 C# 中讀取和寫入 Excel 檔案。

IronXL 提供了哪些 ExcelDataReader 沒有的功能?

IronXL 提供全面的 Excel 檔案處理功能,包括讀取和寫入,而 ExcelDataReader 則不具備這些功能。

IronXL 是 C# 中處理 Excel 檔案的一個好替代方案嗎?

是的,IronXL 是一個很好的替代方案,因為它提供了在 C# 中讀取和寫入 Excel 檔案的完整功能。

為什麼開發人員會選擇 IronXL 而不是 ExcelDataReader?

開發人員可能會選擇 IronXL 而不是 ExcelDataReader,因為它能夠無縫地處理 Excel 文件的讀取和寫入。

使用IronXL進行Excel文件操作有哪些好處?

IronXL 具備讀取和寫入 Excel 檔案的完整功能,使其成為比 ExcelDataReader 更通用、更全面的解決方案。

IronXL 如何處理 Excel 檔案寫入?

IronXL 提供簡單直接的 Excel 檔案編寫方法,讓開發人員能夠輕鬆且有效率地完成工作。

IronXL 能否同時處理 Excel 檔案的讀寫操作?

是的,IronXL 旨在用 C# 有效地處理 Excel 檔案的讀取和寫入。

在使用 ExcelDataReader 之前我應該了解哪些內容?

在使用 ExcelDataReader 之前,請注意它僅支援讀取 Excel 文件,不具備寫入功能。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

鋼鐵支援團隊

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