跳過到頁腳內容
使用 IRONXL

如何使用 StreamReader 在 C# 中讀取 Excel 文件

許多 C# 開發人員在嘗試讀取 Excel 表格文件時都會遇到一個共同的挑戰:他們信賴的 StreamReader 可以完美地處理文字文件,但卻無法處理 Excel 文檔,這令人費解。 如果你嘗試使用 C# 中的 StreamReader 讀取 Excel 文件,卻只看到亂碼或異常,那麼你並不孤單。 本教學解釋了為什麼 StreamReader 不能直接處理 Excel 文件,並示範了不使用 Excel Interop 的 IronXL 的正確解決方案。

這種混淆通常是因為 Excel 可以開啟 CSV 文件,而 StreamReader 也可以正常開啟 CSV 檔案。 然而,真正的 Excel 檔案(XLSX、XLS)需要採用完全不同的方法。 理解這一區別將為您節省數小時的調試時間,並引導您找到完成這項工作的正確工具。

如何在 VB.NET 中將 DataGridView 匯出到 Excel:圖 1 - IronXL

為什麼 StreamReader 無法讀取 Excel 檔案?

StreamReader 專為純文字檔案設計,使用指定的編碼逐行讀取字元資料。 Excel 檔案雖然看起來像電子表格,但實際上是 StreamReader 無法解釋的複雜二進位或 ZIP 壓縮 XML 結構。

