跳至頁尾內容
使用 IRONXL

如何在 C# 中使用 `StreamReader` 讀取 Excel 文件

StreamReader無法讀取 Excel 文件,因為它是為純文字而設計,而 Excel 檔案是複雜的二進位或 ZIP 壓縮的 XML 結構。 請改用 IronXL 庫,它提供WorkBook () 來正確讀取 Excel 文件,而無需依賴 Excel Interop。

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

這種混淆通常是因為 Excel 可以開啟的CSV 檔案也能用StreamReader開啟。 然而,真正的Excel 檔案(XLSX、XLS)需要採用完全不同的方法。 理解這一區別將為您節省數小時的調試時間,並引導您找到完成這項工作的正確工具。 對於容器環境而言,選擇合適的程式庫對於簡化部署和避免複雜的依賴關係至關重要。

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

為什麼StreamReader無法讀取 Excel 檔?

StreamReader專為純文字檔案設計,使用指定的編碼逐行讀取字元資料。 Excel 檔案雖然看起來像電子表格,但實際上是StreamReader無法解釋的複雜二進位或 ZIP 壓縮 XML 結構。 這種根本性的差異使得StreamReader不適合在生產環境中處理Excel 工作簿

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // This code will NOT work - demonstrates the problem
        try
        {
            using (StreamReader reader = new StreamReader("ProductData.xlsx"))
            {
                string content = reader.ReadLine(); // read data
                Console.WriteLine(content); // Outputs garbled binary data
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // This code will NOT work - demonstrates the problem
        try
        {
            using (StreamReader reader = new StreamReader("ProductData.xlsx"))
            {
                string content = reader.ReadLine(); // read data
                Console.WriteLine(content); // Outputs garbled binary data
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

執行此程式碼片段時,您將不會看到電子表格數據,而是會看到"PK♥♦"或類似符號之類的二進位字元。 這是因為XLSX 檔案是包含多個 XML 檔案的 ZIP 壓縮文件,而 XLS 檔案使用專有的二進位格式。 StreamReader期望的是純文本,並嘗試將這些複雜的結構解釋為字符,從而導致輸出毫無意義。 對於容器化應用程序,這種二進位資料也可能導致編碼問題和意外崩潰。

StreamReader嘗試讀取 Excel 檔案時會發生什麼事?

現代Excel工作簿的內部結構由多個組件組合而成。 當StreamReader遇到這些文件時,它無法解析工作簿元資料或瀏覽文件結構。 相反,它會嘗試將原始位元組讀取為文本,從而導致資料損壞和遺失。 這在自動化部署管道中尤其成問題,因為文件處理的可靠性至關重要。

! Excel 電子表格顯示 ProductData,其中列包括產品名稱(筆記型電腦、滑鼠、鍵盤、顯示器、耳機)、價格,以及 D 列中的 TRUE/FALSE 值。

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

出現亂碼輸出的原因是 Excel 檔案包含二進位標頭、壓縮演算法和 XML 命名空間,而StreamReader會將這些內容解釋為文字字元。 這些複雜的文件結構包含格式資訊、公式儲存格引用,但這些內容沒有有意義的文字表示。 DevOps團隊在嘗試在Linux 容器中處理 Excel 檔案時經常會遇到這個問題,因為編碼差異可能會加劇這個問題。

嘗試使用 StreamReader 讀取 Excel 檔案時,Visual Studio 偵錯控制台視窗顯示文字輸出損壞,並顯示退出程式碼 0。

現代Excel 檔案 (XLSX)包含多個元件:工作表樣式共用字串和關係,所有這些都打包在一起。 這種複雜性需要能夠理解Excel 檔案結構的專用函式庫,這就引出了 IronXL。 Kubernetes 等容器編排平台受益於能夠處理這些複雜性而無需外部相依性的函式庫。

如何使用 IronXL 讀取 Excel 檔案?

IronXL為使用 C# 讀取 Excel 檔案提供了一個簡單的解決方案。 與StreamReader不同,IronXL 了解 Excel 的內部結構,並提供直覺的方法來存取您的資料。 該程式庫支援WindowsLinuxmacOSDocker 容器,使其成為現代跨平台應用程式的理想選擇。 其輕量級特性和極少的依賴性使其非常適合容器化部署

! 跨平台支援圖,展示了 .NET 在 Windows、Linux、macOS、Docker、Azure 和 AWS 環境中的相容性

如何在我的容器環境中安裝 IronXL?

首先,透過 NuGet 套件管理器安裝 IronXL。 該庫採用容器友善設計,確保與 Docker 和 Kubernetes 環境無縫整合。 無需額外的系統相依性或本機程式庫,簡化了部署流程

Install-Package IronXL.Excel

對於Docker 部署,您也可以直接在 Dockerfile 中包含 IronXL:

# Add to your Dockerfile
RUN dotnet add package IronXL.Excel --version 2024.12.5

終端輸出顯示 IronXL.Excel NuGet 套件版本 2024.12.5 及其所有相依性已成功安裝

讀取Excel資料的基本程式碼模式是什麼?

以下是如何在生產環境中正確讀取 Excel 檔案並進行全面錯誤處理的方法:

using IronXL;
using System;
using System.Linq;

class ExcelReader
{
    public static void ReadExcelData(string filePath)
    {
        try
        {
            // Load the Excel file
            WorkBook workbook = WorkBook.Load(filePath);
            WorkSheet worksheet = workbook.DefaultWorkSheet;

            // Read specific cell values with null checking
            var cellA1 = worksheet["A1"];
            if (cellA1 != null)
            {
                string cellValue = cellA1.StringValue;
                Console.WriteLine($"Cell A1 contains: {cellValue}");
            }

            // Read a range of cells with LINQ
            var range = worksheet["A1:C5"];
            var nonEmptyCells = range.Where(cell => !cell.IsEmpty);

            foreach (var cell in nonEmptyCells)
            {
                Console.WriteLine($"{cell.AddressString}: {cell.Text}");
            }

            // Get row and column counts for validation
            int rowCount = worksheet.RowCount;
            int columnCount = worksheet.ColumnCount;
            Console.WriteLine($"Worksheet dimensions: {rowCount} rows × {columnCount} columns");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error reading Excel file: {ex.Message}");
            // Log to your monitoring system
        }
    }
}
using IronXL;
using System;
using System.Linq;

class ExcelReader
{
    public static void ReadExcelData(string filePath)
    {
        try
        {
            // Load the Excel file
            WorkBook workbook = WorkBook.Load(filePath);
            WorkSheet worksheet = workbook.DefaultWorkSheet;

            // Read specific cell values with null checking
            var cellA1 = worksheet["A1"];
            if (cellA1 != null)
            {
                string cellValue = cellA1.StringValue;
                Console.WriteLine($"Cell A1 contains: {cellValue}");
            }

            // Read a range of cells with LINQ
            var range = worksheet["A1:C5"];
            var nonEmptyCells = range.Where(cell => !cell.IsEmpty);

            foreach (var cell in nonEmptyCells)
            {
                Console.WriteLine($"{cell.AddressString}: {cell.Text}");
            }

            // Get row and column counts for validation
            int rowCount = worksheet.RowCount;
            int columnCount = worksheet.ColumnCount;
            Console.WriteLine($"Worksheet dimensions: {rowCount} rows × {columnCount} columns");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error reading Excel file: {ex.Message}");
            // Log to your monitoring system
        }
    }
}
$vbLabelText   $csharpLabel

這段程式碼可以成功載入您的 Excel 文件,並提供對儲存格值的清晰存取。 WorkBook.Load 方法會自動偵測檔案格式( XLSXXLSXLSMCSV ),並在內部處理所有複雜的解析。 您可以使用熟悉的 Excel 表示法(例如"A1")或範圍(例如"A1:C5")來存取儲存格,這使得熟悉 Excel 的人能夠直觀地理解程式碼。 錯誤處理機制可確保容器不會因檔案格式錯誤而崩潰。

IronXL 支援哪些容器化部署的檔案格式?

IronXL支援所有主流 Excel 格式,無需 Microsoft Office 或 Interop 組件,使其成為容器化環境的理想選擇。 支援的格式包括:

如何從記憶體流中讀取Excel?

實際應用中經常需要處理來自資料流而不是磁碟檔案的 Excel 檔案。 常見場景包括處理網路上傳、從資料庫檢索檔案或處理來自雲端儲存的資料。 IronXL 透過內建的串流媒體支援優雅地處理了這些情況:

using IronXL;
using System.IO;
using System.Data;
using System.Threading.Tasks;

public class StreamProcessor
{
    // Async method for container health checks
    public async Task<bool> ProcessExcelStreamAsync(byte[] fileBytes)
    {
        try
        {
            using (MemoryStream stream = new MemoryStream(fileBytes))
            {
                // Load from stream asynchronously
                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 for database operations
                var dataTable = worksheet.ToDataTable(true); // true = use first row as headers

                // Validate data integrity
                if (dataTable.Rows.Count == 0)
                {
                    Console.WriteLine("Warning: No data rows found");
                    return false;
                }

                Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
                Console.WriteLine($"Columns: {string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName))}");

                // Example: Process data for container metrics
                foreach (DataRow row in dataTable.Rows)
                {
                    // Your processing logic here
                    await ProcessRowAsync(row);
                }

                return true;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Stream processing error: {ex.Message}");
            return false;
        }
    }

    private async Task ProcessRowAsync(DataRow row)
    {
        // Simulate async processing
        await Task.Delay(10);
    }
}
using IronXL;
using System.IO;
using System.Data;
using System.Threading.Tasks;

public class StreamProcessor
{
    // Async method for container health checks
    public async Task<bool> ProcessExcelStreamAsync(byte[] fileBytes)
    {
        try
        {
            using (MemoryStream stream = new MemoryStream(fileBytes))
            {
                // Load from stream asynchronously
                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 for database operations
                var dataTable = worksheet.ToDataTable(true); // true = use first row as headers

                // Validate data integrity
                if (dataTable.Rows.Count == 0)
                {
                    Console.WriteLine("Warning: No data rows found");
                    return false;
                }

                Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
                Console.WriteLine($"Columns: {string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName))}");

                // Example: Process data for container metrics
                foreach (DataRow row in dataTable.Rows)
                {
                    // Your processing logic here
                    await ProcessRowAsync(row);
                }

                return true;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Stream processing error: {ex.Message}");
            return false;
        }
    }

    private async Task ProcessRowAsync(DataRow row)
    {
        // Simulate async processing
        await Task.Delay(10);
    }
}
$vbLabelText   $csharpLabel

WorkBook.FromStream 方法接受任何流類型,無論是MemoryStreamFileStream或網路流。 這種靈活性使您無需先將 Excel 檔案儲存到磁碟即可處理來自各種來源的檔案。此範例還示範如何將工作表資料轉換為 DataTable ,DataTable 可以與資料庫和資料綁定場景無縫整合。 所示的非同步模式非常適合容器健康檢查和就緒探測。

Excel 處理支援哪些類型的資料流?

IronXL 支援所有 .NET 串流類型,使其能夠靈活應用於各種部署場景

MemoryStream :無需磁碟 I/O 的記憶體處理

Visual Studio 偵錯輸出顯示已成功讀取 Excel 文件,並從工作表中載入了 5 行資料

在容器化應用程式中,何時應該使用串流處理?

流處理在以下方面尤其有價值:

微服務:無需持久性儲存即可處理文件 -無伺服器函數AWS LambdaAzure Functions

  • API 端點:直接檔案上傳處理 -訊息佇列:處理來自佇列的 Excel 附件

IronXL 的功能概述,包含六個主要類別:建立、儲存和匯出工作簿,編輯工作簿,處理數據,保護工作簿,以及各種 Excel 操作功能。

流處理如何影響容器資源使用?

IronXL 的串流處理功能針對容器環境進行了最佳化,記憶體開銷極小。 該庫採用高效的記憶體管理技術,可防止記憶體洩漏並降低垃圾回收壓力。 對於大型 Excel 文件,IronXL 提供了透過配置設定來控制記憶體使用的選項,使其適用於資源受限的容器。

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

雖然StreamReader可以處理CSV 文件,但您經常需要在 Excel 和 CSV 格式之間進行轉換。 IronXL 內建了針對生產環境最佳化的方法,使這種轉換變得非常簡單:

using IronXL;
using System;
using System.IO;

public class FormatConverter
{
    public static void ConvertExcelFormats()
    {
        try
        {
            // Load an Excel file and save as CSV with options
            WorkBook workbook = WorkBook.Load("data.xlsx");

            // Save with UTF-8 encoding for international character support
            workbook.SaveAsCsv("output.csv", ";"); // Use semicolon as delimiter

            // Load a CSV file with custom settings
            WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv", ",", "UTF-8");
            csvWorkbook.SaveAs("output.xlsx", FileFormat.XLSX);

            // Export specific worksheet to CSV
            if (workbook.WorkSheets.Count > 0)
            {
                WorkSheet worksheet = workbook.WorkSheets[0];
                worksheet.SaveAsCsv("worksheet1.csv");

                // Advanced: Export only specific range
                var dataRange = worksheet["A1:D100"];
                // Process range data before export
                foreach (var cell in dataRange)
                {
                    if (cell.IsNumeric)
                    {
                        // Apply formatting for CSV output
                        cell.FormatString = "0.00";
                    }
                }
            }

            Console.WriteLine("Conversion completed successfully");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Conversion error: {ex.Message}");
            throw; // Re-throw for container orchestrator handling
        }
    }
}
using IronXL;
using System;
using System.IO;

public class FormatConverter
{
    public static void ConvertExcelFormats()
    {
        try
        {
            // Load an Excel file and save as CSV with options
            WorkBook workbook = WorkBook.Load("data.xlsx");

            // Save with UTF-8 encoding for international character support
            workbook.SaveAsCsv("output.csv", ";"); // Use semicolon as delimiter

            // Load a CSV file with custom settings
            WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv", ",", "UTF-8");
            csvWorkbook.SaveAs("output.xlsx", FileFormat.XLSX);

            // Export specific worksheet to CSV
            if (workbook.WorkSheets.Count > 0)
            {
                WorkSheet worksheet = workbook.WorkSheets[0];
                worksheet.SaveAsCsv("worksheet1.csv");

                // Advanced: Export only specific range
                var dataRange = worksheet["A1:D100"];
                // Process range data before export
                foreach (var cell in dataRange)
                {
                    if (cell.IsNumeric)
                    {
                        // Apply formatting for CSV output
                        cell.FormatString = "0.00";
                    }
                }
            }

            Console.WriteLine("Conversion completed successfully");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Conversion error: {ex.Message}");
            throw; // Re-throw for container orchestrator handling
        }
    }
}
$vbLabelText   $csharpLabel

這些轉換操作會在變更檔案格式的同時保留您的資料。 將Excel 轉換為 CSV時,IronXL 預設會將第一個工作表展平,但您可以指定要匯出的工作表。 將CSV 檔案轉換為 Excel 檔案會產生格式正確的電子表格,該電子表格可以保留資料類型,並支援將來進行格式設定和新增公式

為什麼DevOps團隊需要將 Excel 檔案轉換為 CSV 檔案?

DevOps團隊經常需要將 Excel 文件轉換為 CSV 文件,用於:

-資料管道整合:許多 ETL 工具更傾向於CSV 格式 -版本控制:CSV 檔案基於文本,便於差異比較。 -資料庫匯入:將資料批次載入到SQL 資料庫中 -日誌分析:將Excel 報表轉換為可解析格式 -配置管理:使用 Excel 管理配置數據

格式轉換對效能有何影響?

IronXL 的格式轉換功能針對容器化環境進行了最佳化,具體如下:

-串流轉換:無需將大檔案完全載入到記憶體即可進行處理 -平行處理:利用多核心處理器加快轉換速度 -最小化磁碟 I/O :記憶體處理降低了儲存需求 -資源限制Kubernetes 部署的可設定記憶體上限

這些優化措施可確保您的容器即使在處理大型 Excel 檔案時也能保持穩定的效能。 此庫高效的記憶體管理機制可防止資源受限環境下出現記憶體溢位錯誤。

結論

StreamReader無法處理 Excel 文件,其根本原因在於純文字與 Excel 複雜的文件結構之間存在根本差異。 雖然StreamReader可以完美地處理 CSV 和其他文字格式,但真正的 Excel 檔案需要像IronXL這樣能夠理解其中二進位和 XML 結構的專用程式庫。 對於管理容器化應用程式DevOps團隊來說,選擇合適的程式庫對於維護可靠的部署管道至關重要。

IronXL 憑藉其直覺的 API、全面的格式支援和無縫的串流處理功能,提供了一個優雅的解決方案。 無論您是建立Web 應用程式、桌面軟體或雲端服務,IronXL 都能在所有平台上可靠地處理 Excel 檔案。 它採用容器友善設計,依賴項極少,性能卓越,是現代DevOps工作流程的理想選擇。

IronXL 許可頁面顯示了 Lite(749 美元)、Plus(999 美元)、Professional(1,999 美元)和 Unlimited(3,999 美元)永久許可選項

準備好開始正確使用Excel檔案了嗎? 下載 IronXL 的免費試用版,探索其在您環境中的功能。 該庫包含全面的文件程式碼範例部署指南,專門針對容器化環境而設計。

常見問題解答

為什麼 StreamReader 無法在 C# 中讀取 Excel 檔案?

StreamReader 旨在讀取文字文件,但缺乏處理 Excel 文件二進位格式的能力,這會導致字元亂碼或出現異常。

IronXL是什麼?

IronXL 是一個 C# 程式庫,它允許開發人員讀取、寫入和操作 Excel 檔案而無需 Excel Interop,從而提供更有效率、更可靠的解決方案。

IronXL 如何改進 C# 中讀取 Excel 檔案的功能?

IronXL 簡化了讀取 Excel 檔案的過程,它提供了存取 Excel 資料的方法,而無需複雜的互通程式碼或處理檔案格式的複雜性。

我可以在沒有安裝Excel的情況下使用IronXL讀取Excel檔案嗎?

是的,IronXL 不需要在您的系統上安裝 Microsoft Excel,因此它是一個獨立的 C# 處理 Excel 檔案的解決方案。

與 Excel Interop 相比,使用 IronXL 有哪些優點?

IronXL 速度更快,無需安裝 Excel,並降低了 Excel Interop 中常見的版本相容性問題的風險。

IronXL 是否適用於處理大型 Excel 檔案?

是的,IronXL 針對效能進行了最佳化,可以有效地處理大型 Excel 文件,因此適用於處理大量資料的應用程式。

IronXL 是否支援讀取 .xls 和 .xlsx 格式?

IronXL 同時支援 .xls 和 .xlsx 格式,使開發人員能夠無縫地處理各種 Excel 檔案類型。

如何在我的 C# 專案中使用 IronXL?

您可以透過 Visual Studio 中的 NuGet 套件管理器安裝 IronXL,並將其整合到您的 C# 專案中來讀取和操作 Excel 文件,從而開始使用 IronXL。

IronXL 的常見應用場景有哪些?

IronXL 的常見用途包括從 Excel 檔案中提取資料、產生報表、資料處理以及在 C# 應用程式中自動化 Excel 相關任務。

IronXL 可以用於 Web 應用程式嗎?

是的,IronXL 既可用於桌面應用程序,也可用於 Web 應用程序,讓您在專案中實現 Excel 處理功能時擁有更大的靈活性。

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