C#でStreamReaderを使用してExcelファイルを読み取る代替方法 - IronXL
多くの C# 開発者は、Excel シート ファイルを読み込もうとしたときに共通の課題に直面します。テキスト ファイルでは完璧に動作する信頼できる StreamReader が、Excel ドキュメントでは不可解に失敗します。 C# で StreamReader を使用して Excel ファイルを読み込もうとしたところ、文字化けや例外が発生したという経験があるなら、それはあなただけではありません。 このチュートリアルでは、StreamReader が Excel ファイルを直接処理できない理由を説明し、Excel Interop を使用せずにIronXL を使用する適切な解決策を示します。
Excel で開くことができる CSV ファイルは、StreamReader と問題なく動作するため、混乱が生じることがよくあります。 しかし、真のExcelファイル(XLSX, XLS)は根本的に異なるアプローチが必要です。 この違いを理解することで、デバッグに時間を節約し、タスクに最適なツールを見つける事ができます。

StreamReaderがExcelファイルを読めない理由は?
StreamReader は、プレーンテキストファイル用に設計されており、指定されたエンコーディングを使用して文字データを1行ずつ読み取ります。 Excel ファイルは、表計算ソフトのように見えますが、実際には StreamReader が解釈できない複雑なバイナリまたは ZIP 圧縮された XML 構造です。
static void Main(string[] args)
{
// This code will NOT work - demonstrates the problem
using (StreamReader reader = new StreamReader("ProductData.xlsx"))
{
string content = reader.ReadLine(); // read data
Console.WriteLine(content); // Outputs garbled binary data
}
}
static void Main(string[] args)
{
// This code will NOT work - demonstrates the problem
using (StreamReader reader = new StreamReader("ProductData.xlsx"))
{
string content = reader.ReadLine(); // read data
Console.WriteLine(content); // Outputs garbled binary data
}
}
Option Strict On
Imports System.IO
Module Program
Sub Main(args As String())
' This code will NOT work - demonstrates the problem
Using reader As New StreamReader("ProductData.xlsx")
Dim content As String = reader.ReadLine() ' read data
Console.WriteLine(content) ' Outputs garbled binary data
End Using
End Sub
End Module
このプログラムのクラスコードスニペットを実行すると、スプレッドシートデータを見る代わりに、"PK♥♦"などのバイナリの未知データや類似のシステム文字が表示されます。 XLSXファイルは、複数のXMLファイルを含むZIPアーカイブであり、XLSファイルは独自のバイナリフォーマットを使用します。 StreamReader はプレーンテキストを想定しており、これらの複雑な構造を文字として解釈しようとするため、意味のない出力になります。
サンプル入力

出力

最新のExcelファイル(XLSX)は複数のコンポーネントを含みます:ワークシート、スタイル、共有文字列、関連性など、すべてが一緒にパッケージ化されています。 この複雑さは、Excelファイル構造を理解する専門的なライブラリが必要であり、それがIronXLにつながります。
IronXLでExcelファイルを読み取る方法は?
IronXLは、C#でExcelファイルを読み込むための簡単なソリューションを提供します。 StreamReaderとは異なり、 IronXLはExcelの内部構造を理解し、データにアクセスするための直感的な方法を提供します。 ライブラリはWindows、Linux、macOS、およびDockerコンテナをサポートしており、現代のクロスプラットフォームアプリケーションに最適です。

まず、NuGetパッケージマネージャーを介してIronXLをインストールします:
Install-Package IronXL.Excel

