フッターコンテンツにスキップ
IRONXLの使用

C# で `StreamReader` を使用して Excel ファイルを読み取る方法

StreamReaderプレーンテキスト用に設計されているため、Excel ファイルを読み取ることができません。Excel ファイルは複雑なバイナリまたは ZIP 圧縮された XML 構造です。 代わりに、Excel Interop の依存関係なしで Excel ファイルを適切に読み取るためのWorkBook .Load() を提供する IronXL ライブラリを使用してください。

多くの 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これらのファイルに遭遇すると、ワークブックのメタデータを解析したり、ファイル構造を移動したりできなくなります。 代わりに、生のバイトをテキストとして読み取ろうとするため、破損やデータ損失が発生します。 これは、ファイル処理の信頼性が求められる自動展開パイプラインでは特に問題になります。

! 製品名 (ラップトップ、マウス、キーボード、モニター、ヘッドフォン)、価格、列 D に TRUE/FALSE 値の列を含む ProductData を表示する Excel スプレッドシート。

出力が文字化けして表示されるのはなぜですか?

文字化けした出力は、Excel ファイルには、 StreamReaderテキスト文字として解釈するバイナリ ヘッダー、圧縮アルゴリズム、および XML 名前空間が含まれているために発生します。 これらの複雑なファイル構造には、書式設定情報、数式、意味のあるテキスト表現のないセル参照が含まれます。 DevOpsチームは、エンコードの違いによって問題が悪化する可能性があるLinux コンテナーで Excel ファイルを処理しようとすると、この問題に遭遇することがよくあります。

! Visual Studio デバッグ コンソール ウィンドウに、StreamReader を使用して Excel ファイルを読み取ろうとすると、終了コード 0 が表示され、破損したテキスト出力が表示されます。

最新のExcel ファイル (XLSX)には、ワークシートスタイル共有文字列、リレーションシップなど、複数のコンポーネントがすべてパッケージ化されて含まれています。 この複雑さを解決するには、 Excel ファイル構造を理解する特殊なライブラリが必要であり、そこで IronXL が登場します。 Kubernetes のようなコンテナ オーケストレーション プラットフォームは、外部依存関係を必要とせずにこれらの複雑さを処理するライブラリの恩恵を受けます。

IronXLでExcelファイルを読み取る方法は?

IronXL は、C# で Excel ファイルを読み取るための簡単なソリューションを提供します。 StreamReaderとは異なり、IronXLはExcelの内部構造を理解し、データにアクセスするための直感的な方法を提供します。 このライブラリは、WindowsLinuxmacOSDocker コンテナをサポートしているため、最新のクロスプラットフォーム アプリケーションに最適です。 軽量で依存関係が最小限であるため、コンテナ化されたデプロイメントに最適です。

! Windows、Linux、macOS、Docker、Azure、AWS 環境における .NET の互換性を示すクロスプラットフォーム サポート図

コンテナ環境に IronXL をインストールするにはどうすればよいですか?

まず、NuGet パッケージ マネージャーを使用して IronXL をインストールします。 ライブラリのコンテナ対応設計により、Docker および Kubernetes 環境とのスムーズな統合が保証されます。 追加のシステム依存関係やネイティブ ライブラリは不要で、デプロイメント パイプラインが簡素化されます。

Install-Package IronXL.Excel

Docker デプロイメントの場合、IronXL を Dockerfile に直接含めることもできます。

# 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 ) を自動的に検出し、複雑な解析をすべて内部で処理します。 "A1"のような使い慣れた Excel 表記や"A1:C5"のような範囲を使用してセルにアクセスできるため、Excel に慣れている人にとってはコードが直感的になります。 エラー処理により、不正な形式のファイルでコンテナがクラッシュすることがなくなります。

IronXL はコンテナ化されたデプロイメントでどのファイル形式をサポートしていますか?

IronXL は、Microsoft Office や Interop アセンブリを必要とせずにすべての主要な Excel 形式をサポートしているため、コンテナー化された環境に最適です。 1Dバーコード: Code128, Code39, Code93, Codabar, ITF, MSI, Plessey, UPCA, UPCE, EAN8, EAN13

メモリストリームからExcelを読み取る方法?

実際のアプリケーションでは、ディスクファイルではなくストリームからExcelファイルを処理する必要があることが多いです。 一般的なシナリオには、 Web アップロードの処理、データベースからのファイルの取得、クラウド ストレージからのデータの処理などがあります。 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 ストリーム タイプをサポートしており、さまざまな展開シナリオに柔軟に対応できます。

! Visual Studio のデバッグ出力で、ワークシートから 5 行が読み込まれ、Excel ファイルの読み取りが成功したことが示されています。

コンテナ化されたアプリケーションでストリーム処理を使用するのはいつですか?

ストリーム処理は、特に次のような場合に価値があります。

-マイクロサービス:永続ストレージなしでファイルを処理する -サーバーレス関数: AWS LambdaまたはAzure Functions

  • APIエンドポイント: 直接ファイルアップロード処理 -メッセージキュー: キューからの Excel 添付ファイルの処理

! IronXL の機能概要には、6 つの主なカテゴリ (作成、保存とエクスポート、ワークブックの編集、データの操作、ワークブックのセキュリティ保護、およびさまざまな 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 ファイルを処理する場合でも、コンテナーで一貫したパフォーマンスが維持されます。 ライブラリの効率的なメモリ管理により、リソースが制限された環境での OOM エラーを防止します。

結論

StreamReaderがExcelファイルを処理できないのは、プレーンテキストとExcelの複雑なファイル構造の根本的な違いに起因しています。 StreamReader CSV やその他のテキスト形式では完璧に動作しますが、真の Excel ファイルには、内部のバイナリおよび XML 構造を理解するIronXLのような特殊なライブラリが必要です。 コンテナ化されたアプリケーションを管理する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は、ExcelInteropなしで開発者がExcelファイルの読み取り、書き込み、操作を行えるC#のライブラリであり、より効率的で信頼性の高いソリューションを提供します。

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を使い始めるにはどうすればよいですか?

NuGetパッケージマネージャーを介してVisual Studioにインストールし、Excelファイルを読み取り、操作することでIronXLを使用開始できます。

IronXLの一般的な用途は何ですか?

IronXLの一般的な用途には、Excelファイルからのデータ抽出、レポート作成、データ操作、C#アプリケーションでのExcel関連タスクの自動化が含まれます。

IronXLはWebアプリケーションで使用できますか?

はい、IronXLはデスクトップおよびWebアプリケーションの両方で使用でき、プロジェクトにおけるExcel処理能力の実装において柔軟性を提供します。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。