跳過到頁腳內容
使用 IRONXL

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

許多 C# 開發人員在嘗試閱讀 Excel 表格文件時遇到常見挑戰:他們信任的 StreamReader,雖然對文本文件運行良好,但在 Excel 文件中卻神秘地失效。 如果您嘗試使用 C# 中的 StreamReader 讀取 Excel 文件卻只看到乱码或異常,這並非罕見。 本教程解釋了為什麼 StreamReader 無法直接處理 Excel 文件,並演示了如何使用 IronXL 而不是 Excel Interop 來進行正確的解決方案。

困惑通常來自於 CSV 文件,Excel 可以打開,與 StreamReader 一起工作正常。 然而,真正的 Excel 文件(XLSX、XLS)需要根本不同的方法。 理解這個區別將為您節省數小時的調試時間,並引導您找到正確的工具。

如何將 DataGridView 匯出至 Excel(VB.NET):圖 1 - IronXL

為什麼 StreamReader 無法讀取 Excel 文件?

StreamReader 專為純文本文件設計,使用指定的編碼按行讀取字符數據。 Excel 文件儘管像是電子表格,但實際上是複雜的二進制或壓縮 XML 結構,StreamReader 無法解析。

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 文件的壓縮文件,而 XLS 文件使用專有的二進制格式。 StreamReader 期望純文本並試圖將這些複雜結構解釋為字符,導致無意義的輸出。

示例輸入

如何將 DataGridView 匯出至 Excel(VB.NET):圖 2 - Excel 輸入

輸出

如何將 DataGridView 匯出至 Excel(VB.NET):圖 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,這與數據庫和數據綁定場景無縫集成。

輸出

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

何時使用 object sender 來讀取數據?

在此代碼用於事件驅動編程的情況下(例如,處理 Windows Forms 或 ASP.NET 中文件上傳按鈕),方法簽名通常包括像 object sender 和 EventArgs e 這樣的參數。 這個上下文確保 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 文件,而不需要 Excel Interop,提供了一個更高效且可靠的解決方案。

IronXL 如何改善 C# 中的 Excel 文件讀取過程?

IronXL 簡化了讀取 Excel 文件的過程,提供方法來訪問 Excel 數據,無需復雜的 Interop 代碼或處理文件格式的繁瑣細節。

我可以使用 IronXL 在未安裝 Excel 的情況下讀取 Excel 文件嗎?

是的,IronXL 不需要在系統上安裝 Microsoft Excel,它是一個處理 C# 中的 Excel 文件的獨立解決方案。

使用 IronXL 代替 Excel Interop 有哪些優勢?

IronXL 更快,消除了需要安裝 Excel 的要求,並降低了通常與 Excel Interop 一起出現的版本兼容性問題的風險。

IronXL 適合用於大型 Excel 文件嗎?

是的,IronXL 經過性能優化,可以高效處理大型 Excel 文件,非常適合處理大量數據的應用程序。

IronXL 是否支持讀取 .xls 和 .xlsx 格式?

IronXL 支持 .xls 和 .xlsx 格式,讓開發人員無縫處理各種 Excel 文件類型。

如何在我的 C# 項目中開始使用 IronXL?

您可以通過在 Visual Studio中使用 NuGet 套件管理器安裝 IronXL 並將其整合到您的 C# 項目中來開始使用,以讀取和操作 Excel 文件。

IronXL 的常見使用案例有哪些?

IronXL 的常見使用案例包括從 Excel 文件中提取數據、生成報告、數據操作以及自動化 C# 應用中的 Excel 相關任務。

IronXL 可以用於 Web 應用程序中嗎?

是的,IronXL 可用於桌面和網路應用程序中,為在專案中實施 Excel 處理功能提供了靈活性。

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