跳至頁尾內容
使用 IRONXL

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

StreamReader無法讀取 Excel 文件,因為 XLSX/XLS 格式是複雜的二進位或壓縮 XML 結構,而不是純文字。 請改用IronXL 函式庫,該函式庫提供WorkBook.Load()用於檔案讀取,以及WorkBook () 用於記憶體流處理FromStream不依賴 Excel Interop。

許多 C# 開發人員在嘗試讀取 Excel 表格文件時都會遇到一個常見的挑戰:他們信賴的StreamReader可以完美地處理文字文件,但卻無法處理Excel 文檔,這令人費解。 如果你嘗試使用 C# 中的StreamReader讀取 Excel 文件,卻只看到亂碼或異常,那麼你並不孤單。 本教學解釋了為什麼StreamReader不能直接處理 Excel 文件,並示範了在不使用 Excel Interop 的情況下使用 IronXL 的正確解決方案。

這種混淆通常是因為 Excel 可以開啟的CSV 檔案也能用StreamReader開啟。 然而,真正的 Excel 檔案(XLSX、XLS)需要採用完全不同的方法。 理解這一區別將為您節省數小時的調試時間,並引導您找到完成這項工作的正確工具。 對於在Docker 容器Kubernetes 環境中部署應用程式的DevOps工程師來說,這一點尤其重要,因為原生依賴項可能會使容器化變得複雜。

IronXL for .NET 主頁展示了無需 Microsoft Office 互通即可讀取 Excel 檔案的 C# 程式碼範例,並介紹了程式庫功能和下載統計資料。

為什麼StreamReader無法讀取 Excel 檔?

StreamReader專為純文字檔案設計,使用指定的編碼逐行讀取字元資料。 Excel 檔案雖然看起來像電子表格,但實際上是StreamReader無法解釋的複雜二進位或 ZIP 壓縮 XML 結構。 現代的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
 }
}
$vbLabelText   $csharpLabel

執行此程式碼片段時,您將看到的不是電子表格數據,而是二進位數據,例如"PK♥♦"或類似字元。 這是因為 XLSX 檔案是包含多個 XML 檔案的 ZIP 壓縮文件,而 XLS 檔案使用專有的二進位格式。 StreamReader期望的是純文本,並嘗試將這些複雜的結構解釋為字符,從而導致輸出毫無意義。 對於容器化應用程序,嘗試使用原生 Excel 庫或 COM 互通將需要在容器中安裝 Microsoft Office,這將大大增加鏡像大小和複雜性。

StreamReader嘗試處理 Excel 檔案時會發生什麼事?

下面的範例展示了一個典型的 Excel 文件,其中包含我們要處理的產品資料。 請注意,在 Excel 中查看時,結構化的電子表格資料看起來多麼清晰有序:

! Excel 表格顯示了一個產品資料表,其中 A 列到 D 列分別代表產品名稱(筆記型電腦、滑鼠、鍵盤、顯示器、耳機)、價格以及 TRUE/FALSE 值。

為什麼輸出結果顯示亂碼?

StreamReader嘗試處理此 Excel 檔案時,控制台輸出揭示了根本問題。 由於文件結構無法被解釋為文本,因此您看到的不是可讀數據,而是二進位內容:

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

現代 Excel 檔案 (XLSX) 包含多個元件:工作表、樣式、共用字串和關係,所有這些都打包在一起。 這種複雜性需要能夠理解Excel 檔案結構的專用函式庫,這就引出了 IronXL。 該程式庫在內部處理了所有這些複雜性,同時提供了一個簡單的 API,使其成為無法進行人工幹預的自動化部署管道的理想選擇。

如何使用 IronXL 讀取 Excel 檔案?

IronXL為使用 C# 讀取 Excel 檔案提供了一個簡單的解決方案。 與StreamReader不同,IronXL 了解 Excel 的內部結構,並提供直覺的方法來存取您的資料。 該程式庫支援Windows、Linux、macOSDocker 容器,使其成為現代跨平台應用程式的理想選擇。 對於DevOps團隊而言,IronXL 的零依賴架構意味著在部署期間無需管理任何本機程式庫或 COM 元件。

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

首先,透過 NuGet 套件管理器安裝 IronXL:

Install-Package IronXL.Excel

終端機輸出顯示已透過 Visual Studio 中的套件管理器控制台成功安裝 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}");
}
$vbLabelText   $csharpLabel

這段程式碼可以成功載入您的 Excel 文件,並提供對儲存格值的清晰存取。 WorkBook.Load 方法會自動偵測檔案格式( XLSXXLS 、XLSM、 CSV ),並在內部處理所有複雜的解析。 您可以使用熟悉的 Excel 表示法(例如"A1")或範圍(例如"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 
        });
    }
}
$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");
}
$vbLabelText   $csharpLabel

WorkBook方法接受任何流類型, MemoryStream FromStream FileStream或網路流。 這種靈活性使您無需先將 Excel 檔案儲存到磁碟即可處理來自各種來源的檔案。此範例還示範如何將工作表資料轉換為 DataTable ,DataTable 可以與資料庫和資料綁定場景無縫整合。 對於微服務架構而言,這種基於流的方法可以最大限度地減少磁碟 I/O 並提高效能。

