跳過到頁腳內容
使用 IRONXL

如何在 C# 中導入、讀取和操作 Excel 數據

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

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

如何在C#中導入、讀取和操作 Excel 數據:圖像 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 期望純文本並試圖將這些複雜結構解釋為字符,導致無意義的輸出。

示例輸入

如何在C#中導入、讀取和操作 Excel 數據:圖像 2 - Excel 輸入

輸出

如何在C#中導入、讀取和操作 Excel 數據:圖像 3 - 控制台輸出

現代 Excel 文件(XLSX)包含多個組件:工作表、樣式、共享字符串和關係,所有這些都是一起打包的。 這種複雜性需要了解 Excel 文件結構的專門庫,這就將我們帶到了 IronXL。

如何使用 IronXL 讀取 Excel 文件?

IronXL 提供了一種在 C# 中讀取 Excel 文件的簡單解決方案。 與 StreamReader 不同,IronXL 理解 Excel 的內部結構,並提供直觀的方法來訪問您的數據。 該庫支持 Windows、Linux、macOS 和 Docker 容器,非常適合現代跨平台應用。

如何在C#中導入、讀取和操作 Excel 數據:圖像 4 - 跨平台

首先,通過 NuGet 包管理器安裝 IronXL:

Install-Package IronXL.Excel

如何在C#中導入、讀取和操作 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#中導入、讀取和操作 Excel 數據:圖像 6 - 從 MemoryStream 輸出讀取 Excel

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

在此代碼用於事件驅動編程的情況下(例如,處理 Windows Forms 或 ASP.NET 中文件上傳按鈕),方法簽名通常包括像 object sender 和 EventArgs e 這樣的參數。 這個上下文確保 Excel 處理邏輯正確地與 UI 或服務事件聯繫在一起。

如何在C#中導入、讀取和操作 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#中導入、讀取和操作 Excel 數據:圖像 8 - 許可證

準備好正確地開始處理 Excel 文件了嗎? 下載 IronXL 的免費試用版,最適合您的項目需求。

常見問題解答

為什麼流讀取器無法在 C# 中直接處理 Excel 文件?

流讀取器是為文本文件設計的,不支持 Excel 文件的二進制格式,這就是為什麼在使用它讀取 Excel 文檔時可能會遇到亂碼或異常的原因。 相反,建議使用如 IronXL 這樣的庫來正確處理 Excel 文件。

C# 中匯入 Excel 數據的建議方法是什麼?

在 C# 中匯入 Excel 數據的建議方法是使用 IronXL。 它允許開發人員在不需要 Excel 通訊的情況下讀取和操作 Excel 文件,提供了一個更簡單和高效的解決方案。

我可以在不使用 Excel 通訊的情況下在 C# 中操作 Excel 文件嗎?

是的,您可以在不使用 Excel 通訊的情況下,通過使用 IronXL 在 C# 中操作 Excel 文件。 它提供了一種在您的 C# 應用程式中直接處理 Excel 文檔的無縫方式。

使用 IronXL 處理 Excel 文件的好處是什麼?

IronXL 提供了一些好處,包括讀寫 Excel 文件而不需要 Microsoft Excel、支持各種 Excel 格式和一個強大的 API,這些都簡化了數據操作任務。

IronXL 是否支持讀取具有複雜數據類型的 Excel 文件?

是的,IronXL 支持讀取具有複雜數據類型的 Excel 文件,允許您在 C# 應用程式中高效處理多樣化的數據結構。

IronXL 如何改善在 C# 中處理 Excel 文件的過程?

IronXL 通過提供易於使用的界面簡化了處理 Excel 文件的過程,消除了對 Excel 交互操作的需求,降低了代碼的複雜性並提高了性能。

是否可以使用 IronXL 讀寫不同格式的 Excel 文件?

是的,IronXL 支持多種 Excel 文件格式,如 XLSX、XLS、CSV 等,讓您輕鬆讀取和寫入各種格式的文件。

IronXL 能有效處理大型 Excel 文件嗎?

IronXL 專為高效處理大型 Excel 文件而設計,提供穩健的性能並在文件操作過程中將內存使用降至最低。

什麼讓 IronXL 成為 C# 開發人員處理 Excel 文件的合適選擇?

IronXL 成為 C# 開發人員的合適選擇,因為它提供了一組全面的功能,用於輕鬆讀取、寫入和操作 Excel 文件,而不需 Microsoft Excel 或複雜的通訊依賴。

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