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

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

多くの C# 開発者は、Excel シート ファイルを読み込もうとしたときに共通の課題に直面します。テキスト ファイルでは完璧に動作する信頼できる StreamReader が、Excel ドキュメントでは不可解に失敗します。 C# で StreamReader を使用して Excel ファイルを読み込もうとしたところ、文字化けや例外が発生したという経験があるなら、それはあなただけではありません。 このチュートリアルでは、StreamReader が Excel ファイルを直接処理できない理由を説明し、Excel Interop を使用せずにIronXL を使用する適切な解決策を示します。

Excel で開くことができる CSV ファイルは、StreamReader と問題なく動作するため、混乱が生じることがよくあります。 しかし、真のExcelファイル(XLSX, XLS)は根本的に異なるアプローチが必要です。 この違いを理解することで、デバッグに時間を節約し、タスクに最適なツールを見つける事ができます。

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 1 - IronXL

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
$vbLabelText   $csharpLabel

このプログラムのクラスコードスニペットを実行すると、スプレッドシートデータを見る代わりに、"PK♥♦"などのバイナリの未知データや類似のシステム文字が表示されます。 XLSXファイルは、複数のXMLファイルを含むZIPアーカイブであり、XLSファイルは独自のバイナリフォーマットを使用します。 StreamReader はプレーンテキストを想定しており、これらの複雑な構造を文字として解釈しようとするため、意味のない出力になります。

サンプル入力

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 2 - Excel 入力

出力

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 3 - コンソール出力

最新のExcelファイル(XLSX)は複数のコンポーネントを含みます:ワークシート、スタイル、共有文字列、関連性など、すべてが一緒にパッケージ化されています。 この複雑さは、Excelファイル構造を理解する専門的なライブラリが必要であり、それがIronXLにつながります。

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

IronXLは、C#でExcelファイルを読み込むための簡単なソリューションを提供します。 StreamReaderとは異なり、 IronXLはExcelの内部構造を理解し、データにアクセスするための直感的な方法を提供します。 ライブラリはWindows、Linux、macOS、およびDockerコンテナをサポートしており、現代のクロスプラットフォームアプリケーションに最適です。

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 4 - クロスプラットフォーム

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

Install-Package IronXl.Excel

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: イメージ 5 - インストール

適切に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
$vbLabelText   $csharpLabel

このコードはあなたの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
$vbLabelText   $csharpLabel

WorkBook.FromStream メソッドは、FileStream、またはネットワーク ストリームなど、あらゆるストリーム タイプを受け入れます。 これにより、Excelファイルをディスクに保存することなく、さまざまなソースから処理する柔軟性が可能になります。この例では、ワークシートデータをデータテーブルに変換することもデモしており、データベースやデータバインディングシナリオとシームレスに統合されます。

出力

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 6 - MemoryStream 出力から Excel を読み込む

データを読み取るためにobject senderを使用するタイミング?

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

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 7 - 機能

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")
$vbLabelText   $csharpLabel

これらの変換は、ファイル形式を変更しながらデータを保護します。 ExcelをCSVに変換する際、IronXLはデフォルトで最初のワークシートをフラット化しますが、エクスポートするワークシートを指定することもできます。 CSVからExcelへの変換は、データ型を保持し、今後のフォーマットおよび数式の追加を可能にする適切にフォーマットされたスプレッドシートを作成します。

結論

StreamReader が Excel ファイルを処理できないのは、プレーンテキストと Excel の複雑なファイル構造との根本的な違いに起因します。 StreamReader は CSV やその他のテキスト形式では完璧に機能しますが、真の Excel ファイルでは、内部のバイナリ構造と XML 構造を理解するIronXLのような専用ライブラリが必要です。

IronXLは直感的なAPI、包括的な形式サポート、シームレスなストリーム処理機能を備えたエレガントな解決策を提供します。 ウェブアプリケーション、デスクトップソフトウェア、クラウドサービスの構築に関わらず、IronXLはすべてのプラットフォームでExcelファイルを確実に処理します。

C# で StreamReader を使用して Excel ファイルを読み込む代替方法 - IronXL: 画像 8 - ライセンス

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をインストールする必要がないため、他のライブラリと比較して強力な選択肢となります。

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

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

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

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね