如何在 C# 中導入、讀取和操作 Excel 資料
StreamReader 無法讀取 Excel 文件,因為 XLSX/XLS 格式是複雜的二進位或壓縮 XML 結構,不是純文字。 請使用 IronXL 程式庫,它提供 WorkBook.Load() 進行檔案讀取,以及 FromStream() 用於在不需要 Excel Interop 相依性的情況下處理記憶體流。
許多 C# 開發者在嘗試讀取 Excel 表單文件時面臨一個常見挑戰:StreamReader,該工具對純文字文件非常適用,但對Excel 文件卻神秘地失敗。 如果您曾嘗試在 C# 中使用 StreamReader 讀取 Excel 文件但只看到亂碼或例外狀況,這不只是您一個人的困擾。 此教學解釋了為何 StreamReader 無法直接處理 Excel 文件,並示範了使用IronXL 無需 Excel Interop 的正確解決方案。
CSV 文件能被 Excel 開啟,且可以正常運作在 StreamReader 中,這常常讓人困惑。 然而,真正的 Excel 文件(XLSX, XLS)需要完全不同的方法。 理解這個區分將為您節省數小時的除錯時間,並引導您使用正確的工具。 對於在Docker 容器或Kubernetes 環境中部署應用程式的 DevOps 工程師,這尤其重要,因為原生相依性會使容器化變得複雜。

為什麼 StreamReader 無法讀取 Excel 文件?
StreamReader 是為純文字文件設計的,透過指定編碼逐行讀取字元資料。 Excel 文件儘管看似電子表格,實際上是複雜的二進位或 ZIP 壓縮 XML 結構,StreamReader 無法解讀。 現代 XLSX 文件遵循 Office Open XML 標準,而較舊的 XLS 文件則使用專有的二進位格式。
static void Main(string[] args)
{
// This code will NOT work - demonstrates the problem
using (StreamReader reader = new StreamReader("ProductData.xlsx"))
{
string content = reader.ReadLine(); // Attempts to read Excel as text
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(); // Attempts to read Excel as text
Console.WriteLine(content); // Outputs garbled binary data
}
}
Sub Main(ByVal args As String())
' This code will NOT work - demonstrates the problem
Using reader As New StreamReader("ProductData.xlsx")
Dim content As String = reader.ReadLine() ' Attempts to read Excel as text
Console.WriteLine(content) ' Outputs garbled binary data
End Using
End Sub
當您運行此程式碼片段時,預期會看到電子表格資料,而實際看到的是二進位資料,如 "PK♥♦" 或類似字元。 這是因為 XLSX 文件是包含多個 XML 文件的 ZIP 檔案,而 XLS 文件使用專有的二進位格式。 StreamReader 期望的是純文字,嘗試將這些複雜結構解讀為字元,導致無意義的輸出。 對於容器化的應用程式,嘗試使用原生 Excel 程式庫或 COM Interop 需要在容器中安裝 Microsoft Office,極大地增加了映像尺寸和複雜性。
StreamReader 嘗試處理 Excel 文件時會發生什麼?
以下範例展示一個典型的 Excel 文件,包含我們想要處理的產品資料。 注意當在 Excel 中查看時,結構化的電子表格資料顯得乾淨有序:

為什麼輸出顯示亂碼?
當 StreamReader 嘗試處理此 Excel 文件時,控制台輸出揭示了潛在的問題。 您看不到可讀資料,而是二進位內容,因為文件結構無法被解讀為文字:

現代 Excel 文件(XLSX)包含多個組件:工作表、樣式、共享字串和關係,全部打包在一起。 這種複雜性需要專門的庫來理解Excel 文件結構,這將我們引向 IronXL。 此程式庫在內部處理所有這些複雜性,同時提供簡單的 API,使其非常適合自動化部署流水線,避免了手動干預。
如何使用 IronXL 讀取 Excel 文件?
IronXL 為以 C# 讀取 Excel 文件提供了一個簡單的解決方案。 與 StreamReader 不同,IronXL 了解 Excel 的內部結構,並提供直觀的方法來存取您的資料。 此程式庫支援Windows、Linux、macOS,及Docker 環境,使其成為現代跨平台應用程式的完美選擇。 對於 DevOps 團隊而言,IronXL 的零相依架構意味著無需管理本地庫或 COM 元件。