記憶體流處理會產生哪些結果?

Visual Studio 偵錯控制台顯示讀取 Excel 資料時的輸出,顯示"工作表有 5 行"和"已載入 5 行資料"。

在Excel讀取場景中,何時應該使用物件傳送器?

在事件驅動程式設計中使用此程式碼的情況下(例如,在 Windows Forms 或ASP.NET中處理檔案上傳按鈕),方法簽章通常包含諸如 object sender 和EventArgs之類的參數。 此上下文可確保 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
    });
}
$vbLabelText   $csharpLabel

本概述介紹了一個用於 C# 的 Excel 操作庫,主要包含六大類功能:建立、儲存和匯出、編輯工作簿、處理資料、保護工作簿,以及每類功能下的詳細清單。

如何在Excel和CSV之間進行轉換?

雖然StreamReader可以處理 CSV 文件,但您經常需要在 Excel 和 CSV 格式之間進行轉換。 IronXL 讓這種轉換變得非常簡單,這對於DevOps工作流程中常見的 ETL 管道和資料整合場景尤其有用:

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

容器部署最佳實踐

對於部署 Excel 處理應用程式的DevOps工程師來說,IronXL 具有以下幾個優勢。 以下是一個針對 Excel 處理最佳化的生產就緒型 Dockerfile:

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 處理應用程式在容器中流暢地執行,並最大限度地減少依賴項。 許可證透過環境變數進行管理,因此可以輕鬆地在不同的部署環境中進行管理。

C#中Excel處理的下一步是什麼?

StreamReader無法處理 Excel 文件,其根本原因在於純文字與 Excel 複雜的文件結構之間存在根本差異。 雖然StreamReader可以完美地處理 CSV 和其他文字格式,但真正的 Excel 檔案需要像 IronXL 這樣能夠理解其中二進位和 XML 結構的專用程式庫。

IronXL 提供全面的解決方案,其直覺的 API、廣泛的格式支援和無縫的串流處理功能。 無論您是建立Web 應用程式、桌面軟體或雲端服務,IronXL 都能在所有平台上可靠地處理 Excel 檔案。 該程式庫支援條件格式圖表公式進階 Excel 功能,使其成為企業應用程式的完整解決方案。

對於DevOps團隊而言,IronXL 的容器友善架構、最小的系統依賴性和可靠的效能特性使其成為現代雲端原生應用程式的理想選擇。 該庫支援水平擴展,可在Kubernetes pod中無縫運行,並能很好地與 CI/CD 管道整合。

IronXL 授權頁面顯示四個定價等級(Lite、Plus、Professional 和 Unlimited),並提供 IronXL 和 Iron Suite 選項之間的切換,永久授權價格從 749 美元到 3,999 美元不等

準備好開始正確使用Excel檔案了嗎? 下載最符合您專案需求的 IronXL 免費試用版。 該程式庫提供靈活的授權選項,包括開發、測試和生產部署,以及容器化環境和雲端原生應用程式的選項。

常見問題解答

為什麼 StreamReader 不能在 C# 中直接處理 Excel 檔案?

StreamReader 專為文字檔案設計,不支援 Excel 檔案的二進位格式,因此在使用它讀取 Excel 文件時可能會遇到亂碼或異常。建議使用 IronXL 等函式庫來正確處理 Excel 檔案。

在 C# 中匯入 Excel 資料的建議方法是什麼?

在 C# 中匯入 Excel 資料的建議方法是使用 IronXL。它允許開發人員無需 Excel Interop 即可讀取和操作 Excel 文件,從而提供了一種更直接、更有效率的解決方案。

我能否在不使用 Excel Interop 的情況下,用 C# 操作 Excel 檔案?

是的,您可以使用 IronXL 在 C# 中直接操作 Excel 文件,而無需使用 Excel Interop。它提供了一種無縫的方式,讓您可以直接在 C# 應用程式中處理 Excel 文件。

使用 IronXL 處理 Excel 檔案有哪些好處?

IronXL 提供了許多優勢,包括無需 Microsoft Excel 即可讀取和寫入 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 文件,提供強大的性能,並在文件操作期間最大限度地減少記憶體使用。

對於使用 Excel 檔案的 C# 開發人員來說,IronXL 有哪些優勢使其成為合適的選擇?

IronXL 是 C# 開發人員的理想選擇,因為它提供了一套全面的功能,可以輕鬆讀取、寫入和操作 Excel 文件,而無需 Microsoft Excel 或複雜的互通依賴項。

喬迪·巴迪亞
軟體工程師
喬迪精通Python、C#和C++,除了在Iron Software運用這些技能外,他還從事遊戲程式設計。他參與產品測試、產品開發和研究等工作,為產品的持續改進做出了巨大貢獻。豐富的經驗讓他始終保持挑戰性和工作熱情,他表示這是他最喜歡在Iron Software工作的原因之一。喬迪在佛羅裡達州邁阿密長大,畢業於佛羅裡達大學,主修電腦科學和統計學。