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

StreamReader の代わりに C# で Excel ファイルを読み取る方法

多くのC#開発者は、Excelファイルを扱う際に苛立たしい問題に直面します: テキストファイルを確実に扱うStreamReaderクラスが、Excelドキュメントに対しては完全に機能しません。 もしC#でStreamReaderを使用してExcelファイルを読み込もうとして、文字化けやバイナリノイズ、予期しない例外を見たことがあるならば、あなたは良い仲間にいます。 このガイドでは、StreamReaderがExcelファイルを扱えない理由を詳しく説明し、IronXLを使用して問題を正しく解決する方法を示します。これはExcelのインストールを必要としない.NET専用のExcelライブラリです。

混乱は、Excelが開けて保存できるCSVファイルがStreamReader で問題なく動作するためにしばしば起こります。 本当のExcelファイル(XLSX, XLS, XLSM)には根本的に異なるアプローチが必要です。 この違いを理解することで、デバッグの時間を節約し、仕事に最適なツールへの道を示します。

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像1 - IronXL

StreamReaderがExcelファイルを読めない理由は?

StreamReaderはテキストベースのリーダーです。 指定されたエンコーディング(UTF-8、ASCIIなど)を使用して、行ごとに文字データを読み取りますが、バイナリ構造や圧縮アーカイブを認識していません。 公式.NET StreamReaderドキュメントは、このクラスが文字エンコードされたテキスト専用に設計されていることを確認しています。 Excelファイルは、単純なスプレッドシートのように見えるにもかかわらず、実際にはStreamReaderが解釈できない複雑なバイナリまたはZIP圧縮XML構造を持っています。

XLSXファイルをStreamReaderで開くと、実際にはZIPアーカイブをプレーンテキストとして読もうとしています。 その結果は、スプレッドシートデータではなく、バイナリノイズのストリームです。

