> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】Excel ファイルの読み込みなら ExcelDataReader がおすすめ

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

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」をインストールします。

STEP
NuGet パッケージマネージャーを開く

Visual Studio のヘッダーメニューもしくはソリューションエクスプローラーから、NuGet パッケージマネージャーを開きます。

STEP
ExcelDataReaderを検索する

NuGet パッケージマネージャーの検索欄に「ExcelDataReader」と入力して検索します。

STEP
ExcelDataReaderをインストールする

検索結果の一覧の中に「ExcelDataReader」と「ExcelDataReader.DataSet」があるので、それぞれインストールをします。ExcelDataReaderは基本となるパッケージで、ExcelDataReader.DataSetは拡張パッケージです。

インストールが終われば完了です。

次はインストールしたExcelDataReaderの基本的な操作方法を見てみましょう。

Excelファイルの読み込み

ExcelDataReader の使い方はReaderメソッドとAsDataSet拡張メソッドの2種類があります。

  • Readerメソッド
    選択されたシートを1行ごとに読み取り、各セルにアクセスします。(ExcelDataReaderパッケージのインストールが必須)
  • AsDataSetメソッド
    全シート全セルを読み込んでデータテーブルに格納されます。(ExcelDataReader.DataSetのインストールが必須)

Readerメソッドは選択されたシートの読み込みを行い、AsDataSet拡張メソッドは全シート全セルを読み込みます。

Readerメソッド

Readerメソッドを使ったサンプルを紹介します。

まず読み取りの対象ファイルが ExcelDataReader がサポートしている拡張子であることを確認します。

サポート対象外の拡張子のファイルでリーダーオブジェクトを作成した場合、「ExcelDataReader.Exceptions.HeaderException: ‘Invalid file signature.’
」という例外が発生します。

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」を紹介しました。

エクセルを扱えるライブラリの中でも、高速で処理ができるメリットがあります。各ライブラリの読み込み処理速度を検証した記事にも記載していますが、その差は一目瞭然です。

この記事が参考になれば幸いです。

以上、最後まで読んでいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!