首先,通過 NuGet Package Manager 安裝 IronXL:
Install-Package IronXL.Excel

這是正確讀取 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}");
}
Imports IronXL
' Load the Excel file
Dim workbook As WorkBook = WorkBook.Load("sample.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read specific cell values
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Read a range of cells
For Each cell In worksheet("A1:C5")
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
此程式碼成功載入您的 Excel 文件並提供對單元格值的乾淨存取。 WorkBook.Load 方法自動檢測文件格式(XLSX,XLS,XLSM,CSV),並在內部處理所有複雜的解析。 您可以使用像 "A1" 這樣熟悉的 Excel 標記存取單元格或 "A1:C5" 這樣的範圍,使程式碼對熟悉 Excel 的人而言直觀易懂。
對於容器化的部署,您可以輕鬆納入驗證 Excel 處理能力的健康檢查端點:
// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
try
{
// Test Excel functionality
using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
var sheet = workbook.CreateWorkSheet("HealthCheck");
sheet["A1"].Value = DateTime.UtcNow;
// Convert to byte array for validation
var bytes = workbook.ToByteArray();
return Ok(new {
status = "healthy",
excelSupport = true,
timestamp = DateTime.UtcNow
});
}
catch (Exception ex)
{
return StatusCode(503, new {
status = "unhealthy",
error = ex.Message
});
}
}
// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
try
{
// Test Excel functionality
using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
var sheet = workbook.CreateWorkSheet("HealthCheck");
sheet["A1"].Value = DateTime.UtcNow;
// Convert to byte array for validation
var bytes = workbook.ToByteArray();
return Ok(new {
status = "healthy",
excelSupport = true,
timestamp = DateTime.UtcNow
});
}
catch (Exception ex)
{
return StatusCode(503, new {
status = "unhealthy",
error = ex.Message
});
}
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
' Health check endpoint for containerized apps
Public Async Function HealthCheck() As Task(Of IActionResult)
Try
' Test Excel functionality
Using workbook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet = workbook.CreateWorkSheet("HealthCheck")
sheet("A1").Value = DateTime.UtcNow
' Convert to byte array for validation
Dim bytes = workbook.ToByteArray()
Return Ok(New With {
.status = "healthy",
.excelSupport = True,
.timestamp = DateTime.UtcNow
})
End Using
Catch ex As Exception
Return StatusCode(503, New With {
.status = "unhealthy",
.error = ex.Message
})
End Try
End Function
如何從記憶體流讀取 Excel?
實際應用通常需要從流而非磁碟文件處理 Excel 文件。 常見情況包括處理網頁上傳、從資料庫中檢索文件,或從AWS S3 或 Azure Blob Storage 等雲端儲存中處理資料。 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 DataTable
var dataTable = worksheet.ToDataTable(false);
// Display 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 DataTable
var dataTable = worksheet.ToDataTable(false);
// Display DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
Imports IronXL
Imports System.IO
' Read Excel from a memory stream
Dim fileBytes As Byte() = File.ReadAllBytes("ProductData.xlsx")
Using stream As New MemoryStream(fileBytes)
Dim workbook As WorkBook = WorkBook.FromStream(stream)
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Process the data
Dim rowCount As Integer = worksheet.RowCount
Console.WriteLine($"The worksheet has {rowCount} rows")
' Read all data into a DataTable
Dim dataTable = worksheet.ToDataTable(False)
' Display DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows")
End Using
FromStream 方法接受任意流型別,無論是 FileStream 還是網路流。 這一靈活性使您可以從各種來源處理 Excel 文件,而無需先將其保存到磁碟中。本範例還展示了 將工作表資料轉換為 DataTable 的過程,與資料庫和資料繫結場景完美整合。 對於微服務架構,這種基於流的方法可將磁碟 I/O 減至最少並改善性能。
流處理會產出什麼結果?

