StreamReader の代わりに C# で Excel ファイルを読み取る方法
C#の開発者の多くは、Excelファイルを扱うときにフラストレーションのたまる課題に遭遇します:テキストファイルを確実に処理するStreamReaderクラスは、Excelドキュメントを指すと完全に失敗します。 C#でStreamReaderを使ってExcelファイルを読もうとすると、文字化けやバイナリノイズ、予期せぬ例外が発生することがあります。 このガイドでは、StreamReaderがExcelファイルを扱えない理由を正確に説明し、IronXL(Excelのインストールが不要な.NET専用のExcelライブラリ)を使って問題を正しく解決する方法を紹介します。
Excelが開いて保存できるCSVファイルは、StreamReaderで問題なく動作するため、しばしば混乱が生じます。 真のExcelファイル(XLSX、XLS、XLSM)には、根本的に異なるアプローチが必要です。 この違いを理解することで、デバッグに費やす時間を大幅に節約でき、適切なツールを選択できるようになります。
.
StreamReaderがExcelファイルを読めない理由は?
CODE-43270はテキストベースのリーダーです。 指定されたエンコーディング(UTF-8、ASCIIなど)を使用して文字データを1行ずつ読み込み、バイナリ構造や圧縮アーカイブについては認識しません。 公式の.NET StreamReaderドキュメントには、このクラスは文字エンコードされたテキスト専用に設計されていることが明記されています。 Excelファイルは、単純なスプレッドシートのように見えますが、実際には複雑なバイナリまたはZIP圧縮されたXML構造であり、StreamReader@は解釈できません。
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♥♦"
Imports System.IO
' This code will NOT work -- demonstrates the problem
Using reader As New StreamReader("ProductData.xlsx")
Dim content As String = reader.ReadLine()
Console.WriteLine(content) ' Outputs garbled binary data like "PK♥♦"
End Using
このスニペットを実行すると、スプレッドシートの行が表示される代わりに、PK♥♦などのバイナリ文字や同様のノイズが表示されます。これは次のような理由で起こります:
- XLSXファイルは、ワークシート、スタイル、共有文字列、リレーションシップなど、複数のXMLファイルを含むZIPアーカイブです。 Open XML SDKのドキュメントには、この構造の詳細な解説が記載されています。
- XLSファイルは独自のバイナリ形式(BIFF - バイナリ交換ファイル形式)を使用します。
- CODE-43274--@@は、読み取ったバイトに文字エンコーディングを適用し、どちらのフォーマットでも意味のない出力を生成します。
サンプル入力
Alternative to Read Excel File Using StreamReader in C# - IronXL: Image 2 - Excel Input.
StreamReader使用時の出力が文字化けする
Alternative to Read Excel File Using StreamReader in C# - IronXL: Image 3 - コンソール出力。
CSVは機能するのにXLSXは機能しない理由
CSV(カンマ区切り値)はプレーンテキスト形式です。 各行はテキストの1行を表し、各列はカンマで区切られています。 バイナリデータや圧縮アーカイブを含まないため、CSVファイルを問題なく読み取ります。 XLSXは根本的に異なり、メタデータ、テーマ、スタイル定義とともに、複数のXMLドキュメントをZIPコンテナ内にパッケージ化します。 単純に一行ずつ読むことは不可能だ。
この違いは、工具を選ぶ際に重要になります。 CSVファイルについては、StreamReaderまたはFile.ReadAllLinesで十分です。 真のExcelワークブックを作成するには、構造レベルでフォーマットを理解するライブラリが必要です。
.NETプロジェクトにIronXLをインストールするにはどうすればよいですか?
IronXLは、Microsoft ExcelがインストールされていなくてもExcelファイルの読み書きや作成ができる.NETライブラリです。 XLSX、XLS、XLSM、CSV、TSV形式をサポートし、Windows、Linux、macOS、およびDockerコンテナ上で動作します。
IronXLをインストールするには、 NuGetパッケージマネージャーコンソールまたは.NET CLIのいずれかを使用してください。 このパッケージはNuGetにIronXLとして公開されています。
Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
インストール後、using IronXL;ディレクティブをファイルに追加すれば、Excelドキュメントで作業する準備が整います。
。
詳細なインストール手順および NuGet の設定オプションについては、IronXL NuGet インストールガイドを参照してください。 無料トライアルライセンスをご利用いただけますので、ご購入前にプロジェクトでIronXLを評価できます。
Alternative to Read Excel File Using StreamReader in C# - IronXL: Image 4 - Cross Platform.
IronXLでExcelファイルを読み込むにはどうすればよいですか?
IronXLは、C#でExcelファイルを読み込むための直感的なAPIを提供します。 CODE-43279--@@とは異なり、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}");
Imports IronXL
' Load the Excel file from disk
Dim workbook As WorkBook = WorkBook.Load("ProductData.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read a specific cell by address
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Iterate over a range of cells
For Each cell In worksheet("A1:C10")
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
' Read a numeric value
Dim price As Decimal = worksheet("B2").DecimalValue
Console.WriteLine($"Price: {price:C}")
このWorkBook.Load@メソッドは、ファイル形式(XLSX、XLS、XLSM、CSV)を自動的に検出し、複雑な構文解析をすべて処理します。 CODE-43281--@@や"A1:C10"のような標準的なExcel記法を使ってセルにアクセスします。
複数のワークシートへのアクセス
多くのワークブックには複数のシートが含まれています。 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}");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Load("MultiSheet.xlsx")
' List all worksheets
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}")
Next
' Access a sheet by name
Dim summary As WorkSheet = workbook.GetWorkSheet("Summary")
Dim totalRevenue As String = summary("B20").StringValue
Console.WriteLine($"Total Revenue: {totalRevenue}")
' Access a sheet by index
Dim firstSheet As WorkSheet = workbook.WorkSheets(0)
Dim lastRow As Integer = firstSheet.RowCount
Console.WriteLine($"Last row in first sheet: {lastRow}")
このアプローチは、エクセルをStreamReaderで解析したり、文字列を操作したりする試みよりもはるかにクリーンです。
メモリ ストリームから Excel データを読み込むにはどうすればよいですか?
実際のアプリケーションでは、ディスクファイルではなくストリームからExcelファイルを処理する必要があることが多いです。 一般的なシナリオとしては、Webフォームからのファイルアップロードの処理、データベースの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}");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
CODE-43285--@@は、任意の@@--CODE-43286--@、@@--CODE-43287--@、@@--CODE-43288--@、またはネットワークストリームを受け入れます。 この柔軟性のおかげで、Excelデータを読み込むためだけに一時ファイルをディスクに書き込む必要は一切なくなります。 CODE-43289--@@への変換は、@@--CODE-43290--@、データバインディングコントロール、およびレポーティングフレームワークとも直接統合します。
ストリーム処理からの出力
イベント駆動型Excel読み取りは、どのような場合に使用すべきですか?
イベントドリブンアーキテクチャ、たとえばWindowsフォームのファイルアップロードボタンやASP.NETコントローラのアクションでは、メソッドのシグネチャにobject senderとEventArgs eパラメータが含まれることがよくあります。 Excel処理ロジックは引き続き同じIronXL APIを使用しますが、トップレベルのステートメントではなく、イベントハンドラ内から呼び出されます。 IronXLはUIスレッドに依存しないため、あらゆるイベント駆動型または非同期型のワークフローにスムーズに統合できます。
Alternative to Read Excel File Using StreamReader in C# - IronXL: Image 7 - Features.
Excel形式とCSV形式の間でデータを変換するにはどうすればよいですか?
CODE-43293--@@は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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
これらの変換処理は、コンテナ形式を変更しながらデータを保持します。 IronXLはExcelをCSVに変換する際、デフォルトで最初のワークシートをエクスポートします。 任意のシートを指定できます。 CSVをExcelに変換すると、適切に構造化されたワークブックが作成され、そのワークブックに対して書式設定を行ったり、数式を追加したり、追加のデータを入力したりすることができます。
フォーマットのサポート状況の違いは何ですか?
| ファイル形式 | 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.");
Imports IronXL
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = 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
Dim products As String() = {"Widget A", "Widget B", "Widget C"}
Dim units As Integer() = {120, 85, 210}
Dim revenues As Decimal() = {2400.0D, 1700.0D, 4200.0D}
For i As Integer = 0 To products.Length - 1
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"
Next
' Save the workbook
workbook.SaveAs("FormattedReport.xlsx")
Console.WriteLine("Report created successfully.")
既存のワークブックを読み込む機能と、新しいフォーマット済みファイルを作成する機能の両方を備えているため、 IronXLは.NETアプリケーション向けの完全なExcelソリューションと言えます。 サポートされている操作の詳細については、 IronXLの機能一覧ページをご覧ください。
データを他の形式にエクスポートする
IronXLは、ワークブックデータをDataSetオブジェクトにエクスポートする機能もサポートしています。これは、シート間の計算やデータベースへの一括挿入操作のために、複数のワークシートをメモリに読み込む際に特に役立ちます。 CODE-43294--@@メソッドは、各ワークシートがDataTableになるDataSetを返します。
.
IronXLを本番環境に導入する際のライセンス取得と展開方法は?
IronXLは開発およびテスト目的では無料で利用できます。 実運用で使用する場合は、ライセンスが必要です。 IronXLのライセンスオプションについては、製品ページをご覧ください。導入要件に応じて、開発者、チーム、組織の各ティアが用意されています。
購入後、 IronXLの呼び出しを行う前に、コードにライセンスキーを適用してください。
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
Imports IronXL
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
あるいは、デプロイ環境にIRONXL_LICENSE_KEY環境変数を設定してください。 これは、コンテナ化されたデプロイメント(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 データの他のアプリケーションへの統合などがあります。



