跳過到頁腳內容
使用 IRONXL

如何在 C# 中使用 `StreamReader` 讀取 Excel 檔案

StreamReader 無法讀取 Excel 文件,因為它是為純文字設計的,而 Excel 文件是複雜的二進位或 ZIP 壓縮的 XML 結構。 請改用IronXL庫,它提供了 WorkBook.Load() 來正確讀取 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 檔案雖然看起來像電子表格,但實際上是複雜的二進位或 ZIP 壓縮的 XML 結構,StreamReader 無法解釋。 這種根本性的差異使得 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電子表格,顯示產品數據,包含產品名稱(筆記型電腦、滑鼠、鍵盤、顯示器、耳機)、價格以及D列中的TRUE/FALSE值。

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

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

Visual Studio 偵錯控制台視窗顯示,嘗試使用 StreamReader 讀取 Excel 檔案時,文字輸出損壞,並顯示退出程式碼 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 方法接受任何流類型,無論是 FileStream 或網路流。 這種靈活性使您無需先將 Excel 檔案儲存到磁碟即可處理來自各種來源的檔案。此範例還示範如何將工作表資料轉換為 DataTable ,DataTable 可以與資料庫和資料綁定場景無縫整合。 所示的非同步模式非常適合容器健康檢查和就緒探測。

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

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

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 檔案?

團隊經常需要將 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 licensing page showing Lite ($749), Plus ($999), Professional ($1,999), and Unlimited ($3,999) perpetual license options

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

常見問題解答

為什麼 StreamReader 無法在 C# 中讀取 Excel 文件?

StreamReader 設計用於讀取文本文件,缺乏處理 Excel 文件二進制格式的能力,這會導致亂碼或例外。

IronXL 是什麼?

IronXL 是一個 C# 庫,允許開發人員讀取、寫入和操作 Excel 文件,而不需要 Excel Interop,提供了一個更高效且可靠的解決方案。

IronXL 如何改善 C# 中的 Excel 文件讀取過程?

IronXL 簡化了讀取 Excel 文件的過程,提供方法來訪問 Excel 數據,無需復雜的 Interop 代碼或處理文件格式的繁瑣細節。

我可以使用 IronXL 在未安裝 Excel 的情況下讀取 Excel 文件嗎?

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

使用 IronXL 代替 Excel Interop 有哪些優勢?

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 的常見使用案例包括從 Excel 文件中提取數據、生成報告、數據操作以及自動化 C# 應用中的 Excel 相關任務。

IronXL 可以用於 Web 應用程序中嗎?

是的,IronXL 可用於桌面和網路應用程序中,為在專案中實施 Excel 處理功能提供了靈活性。

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

鋼鐵支援團隊

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