跳至頁尾內容
USING IRONXL

如何在 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 工程師,這尤其重要,因為原生相依性會使容器化變得複雜。

IronXL for .NET 主頁面展示讀取 Excel 文件的 C# 範例程式碼,無需 Microsoft Office interop,附有庫功能和下載統計

為什麼 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
$vbLabelText   $csharpLabel

當您運行此程式碼片段時,預期會看到電子表格資料,而實際看到的是二進位資料,如 "PK♥♦" 或類似字元。 這是因為 XLSX 文件是包含多個 XML 文件的 ZIP 檔案,而 XLS 文件使用專有的二進位格式。 StreamReader 期望的是純文字,嘗試將這些複雜結構解讀為字元,導致無意義的輸出。 對於容器化的應用程式,嘗試使用原生 Excel 程式庫或 COM Interop 需要在容器中安裝 Microsoft Office,極大地增加了映像尺寸和複雜性。

StreamReader 嘗試處理 Excel 文件時會發生什麼?

以下範例展示一個典型的 Excel 文件,包含我們想要處理的產品資料。 注意當在 Excel 中查看時,結構化的電子表格資料顯得乾淨有序:

Excel 表格展示產品資料表,含有產品名稱(筆記型電腦、滑鼠、鍵盤、顯示器、耳機)、價格和 TRUE/FALSE 值的 A 到 D 列

為什麼輸出顯示亂碼?

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

Visual Studio 除錯控制台顯示程式成功執行,退出程式碼為 0,並提示按下任意鍵關閉窗戶

現代 Excel 文件(XLSX)包含多個組件:工作表、樣式、共享字串和關係,全部打包在一起。 這種複雜性需要專門的庫來理解Excel 文件結構,這將我們引向 IronXL。 此程式庫在內部處理所有這些複雜性,同時提供簡單的 API,使其非常適合自動化部署流水線,避免了手動干預。

如何使用 IronXL 讀取 Excel 文件?

IronXL 為以 C# 讀取 Excel 文件提供了一個簡單的解決方案。 與 StreamReader 不同,IronXL 了解 Excel 的內部結構,並提供直觀的方法來存取您的資料。 此程式庫支援Windows、Linux、macOS,及Docker 環境,使其成為現代跨平台應用程式的完美選擇。 對於 DevOps 團隊而言,IronXL 的零相依架構意味著無需管理本地庫或 COM 元件。

跨平台支援圖,展示 .NET 在各版本、操作系統、開發環境和雲端平台(包括 Windows、Linux、macOS、Docker、Azure 和 AWS)之間的相容性

首先,通過 NuGet Package Manager 安裝 IronXL:

Install-Package IronXL.Excel

終端輸出顯示 IronXL.Excel 包及其相依性在 Visual Studio 的 Package Manager Console 中成成功安裝

這是正確讀取 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
$vbLabelText   $csharpLabel

此程式碼成功載入您的 Excel 文件並提供對單元格值的乾淨存取。 WorkBook.Load 方法自動檢測文件格式(XLSXXLS,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
$vbLabelText   $csharpLabel

如何從記憶體流讀取 Excel?

實際應用通常需要從流而非磁碟文件處理 Excel 文件。 常見情況包括處理網頁上傳、從資料庫中檢索文件,或從AWS S3Azure 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
$vbLabelText   $csharpLabel

FromStream 方法接受任意流型別,無論是 FileStream 還是網路流。 這一靈活性使您可以從各種來源處理 Excel 文件,而無需先將其保存到磁碟中。本範例還展示了 將工作表資料轉換為 DataTable 的過程,與資料庫和資料繫結場景完美整合。 對於微服務架構,這種基於流的方法可將磁碟 I/O 減至最少並改善性能。

流處理會產出什麼結果?

Visual Studio 除錯控制台顯示從 Excel 資料中讀取的輸出,顯示 '此工作表有 5 行' 和 '讀入了 5 行資料'

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
$vbLabelText   $csharpLabel

Excel 操作庫 C# 的功能概述,包括六大類別:建立、保存和導出、編輯工作簿、資料操作、保護工作簿,以及每類類別下的詳細功能列表

如何在 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")
$vbLabelText   $csharpLabel

這些轉換在改變文件格式的同時保留您的資料。 當將 Excel 轉換為 CSV 時,IronXL 預設情況下展平第一個工作表,但您可以指定要導出的工作表。 從CSV 轉換為 Excel會建立一個格式正確的電子表格,保留資料型別並啟用未來的格式公式增添

對於自動化資料流水線,您也可以導出為 JSONXML 格式

// 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()
$vbLabelText   $csharpLabel

容器部署最佳實踐

對於 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 流水線整合。

IronXL licensing page showing four pricing tiers (Lite, Plus, Professional, and Unlimited) with a toggle between IronXL and Iron Suite options, displaying perpetual license prices ranging from $999 to $3,999

準備好開始正確使用 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依賴。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話