Excel 讀取場景下,什麼時候應該使用 object sender?
在此程式碼用於事件驅動程式設計中(例如在 Windows Forms 或 ASP.NET 中處理文件上傳按鈕),方法簽名通常包括如 object sender 和 EventArgs e 的參數。 這一上下文確保 Excel 處理邏輯正確整合到 UI 或服務事件中。 對於容器化的 API,您可能要直接從 HTTP 請求中處理上傳:
[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file uploaded");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Position = 0;
var workbook = WorkBook.FromStream(stream);
var worksheet = workbook.DefaultWorkSheet;
// Process and return results
var data = worksheet.ToDataSet();
return Ok(new {
sheets = workbook.WorkSheets.Count,
rows = worksheet.RowCount,
processed = DateTime.UtcNow
});
}
[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file uploaded");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Position = 0;
var workbook = WorkBook.FromStream(stream);
var worksheet = workbook.DefaultWorkSheet;
// Process and return results
var data = worksheet.ToDataSet();
return Ok(new {
sheets = workbook.WorkSheets.Count,
rows = worksheet.RowCount,
processed = DateTime.UtcNow
});
}
Imports System.IO
Imports Microsoft.AspNetCore.Mvc
<HttpPost("upload")>
Public Async Function ProcessExcelUpload(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file uploaded")
End If
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
stream.Position = 0
Dim workbook = WorkBook.FromStream(stream)
Dim worksheet = workbook.DefaultWorkSheet
' Process and return results
Dim data = worksheet.ToDataSet()
Return Ok(New With {
.sheets = workbook.WorkSheets.Count,
.rows = worksheet.RowCount,
.processed = DateTime.UtcNow
})
End Using
End Function

如何在 Excel 和 CSV 之間轉換?
儘管 StreamReader 可以處理 CSV 文件,但您通常需要在 Excel 和 CSV 格式之間轉換。 IronXL 使這種轉換變得簡單,這對於 ETL 流水線和資料整合場景(在 DevOps 工作流程中常見)特別有用。
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");
Imports IronXL
' Load an Excel file and save as CSV
Dim workbook As WorkBook = WorkBook.Load("data.xlsx")
workbook.SaveAsCsv("output.csv")
' Load a CSV file and save as Excel
Dim csvWorkbook As WorkBook = WorkBook.LoadCSV("input.csv")
csvWorkbook.SaveAs("output.xlsx")
' Export specific worksheet to CSV
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
worksheet.SaveAsCsv("worksheet1.csv")
這些轉換在改變文件格式的同時保留您的資料。 當將 Excel 轉換為 CSV 時,IronXL 預設情況下展平第一個工作表,但您可以指定要導出的工作表。 從CSV 轉換為 Excel會建立一個格式正確的電子表格,保留資料型別並啟用未來的格式和公式增添。
對於自動化資料流水線,您也可以導出為 JSON 或 XML 格式。
// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");
// Export to JSON for API responses
string jsonData = workbook.ToJson();
// Export to HTML for web display
workbook.SaveAsHtml("report.html");
// Export to XML for integration systems
workbook.SaveAsXml("report.xml");
// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");
// Export to JSON for API responses
string jsonData = workbook.ToJson();
// Export to HTML for web display
workbook.SaveAsHtml("report.html");
// Export to XML for integration systems
workbook.SaveAsXml("report.xml");
// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
' Export Excel to multiple formats for data pipelines
Dim workbook = WorkBook.Load("report.xlsx")
' Export to JSON for API responses
Dim jsonData As String = workbook.ToJson()
' Export to HTML for web display
workbook.SaveAsHtml("report.html")
' Export to XML for integration systems
workbook.SaveAsXml("report.xml")
' Export specific range to DataTable for database insertion
Dim dataTable = workbook.DefaultWorkSheet("A1:D10").ToDataTable()
容器部署最佳實踐
對於 DevOps 工程師在部署 Excel 處理應用時,IronXL 提供多項優勢。 以下是一個適合生產環境的 Dockerfile,優化了 Excel 處理:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# Install any required system fonts for Excel rendering
RUN apt-get update && apt-get install -y \
fontconfig \
libfreetype6 \
&& rm -rf /var/lib/apt/lists/*
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# Set environment variables for IronXL
ENV IRONXL_LICENSE_KEY=${IRONXL_LICENSE_KEY}
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
ENTRYPOINT ["dotnet", "YourApp.dll"]
此 Dockerfile 確保您的 Excel 處理應用程式在容器中順利運行,並盡可能減少相依性。 授權通過環境變數進行管理,便於在不同部署環境中進行管理。
Excel 處理在 C# 中的下一步是什麼?
StreamReader 無法處理 Excel 文件的原因在於純文字與 Excel 的複雜文件結構間的根本區別。 雖然 StreamReader 對於 CSV 和其他文字格式非常實用,但真實的 Excel 文件需要如 IronXL 這樣專門理解內部二進位和 XML 結構的庫。
IronXL 提供綜合方案,具有其直觀的 API、廣泛的格式支持和無縫的流處理能力。 無論您是在構建Web 應用、桌面軟體還是雲服務,IronXL 在所有平台上可靠處理 Excel 文件。 適用於條件格式化、圖表、公式和進階 Excel 功能,這使其成為企業應用的完整解決方案。
對 DevOps 團隊而言,IronXL 的容器友好架構、最小系統相依性和穩定的性能特徵使其成為現代雲原生應用程式的理想選擇。 該庫支持水平擴展,在Kubernetes pods中無縫運作,並能良好地與 CI/CD 流水線整合。

準備好開始正確使用 Excel 文件了嗎? 下載 IronXL 的免費試用版,以符合您專案的需求。 此程式庫提供靈活的授權選項,包括開發、測試和生產部署,亦可用於容器化環境和雲原生應用程式。
常見問題
為什麼StreamReader在C#中無法直接處理Excel文件?
StreamReader是為文字文件設計的,不支持Excel文件的二進位格式,這就是為什麼您在使用它讀取Excel文件時會遇到字元混亂或異常。相反,建議使用IronXL等程式庫來正確處理Excel文件。
在C#中匯入Excel資料的推薦方法是什麼?
在C#中匯入Excel資料的推薦方法是使用IronXL。它允許開發者在不需要Excel Interop的情況下讀取和操作Excel文件,提供一個更簡單和高效的解決方案。
我可以在C#中操作Excel文件而不使用Excel Interop嗎?
可以,您可以在不使用Excel Interop的情況下使用IronXL在C#中操作Excel文件。它提供了一種在您的C#應用程式中直接處理Excel文件的無縫方式。
使用IronXL進行Excel文件處理有什麼好處?
IronXL提供了幾個好處,包括無需Microsoft Excel即可讀寫Excel文件、支持多種Excel格式,以及一個強大且簡化資料操作任務的API。
IronXL是否支持具有複雜資料型別的Excel文件的讀取?
是的,IronXL支持讀取具有複雜資料型別的Excel 文件,允許您在C#應用程式中有效處理多樣化資料結構。
IronXL如何改進在C#中Excel文件的處理過程?
IronXL通過提供一個易於使用的介面,消除對Excel Interop的需求,降低程式碼複雜性並提高性能來簡化Excel文件的處理過程。
使用IronXL是否可以讀寫不同格式的Excel文件?
是的,IronXL支持多種Excel文件格式,如XLSX、XLS、CSV等,使得讀寫各種格式的文件變得輕鬆自在。
IronXL能否有效處理大型Excel文件?
IronXL設計以高效處理大體量的Excel文件,提供了強大的性能並在文件操作過程中最小化記憶體使用。
IronXL為什麼對於處理Excel文件的C#開發者是一個合適的選擇?
IronXL對C#開發者來說是一個合適的選擇,因為它提供了一整套強大的功能,用於輕鬆讀取、寫入和操作Excel文件,而不需要Microsoft Excel或複雜的interop依賴。




