C# 中讀取 Excel 檔案的 StreamReader 替代方案 - IronXL
許多 C# 開發人員在嘗試讀取 Excel 表格文件時都會遇到一個共同的挑戰:他們信賴的StreamReader可以完美地處理文字文件,但卻無法處理 Excel 文檔,這令人費解。 如果你嘗試使用 C# 中的StreamReader讀取 Excel 文件,卻只看到亂碼或異常,那麼你並不孤單。 本教學解釋了為什麼StreamReader不能直接處理 Excel 文件,並示範了不使用 Excel Interop 的 IronXL 的正確解決方案。
這種混淆通常是因為 Excel 可以開啟 CSV 文件,而StreamReader也可以正常開啟 CSV 檔案。 然而,真正的 Excel 檔案(XLSX、XLS)需要採用完全不同的方法。 理解這一區別將為您節省數小時的調試時間,並引導您找到完成這項工作的正確工具。
! C# 中使用 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 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當您執行此類程式碼片段時,您將不會看到電子表格數據,而是會遇到二進位未知數據,例如"PK♥♦"或類似的系統字元。 這是因為 XLSX 檔案是包含多個 XML 檔案的 ZIP 壓縮文件,而 XLS 檔案使用專有的二進位格式。 StreamReader期望的是純文本,並嘗試將這些複雜的結構解釋為字符,從而導致輸出毫無意義。
範例輸入
! C# 中使用 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 2 - Excel 輸入
輸出
! 使用 C# 中的 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 3 - 控制台輸出
現代 Excel 檔案 (XLSX) 包含多個元件:工作表、樣式、共用字串和關係,所有這些都打包在一起。 這種複雜性需要能夠理解 Excel 檔案結構的專用函式庫,這就引出了 IronXL。
如何使用 IronXL 讀取 Excel 檔案?
IronXL為使用 C# 讀取 Excel 檔案提供了一個簡單的解決方案。 與StreamReader不同,IronXL 了解 Excel 的內部結構,並提供直覺的方法來存取您的資料。 該程式庫支援 Windows、Linux、macOS 和 Docker 容器,使其成為現代跨平台應用程式的理想選擇。
! 使用 C# 中的 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 4 - 跨平台
首先,透過 NuGet 套件管理器安裝 IronXL:
Install-Package IronXL.Excel
! 使用 C# 中的 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 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這段程式碼可以成功載入您的 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.comWorkBook.FromStream方法接受任何流類型,無論是MemoryStream 、 FileStream或網路流。 這種靈活性使您無需先將 Excel 檔案儲存到磁碟即可處理來自各種來源的檔案。此範例還示範如何將工作表資料轉換為 DataTable,DataTable 可以與資料庫和資料綁定場景無縫整合。
輸出
! C# 中使用 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 6 - 從 MemoryStream 輸出讀取 Excel 文件
何時使用物件傳送器讀取資料?
在事件驅動程式設計中使用此程式碼的情況下(例如,在 Windows Forms 或 ASP.NET 中處理檔案上傳按鈕),此方法簽章通常包含諸如object sender和EventArgs e之類的參數。 此上下文可確保 Excel 處理邏輯與 UI 或服務事件正確關聯。
如何在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這些轉換操作會在變更檔案格式的同時保留您的資料。 將 Excel 轉換為 CSV 時,IronXL 預設會將第一個工作表展平,但您可以指定要匯出的工作表。 將 CSV 檔案轉換為 Excel 檔案會產生格式正確的電子表格,該電子表格可以保留資料類型,並支援將來進行格式設定和新增公式。
結論
StreamReader無法處理 Excel 文件,其根本原因在於純文字與 Excel 複雜的文件結構之間存在根本差異。 雖然StreamReader可以完美地處理 CSV 和其他文字格式,但真正的 Excel 檔案需要像 IronXL 這樣能夠理解其中二進位和 XML 結構的專用程式庫。
IronXL 憑藉其直覺的 API、全面的格式支援和無縫的串流處理功能,提供了一個優雅的解決方案。 無論您是建立 Web 應用程式、桌面軟體或雲端服務,IronXL 都能在所有平台上可靠地處理 Excel 檔案。
! C# 中使用 StreamReader 讀取 Excel 檔案的替代方案 - IronXL:圖 8 - 許可
準備好開始正確使用Excel檔案了嗎? 下載 IronXL 的免費試用版,體驗在 C# 應用程式中輕鬆處理 Excel 資料。 對於生產部署,請考慮 最適合您專案需求的 IronXL 授權選項。
常見問題解答
為什麼我不能使用 StreamReader 在 C# 中讀取 Excel 檔案?
StreamReader 專為讀取文字檔案而設計,不支援 Excel 檔案的二進位格式,因此會產生亂碼或異常。
在 C# 中讀取 Excel 檔案的建議方式是什麼?
在 C# 中讀取 Excel 檔案的建議方法是使用 IronXL,它可以直接讀取和處理 Excel 檔案,而不需要 Excel Interop。
對 Excel 檔案使用 IronXL.Excel 較 StreamReader 有哪些優點?
IronXL.Excel 是專為處理 Excel 檔案格式而設計,可準確讀取和處理資料,並支援公式、圖表和格式化等各種功能。
使用 IronXL.Excel 是否需要 Excel Interop?
不,IronXL.Excel 可獨立於 Excel Interop 運作,讓您無需在機器上安裝 Excel 即可處理 Excel 檔案。
IronXL 是否能處理不同的 Excel 文件格式?
是的,IronXL 支援多種 Excel 檔案格式,包括 .xls、.xlsx 和 .csv,可靈活處理不同類型的 Excel 文件。
IronXL 適合用於大型 Excel 文件嗎?
是的,IronXL 經過性能優化,可以高效處理大型 Excel 文件,非常適合處理大量數據的應用程序。
IronXL 與其他用於 Excel 操作的 C# 函式庫比較如何?
IronXL 提供使用者友善的 API、對 Excel 功能的全面支援,而且不需要安裝 Excel,因此相較於其他函式庫,IronXL 是一個穩健的選擇。