適切にExcelファイルを読み取る方法は以下の通りです:
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
Imports IronXL
' Load the Excel file
Dim workbook As WorkBook = WorkBook.Load("sample.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read specific cell values
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Read a range of cells
For Each cell In worksheet("A1:C5")
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
このコードはあなたのExcelファイルを成功裏に読み込み、セルの値にアクセスできるようにします。 WorkBook.Load メソッドは、ファイル形式 (XLSX、XLS、XLSM、CSV) を自動的に検出し、複雑な解析処理を内部的にすべて行います。 "A1"や"A1:C5"のようなExcelに馴染みのある表記を使用してセルにアクセスでき、Excelに詳しい人には直感的なコードになります。
メモリストリームからExcelを読み取る方法?
実際のアプリケーションでは、ディスクファイルではなくストリームからExcelファイルを処理する必要があることが多いです。 一般的なシナリオには、Webアップロードの処理、データベースからのファイルの取得、クラウドストレージからのデータの処理が含まれます。 IronXLはこれらの状況をエレガントに処理します:
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
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 new DataTable, return dt
var dataTable = worksheet.ToDataTable(false);
// Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
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 new DataTable, return dt
var dataTable = worksheet.ToDataTable(false);
// Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
Imports IronXL
Imports System.IO
' Read Excel from a memory stream
Dim fileBytes As Byte() = File.ReadAllBytes("ProductData.xlsx")
Using stream As New MemoryStream(fileBytes)
Dim workbook As WorkBook = WorkBook.FromStream(stream)
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Process the data
Dim rowCount As Integer = worksheet.RowCount
Console.WriteLine($"The worksheet has {rowCount} rows")
' Read all data into a new DataTable, return dt
Dim dataTable = worksheet.ToDataTable(False)
' Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows")
End Using
WorkBook.FromStream メソッドは、FileStream、またはネットワーク ストリームなど、あらゆるストリーム タイプを受け入れます。 これにより、Excelファイルをディスクに保存することなく、さまざまなソースから処理する柔軟性が可能になります。この例では、ワークシートデータをデータテーブルに変換することもデモしており、データベースやデータバインディングシナリオとシームレスに統合されます。
出力

データを読み取るためにobject senderを使用するタイミング?
このコードがイベント駆動型プログラミング内で使用される場合(たとえば、Windows Forms またはASP.NETでファイルアップロードボタンを処理する場合)、1 つのメソッド シグネチャには、object sender や EventArgs e のようなパラメーターが含まれることがよくあります。 このコンテキストは、Excelの処理ロジックが正しくUIまたはサービスのイベントに関連付けられることを保証します。

ExcelとCSVの間で変換する方法?
StreamReader は CSV ファイルを処理できますが、Excel 形式と CSV 形式の間で変換する必要がある場合がよくあります。 IronXLはこの変換を簡単にします:
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
Imports IronXL
' Load an Excel file and save as CSV
Dim workbook As WorkBook = WorkBook.Load("data.xlsx")
workbook.SaveAsCsv("output.csv")
' Load a CSV file and save as Excel
Dim csvWorkbook As WorkBook = WorkBook.LoadCSV("input.csv")
csvWorkbook.SaveAs("output.xlsx")
' Export specific worksheet to CSV
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
worksheet.SaveAsCsv("worksheet1.csv")
これらの変換は、ファイル形式を変更しながらデータを保護します。 ExcelをCSVに変換する際、IronXLはデフォルトで最初のワークシートをフラット化しますが、エクスポートするワークシートを指定することもできます。 CSVからExcelへの変換は、データ型を保持し、今後のフォーマットおよび数式の追加を可能にする適切にフォーマットされたスプレッドシートを作成します。
結論
StreamReader が Excel ファイルを処理できないのは、プレーンテキストと Excel の複雑なファイル構造との根本的な違いに起因します。 StreamReader は CSV やその他のテキスト形式では完璧に機能しますが、真の Excel ファイルでは、内部のバイナリ構造と XML 構造を理解するIronXLのような専用ライブラリが必要です。
IronXLは直感的なAPI、包括的な形式サポート、シームレスなストリーム処理機能を備えたエレガントな解決策を提供します。 ウェブアプリケーション、デスクトップソフトウェア、クラウドサービスの構築に関わらず、IronXLはすべてのプラットフォームでExcelファイルを確実に処理します。

Excelファイルを適切に扱い始める準備はできていますか? IronXLの無料トライアルをダウンロードし、C#アプリケーションでのExcel処理を体験してください。 本番環境への導入については、プロジェクトのニーズに最適なIronXLライセンスオプションをご検討ください。
よくある質問
C#でExcelファイルを読み込むためにStreamReaderを使用できないのはなぜですか?
StreamReaderはテキストファイルの読み取り用に設計されており、Excelファイルのバイナリ形式をサポートしていないため、文字化けや例外が発生します。
C#でExcelファイルを読むには、どのような方法が推奨されますか?
C#でExcelファイルを読み込むには、Excel Interopを使用せずにExcelファイルを直接読み込んで操作できるIronXLを使用することを推奨します。
ExcelファイルのStreamReaderよりもIronXLを使う利点は何ですか?
IronXLは特にExcelファイル形式を扱うように設計されており、正確なデータの読み込みと操作が可能で、数式、チャート、書式設定などの様々な機能をサポートしています。
IronXLを使用するにはExcel Interopが必要ですか?
IronXLはExcel Interopとは独立して動作するため、ExcelがインストールされていなくてもExcelファイルを扱うことができます。
IronXLは異なるExcelファイル形式を扱えますか?
IronXLは.xls、.xlsx、.csvなど複数のExcelファイル形式をサポートしており、さまざまな種類のExcelドキュメントを柔軟に扱うことができます。
IronXLは大規模なExcelファイルに適していますか?
はい、IronXLはパフォーマンスに最適化されており、大規模なExcelファイルを効率的に処理できるため、大量のデータを扱うアプリケーションに適しています。
IronXLは他のExcel操作用C#ライブラリと比較してどうですか?
IronXLはユーザーフレンドリーなAPIを提供し、Excelの機能を包括的にサポートし、Excelをインストールする必要がないため、他のライブラリと比較して強力な選択肢となります。