// This code will NOT work -- demonstrates the problem
using StreamReader reader = new StreamReader("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
// This code will NOT work -- demonstrates the problem
using StreamReader reader = new StreamReader("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
$vbLabelText   $csharpLabel

このスニペットを実行すると、スプレッドシートの行を見る代わりに、PK♥♦や似たノイズのようなバイナリ文字に遭遇します。これは次の理由で起こります:

  • XLSXファイルは、複数のXMLファイル: ワークシート、スタイル、共有文字列、関連を含むZIPアーカイブです。 Open XML SDKのドキュメントは、この構造の詳細を提供します。
  • XLSファイルはプロプライエタリなバイナリ形式(BIFF - バイナリ・インターチェンジ・ファイルフォーマット)を使用しています。
  • StreamReaderは読み取るバイトに文字エンコーディングを適用するため、どちらの形式でも無意味な出力を生成します。

サンプル入力

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像2 - Excel入力

StreamReaderを使用した場合の文字化け出力

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像3 - コンソール出力

CSVはなぜ動作し、XLSXはそうでないのか

CSV(コンマ区切り値)はプレーンテキスト形式です。 各行はテキストの行であり、各列はコンマで区切られています。 StreamReaderはCSVファイルにバイナリデータや圧縮アーカイブを含まないため、問題なく読み取ります。 XLSXは根本的に異なります: 複数のXMLドキュメントをメタデータ、テーマ、およびスタイル定義と共にZIPコンテナ内にパッケージ化しています。 単純な行ごとの読み取りは不可能です。

この違いはツールを選択する際に重要です。 CSVファイルには、File.ReadAllLinesが十分です。 本物のExcelワークブックには、形式を構造的に理解するライブラリが必要です。

IronXLを.NETプロジェクトにインストールする方法

IronXLは、Microsoft Excelをインストールすることなく、Excelファイルを読み書き生成できる.NETライブラリです。 XLSX、XLS、XLSM、CSV、TSVフォーマットをサポートし、Windows、Linux、macOS、Dockerコンテナで動作します。

IronXLをインストールするには、NuGetパッケージマネージャーコンソールまたは.NET CLIを使用します。 パッケージはNuGet.orgにIronXLとして公開されています。

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

インストール後、ファイルにusing IronXL;ディレクティブを追加すると、Excelドキュメントを操作する準備が整います。

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像5 - インストール

インストール手順およびNuGet構成オプションの詳細については、IronXL NuGetインストールガイドを参照してください。 無料トライアルライセンスが提供されており、購入前にあなたのプロジェクトでIronXLを評価できます。

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像4 - クロスプラットフォーム

IronXLでExcelファイルを読む方法

IronXLは、C#でのExcelファイルの読み取りに直感的なAPIを提供します。 StreamReaderとは異なり、IronXLはExcelの内部構造を理解し、行、列、およびセルの値にクリーンにアクセスできます。 IronXLドキュメントには、すべてのサポートされている操作のための完全なAPIリファレンスが記載されています。

IronXLを使用したトップレベルステートメントでExcelファイルを読む方法は以下の通りです。

using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
$vbLabelText   $csharpLabel

WorkBook.Loadメソッドはファイル形式(XLSX、XLS、XLSM、CSV)を自動的に検出し、あらゆる複雑な解析を処理します。 標準Excelノーテーション("A1:C10"のような範囲)を使用してセルにアクセスするため、スプレッドシートに詳しい人にはすぐに理解できるコードになります。

複数のワークシートにアクセスする

多くのワークブックは、1つ以上のシートを含んでいます。 IronXLを使用してワークブックを開き、ナビゲートし、ワークシートの完全な列挙を行うことができます。

using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
$vbLabelText   $csharpLabel

このアプローチは、StreamReaderや文字列操作でExcelを解析しようとする試みよりはるかにクリーンです。

メモリストリームからExcelデータを読む方法

実際のアプリケーションでは、ディスクファイルではなくストリームからExcelファイルを処理する必要があることが多いです。 一般的なシナリオには、ウェブフォームからのファイルアップロードの処理、データベースのBLOB列からのワークブックの取得、またはクラウドストレージ(Azure Blob Storage、AWS S3)からダウンロードしたファイルの処理が含まれます。 IronXLはこれらのシナリオをWorkBook.FromStreamで処理します。

using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
$vbLabelText   $csharpLabel

Stream - FileStream、またはネットワークストリームを受け入れます。 この柔軟性により、Excelデータを読み取るためだけに一時ファイルをディスクに書き込む必要がありません。 SqlBulkCopy、データバインディングコントロール、およびレポートフレームワークと直接統合されます。

ストリーム処理の出力

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像6 - メモリーストリーム出力からのExcelの読み取り

いつイベント駆動のExcel読み込みを使用するのか

イベント駆動アーキテクチャ - 例えば、Windows FormsのファイルアップロードボタンやASP.NETコントローラのアクション - では、メソッドシグネチャにEventArgs eパラメータが含まれていることがよくあります。 Excel処理ロジックは同じIronXL APIを使用しますが、トップレベルステートメントではなく、イベントハンドラ内で呼び出されます。 IronXLはUIスレッドに依存しないため、イベント駆動または非同期ワークフローにクリーンに統合されます。

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像7 - 機能

ExcelとCSV形式を変換する方法

StreamReaderはCSVファイルを扱えますが、制作アプリケーションはしばしばExcelとCSVの間でデータを移動する必要があります。IronXLはフォーマット変換を簡単にします。 わずか数行でExcelデータをCSVにエクスポートしたり、CSVデータをワークブックにインポートしたりできます。

using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
$vbLabelText   $csharpLabel

これらの変換はデータを保持しながらコンテナ形式を変更します。 ExcelをCSVに変換すると、IronXLはデフォルトで最初のワークシートをエクスポートします。 選択したシートを指定することができます。 CSVをExcelに変換すると、適切に構造化されたワークブックが生成され、その後、フォーマットを適用し、式を追加し、追加データを書くことができます。

サポートされるフォーマットの違いは何ですか?

さまざまなファイルフォーマットを読み取るためのStreamReaderとIronXLの比較
ファイルフォーマット StreamReader IronXL 注意事項
CSV (.csv) はい はい プレーンテキスト; StreamReaderは問題なく動作します
XLSX (.xlsx) なし はい ZIP圧縮XML; ライブラリが必要
XLS (.xls) なし はい バイナリBIFFフォーマット; ライブラリが必要
XLSM (.xlsm) なし はい マクロ対応ワークブック
TSV (.tsv) はい はい タブ区切りのプレーンテキスト

IronXLでExcelファイルを作成しフォーマットする方法

Excelデータを読み取ることはワークフローの一部に過ぎません。 多くのアプリケーションは、新しいExcelファイルを作成し、フォーマットを適用する必要もあります。 IronXLは、フォント、色、境界線、数値フォーマット、およびセルの結合を含むセルのフォーマットをサポートしています。

using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
$vbLabelText   $csharpLabel

既存のワークブックを読み、新しいフォーマット済みのファイルを作成する能力があるため、IronXLは.NETアプリケーションにとって完全なExcelソリューションです。 サポートされている操作の詳細な分析については、IronXLの機能ページをレビューしてください。

データを他の形式にエクスポートする

IronXLはまた、特にクロスシート計算やデータベース一括挿入操作のために、複数のワークシートをメモリにロードする際に役立つDataSetオブジェクトへのワークブックデータのエクスポートをサポートしています。 DataSetを返します。

図: C#でStreamReaderを使用してExcelファイルを読み取る代替手段 - IronXL: 画像8 - ライセンス

IronXLを本番環境でライセンスしデプロイする方法

IronXLは開発およびテストには無料です。 本番環境のアプリケーションにはライセンスが必要です。 製品ページで展開要件に応じた開発者、チーム、組織レベルのIronXLライセンスオプションをご覧ください。

購入後、IronXL呼び出しの前にコード内でライセンスキーを適用してください。

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

または、IRONXL_LICENSE_KEY環境変数をデプロイメント環境で設定すると、IronXLが自動的に認識します。 これは、コンテナ化されたデプロイ(Docker、Kubernetes)やキーのハードコーディングが許容されないクラウド環境で推奨される方法です。

評価目的のために、特定のワークロードに対してIronXLを購入前に検証するための無料トライアルライセンスが提供されており、完全に機能します。 トライアルはクレジットカードが不要で、即座にアクティブ化されます。

Microsoft.Office.Interop.Excelなどの代替案と比較して、IronXLは以下の展開利点を持っています:

  • サーバーでのMicrosoft Excelのインストールは不要
  • LinuxおよびDockerに対応 - クラウドネイティブアプリケーションにとって重要
  • COMオブジェクトのライフサイクル管理やアパートメントスレッドの問題がない
  • サーバーコンテキストでの高速起動と低メモリ使用量
  • すべてのサポートされるプラットフォームで一貫した動作

これらの特質により、IronXLはオンプレミスでもクラウドでも、本番環境でExcelファイルを処理する必要がある.NETアプリケーションにとって実用的な選択肢となります。

よくある質問

StreamReader が Excel ファイルを直接処理できないのはなぜですか?

StreamReaderはテキストファイルの読み取りを目的として設計されており、Excelファイルで使用されるバイナリ形式や複雑な構造化データ形式を解析する機能はありません。この制限により、StreamReaderを使用してExcelファイルを直接読み取ろうとすると、文字化けや例外が発生します。

C# で Excel ファイルを読み取るための推奨ソリューションは何ですか?

推奨される解決策は、Excel Interopを必要とせずにC#でExcelファイルの読み取り、編集、作成を可能にする強力なライブラリであるIronXLを使用することです。IronXLは、Excelファイルの複雑な構造を効率的に処理できます。

IronXL には Excel Interop に比べてどのような利点がありますか?

IronXLには、Excel Interop に比べて優れたパフォーマンス、サーバーまたはクライアント マシンに Excel がインストールされている必要がないこと、展開が容易であること、Web およびクラウド環境で Excel ファイルを操作する機能など、いくつかの利点があります。

IronXL は.xls と .xlsx の両方のファイル形式を処理できますか?

はい、 IronXL は.xls と .xlsx の両方の Excel ファイル形式を処理できるため、さまざまな種類の Excel ドキュメントを扱う開発者に柔軟性を提供します。

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

はい、 IronXLは軽量で、 .NET Coreおよび.NET Frameworkと互換性があるため、Web アプリケーションを含むさまざまなアプリケーション タイプで使用できるように設計されています。

IronXL を使用するには Microsoft Excel をインストールする必要がありますか?

いいえ、 IronXLサーバーまたはクライアント マシンに Microsoft Excel をインストールする必要がないため、サーバー側アプリケーションやクラウド環境に最適です。

IronXLの典型的な使用例は何ですか?

IronXLの一般的な使用例には、Excel ファイルからのデータの抽出と分析、レポートの生成、Excel ファイルの作成と変更の自動化、Excel データの他のアプリケーションへの統合などがあります。

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

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

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me