static void Main(string[] args)
{
 // This code will NOT work - demonstrates the problem
 using (StreamReader reader = new StreamReader("ProductData.xlsx"))
 {
    string content = reader.ReadLine(); // read data
    Console.WriteLine(content); // Outputs garbled binary data
 }
}
static void Main(string[] args)
{
 // This code will NOT work - demonstrates the problem
 using (StreamReader reader = new StreamReader("ProductData.xlsx"))
 {
    string content = reader.ReadLine(); // read data
    Console.WriteLine(content); // Outputs garbled binary data
 }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

當您執行此類程式碼片段時,您將不會看到電子表格數據,而是會遇到二進位未知數據,例如"PK♥♦"或類似的系統字元。 這是因為 XLSX 檔案是包含多個 XML 檔案的 ZIP 壓縮文件,而 XLS 檔案使用專有的二進位格式。 StreamReader 期望的是純文本,並嘗試將這些複雜的結構解釋為字符,從而導致輸出毫無意義。

範例輸入

如何在 VB.NET 中將 DataGridView 匯出到 Excel:圖 2 - Excel 輸入

輸出

如何在 VB.NET 中將 DataGridView 匯出到 Excel:圖 3 - 控制台輸出

現代 Excel 檔案 (XLSX) 包含多個元件:工作表、樣式、共用字串和關係,所有這些都打包在一起。 這種複雜性需要能夠理解 Excel 檔案結構的專用函式庫,這就引出了 IronXL。

如何使用 IronXL 讀取 Excel 檔案?

IronXL為使用 C# 讀取 Excel 檔案提供了一個簡單的解決方案。 與 StreamReader 不同,IronXL 了解 Excel 的內部結構,並提供直覺的方法來存取您的資料。 該程式庫支援 Windows、Linux、macOS 和 Docker 容器,使其成為現代跨平台應用程式的理想選擇。

如何在 C# 中使用 StreamReader 讀取 Excel 檔案:圖 4 - 跨平台

首先,透過 NuGet 套件管理器安裝 IronXL:

Install-Package IronXL.Excel

如何在 C# 中使用 StreamReader 讀取 Excel 檔案:圖 5 - 安裝

以下是正確讀取Excel檔案的方法:

using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這段程式碼可以成功載入您的 Excel 文件,並提供對儲存格值的直接存取。 WorkBook.Load 方法會自動偵測檔案格式(XLSX、XLS、XLSM、CSV),並在內部處理所有複雜的解析。 您可以使用熟悉的 Excel 表示法(例如"A1")或範圍(例如"A1:C5")來存取儲存格,這使得熟悉 Excel 的人能夠直觀地理解程式碼。

如何從記憶體流中讀取Excel?

實際應用中經常需要處理來自資料流而不是磁碟檔案的 Excel 檔案。 常見場景包括處理網頁上傳、從資料庫檢索文件或處理來自雲端儲存的資料。 IronXL能夠優雅地處理這些情況:

using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count 
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count 
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

WorkBook.FromStream 方法接受任何流類型,無論是 MemoryStream、FileStream 或網路流。 這種靈活性使您無需先將 Excel 檔案儲存到磁碟即可處理來自各種來源的檔案。此範例還示範如何將工作表資料轉換為 DataTable,DataTable 可以與資料庫和資料綁定場景無縫整合。

輸出

如何在 C# 中使用 StreamReader 讀取 Excel 檔案:圖 6 - 從 MemoryStream 輸出讀取 Excel 文件

何時使用物件傳送器讀取資料?

在事件驅動程式設計中使用此程式碼的情況下(例如,在 Windows Forms 或 ASP.NET 中處理檔案上傳按鈕),該方法簽章通常包含諸如 object sender 和 EventArgs 之類的參數。 此上下文可確保 Excel 處理邏輯與 UI 或服務事件正確關聯。

如何在 C# 中使用 StreamReader 讀取 Excel 檔案:圖 7 - 功能

如何在Excel和CSV之間進行轉換?

雖然 StreamReader 可以處理 CSV 文件,但您經常需要在 Excel 和 CSV 格式之間進行轉換。 IronXL 讓這種轉換變得非常簡單:

using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這些轉換操作會在變更檔案格式的同時保留您的資料。 將 Excel 轉換為 CSV 時,IronXL 預設會將第一個工作表展平,但您可以指定要匯出的工作表。 將 CSV 檔案轉換為 Excel 檔案會產生格式正確的電子表格,該電子表格可以保留資料類型,並支援將來進行格式設定和新增公式。

結論

StreamReader 無法處理 Excel 文件,其根本原因在於純文字與 Excel 複雜的文件結構之間存在根本差異。 雖然 StreamReader 可以完美地處理 CSV 和其他文字格式,但真正的 Excel 檔案需要像 IronXL 這樣能夠理解其中二進位和 XML 結構的專用程式庫。

IronXL 憑藉其直覺的 API、全面的格式支援和無縫的串流處理功能,提供了一個優雅的解決方案。 無論您是建立 Web 應用程式、桌面軟體或雲端服務,IronXL 都能在所有平台上可靠地處理 Excel 檔案。

如何在 C# 中使用 StreamReader 讀取 Excel 檔案:圖 8 - 許可

準備好開始正確使用Excel檔案了嗎? 下載最符合您專案需求的 IronXL 免費試用版

常見問題解答

為什麼 StreamReader 在 C# 中無法讀取 Excel 檔案?

StreamReader 旨在讀取文字檔案,缺乏處理 Excel 檔案二進位格式的能力,因此會產生亂碼或異常。

IronXL 是什麼?

IronXL 是一個 C# 函式庫,可讓開發人員在不需要 Excel Interop 的情況下讀取、寫入及處理 Excel 檔案,提供更有效率且可靠的解決方案。

IronXL 如何改善以 C# 語言閱讀 Excel 檔案?

IronXL.Excel 透過提供存取 Excel 資料的方法,簡化了讀取 Excel 檔案的過程,而不需要複雜的互操作程式碼或處理複雜的檔案格式。

我可以在沒有安裝 Excel 的情況下使用 IronXL 讀取 Excel 檔案嗎?

是的,IronXL 不需要在您的系統上安裝 Microsoft Excel,使其成為用 C# 處理 Excel 檔案的獨立解決方案。

與 Excel Interop 相比,使用 IronXL 有哪些好處?

IronXL.Excel 的速度更快,不需要安裝 Excel,並降低了 Excel Interop 常見的版本相容性問題的風險。

IronXL 是否適合大型 Excel 檔案?

是的,IronXL.Excel 已針對效能進行最佳化,並能有效率地處理大型 Excel 檔案,因此適合處理大量資料的應用程式。

IronXL 支援讀取 .xls 和 .xlsx 兩種格式嗎?

IronXL.Excel 支援 .xls 和 .xlsx 兩種格式,讓開發人員可以無縫處理各種 Excel 檔案類型。

如何開始在我的 C# 專案中使用 IronXL?

您可以透過 Visual Studio 中的 NuGet Package Manager 安裝 IronXL,並將其整合至您的 C# 專案中以讀取和處理 Excel 檔案,即可開始使用 IronXL。

IronXL 的常見用例有哪些?

IronXL 的常見用例包括從 Excel 檔案擷取資料、產生報表、資料處理,以及在 C# 應用程式中自動執行 Excel 相關工作。

IronXL 可以用於 Web 應用程式嗎?

是的,IronXL.Excel 可在桌面和 Web 應用程式中使用,為您在專案中實作 Excel 處理功能的方式提供彈性。

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