C# でエクセルの読み込みを行える「ExcelDataReader」を紹介します。
無料で利用できる上に高速に処理ができる人気のライブラリです。
エクセルファイルの読み込み専用のライブラリで、エクセルファイルを出力する機能はないので注意してください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
ExcelDataReaderについて
ExcelDataReaderはエクセルファイルの読み取り専用のライブラリです。このライブラリの特徴としてメモリ消費量が少なく、尚且つ高速に処理ができるのが特徴です。
\ GitHubサイトへ /
エクセルの読み取りに特化したライブラリ!!
サポートされている Excel ファイルは、旧ファイル形式(*.xls)と新ファイル形式(*.xlsx)の両方です。また CSV ファイル形式で保存されているファイルの読み取りも可能です。
ファイルの種類 | ファイル形式 | 読み込み | 書き込み |
---|---|---|---|
Excel 2007以降 (*.xlsx) | OpenXML | ○ | × |
Excel 2007以降 (*.xlsb) | OpenXML | ○ | × |
Excel 97-2003 (*.xls) | バイナリ | ○ | × |
CSVファイル (*.csv) | CSV(カンマ区切り) | ○ | × |
このライブラリは Visual Studio の Nuget パッケージマネージャーからインストールすることができます。
ExcelDataReaderのインストール
次の手順で「ExcelDataReader」をインストールします。
Visual Studio のヘッダーメニューもしくはソリューションエクスプローラーから、NuGet パッケージマネージャーを開きます。
NuGet パッケージマネージャーの検索欄に「ExcelDataReader」と入力して検索します。
検索結果の一覧の中に「ExcelDataReader」と「ExcelDataReader.DataSet」があるので、それぞれインストールをします。ExcelDataReaderは基本となるパッケージで、ExcelDataReader.DataSetは拡張パッケージです。
インストールが終われば完了です。
次はインストールしたExcelDataReaderの基本的な操作方法を見てみましょう。
Excelファイルの読み込み
ExcelDataReader の使い方はReader
メソッドとAsDataSet
拡張メソッドの2種類があります。
- Readerメソッド
選択されたシートを1行ごとに読み取り、各セルにアクセスします。(ExcelDataReaderパッケージのインストールが必須) - AsDataSetメソッド
全シート全セルを読み込んでデータテーブルに格納されます。(ExcelDataReader.DataSetのインストールが必須)
Reader
メソッドは選択されたシートの読み込みを行い、AsDataSet
拡張メソッドは全シート全セルを読み込みます。
Readerメソッド
Reader
メソッドを使ったサンプルを紹介します。
まず読み取りの対象ファイルが ExcelDataReader がサポートしている拡張子であることを確認します。
ExcelReaderFactory
クラスのCreateReader
メソッドで、ファイルの読み込みを行うリーダーオブジェクトを作成します。
またリーダーオブジェクトのオプション設定で、日本語の読み取りに対応させるためにエンコードを「シフトJIS」に変更します。
Read
メソッドで1行ずつ読み込みを行うことができます。セルの値はGetValue
メソッドで取得することができます。
private void ReaderSample(string filepath, string sheetname)
{
//ファイルの読み取り開始
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using (FileStream stream = File.Open(filepath, FileMode.Open, FileAccess.Read))
{
IExcelDataReader reader;
//ファイルの拡張子を確認
if (filepath.EndsWith(".xls") || filepath.EndsWith(".xlsx") || filepath.EndsWith(".xlsb"))
{
reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration()
{
//デフォルトのエンコードは西ヨーロッパ言語の為、日本語が文字化けする
//オプション設定でエンコードをシフトJISに変更する
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else if (filepath.EndsWith(".csv"))
{
reader = ExcelReaderFactory.CreateCsvReader(stream, new ExcelReaderConfiguration()
{
//デフォルトのエンコードは西ヨーロッパ言語の為、日本語が文字化けする
//オプション設定でエンコードをシフトJISに変更する
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else
{
MessageBox.Show("サポート対象外の拡張子です。");
return;
}
for (int i = 0; i < reader.ResultsCount; i++)
{
//シート名を指定
if (reader.Name != sheetname)
{
//次のシートへ移動
reader.NextResult();
continue;
}
while (reader.Read())
{
//1行毎に情報を取得
for (int col = 0; col < reader.FieldCount; col++)
{
//セルの入力文字を読み取り
Debug.WriteLine(reader.GetValue(col));
}
}
}
reader.Close();
}
}
AsDataSetメソッド
AsDataSet
メソッドを使ったサンプルを紹介します。
リーダーオブジェクトのAsDataSet
メソッドを呼び出しすると、Excel ファイルの内容が丸ごと DataSet オブジェクトの中に取り込まれます。
Tables
プロパティにシート名を指定することで、シートを切り替えすることができます。指定されたシート名がない場合はnullが返ります。
DataSet
のデータはfor
文のループで、セルからデータを読み取ることができます
private void AsDataSetSample(string filepath, string sheetname)
{
//ファイルの読み取り開始
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using (FileStream stream = File.Open(filepath, FileMode.Open, FileAccess.Read))
{
IExcelDataReader reader;
//ファイルの拡張子を確認
if (filepath.EndsWith(".xls") || filepath.EndsWith(".xlsx") || filepath.EndsWith(".xlsb"))
{
reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration()
{
//デフォルトのエンコードは西ヨーロッパ言語の為、日本語が文字化けする
//オプション設定でエンコードをシフトJISに変更する
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else if (filepath.EndsWith(".csv"))
{
reader = ExcelReaderFactory.CreateCsvReader(stream, new ExcelReaderConfiguration()
{
//デフォルトのエンコードは西ヨーロッパ言語の為、日本語が文字化けする
//オプション設定でエンコードをシフトJISに変更する
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else
{
MessageBox.Show("サポート対象外の拡張子です。");
return;
}
//全シート全セルを読み取り
var dataset = reader.AsDataSet();
//シート名を指定
var worksheet = dataset.Tables[sheetname];
if (worksheet is null)
{
MessageBox.Show("指定されたワークシート名が存在しません。");
}
else
{
//セルの入力文字を読み取り
for (var row = 0; row < worksheet.Rows.Count; row++)
{
for (var col = 0; col < worksheet.Columns.Count; col++)
{
Debug.WriteLine(worksheet.Rows[row][col]);
}
}
}
reader.Close();
}
}
まとめ
C# で無料で利用可能なエクセル読み出し専用のライブラリ「ExcelDataReader」を紹介しました。
エクセルを扱えるライブラリの中でも、高速で処理ができるメリットがあります。各ライブラリの読み込み処理速度を検証した記事にも記載していますが、その差は一目瞭然です。
この記事が参考になれば幸いです。
以上、最後まで読んでいただきありがとうございました。