いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

Excel Data Reader (IExcelDataReader, エクセル, データ読み取り)


便利なライブラリを発見。メモメモ・・。


文字通り、エクセルデータを読み取る為のライブラリです。
Windows環境だけでなく、CompactFrameworkとMonoにも対応しています。

IExcelDataReaderという型を利用してデータを読み取るのですが
このインターフェースが、IDataReaderインターフェースを実装しているので
データベース処理にてよく利用するDataReaderと同じように扱えます。


本家のページでも分かりやすいサンプルが載せてあるのですが
ついでなので、こちらでも同じようなサンプルを記述しておきます。

using System;
using System.Data;
using System.IO;
using System.Linq;
using DevExpress.XtraEditors;
using Excel;

namespace ExcelDataReaderSample {

    public partial class XtraForm1 : XtraForm {

        public XtraForm1() {
            InitializeComponent();
        }

        private void XtraForm1_Load(object sender, EventArgs e) {
            // 
            // Excel 2007形式のファイルを開くには以下のようにする。(OpenXml (xlsx))
            // 一旦readerを作成した後は、同じように使える。
            //
            //IExcelDataReader excelReader = Factory.CreateReader(File.Open(filePath, FileMode.Open, FileAccess.Read), ExcelFileType.OpenXml);

            // 
            // Excel 97から2003までのバイナリファイルを開くには以下のようにする。(xls)
            //
            string filePath = @".\TestData.xls";
            using (IExcelDataReader reader = Factory.CreateReader(File.Open(filePath, FileMode.Open, FileAccess.Read), ExcelFileType.Binary)) {
                //                
                // 結果をDataSetで取得.
                // (シート毎にてDataTableが作成される.)
                //
                // [注意点]
                //     何故かエクセルに直接日本語を入力してデータを保存してから
                //     表示すると、文字が化ける。一旦エディタなどでデータを編集し
                //     クリップボード経由で貼り付けるとうまく表示できる。
                //     (文字コード??)
                //
                DataSet result = reader.AsDataSet();
           
                gridControl1.DataSource = result;
                gridControl1.DataMember = result.Tables[0].TableName;

                //
                // DataReaderのようにしてデータを読み取り.
                //
                //DataTable table = new DataTable();
                //table.Columns.Add(new DataColumn());
                //while (reader.Read()) {
                //    table.Rows.Add(reader.GetInt32(0));
                //}

                reader.Close();
            }

        }
    }
}


試しついでに
データベースのテーブルデータをそのままエクセルに貼り付けて
それをDataSourceとしてグリッドで表示してみたところ、綺麗に表示
できました。(貼り付ける前にエクセル側で全セルの書式を文字列に
してあります)


ただ、ソースにも書いてあるのですが、直接エクセルに日本語を入力して
それを表示すると文字化けしてました。クリップボード経由で
貼り付けてやるとうまく表示できます。恐らく文字コードだと思いますが
誰かご存知の方いらっしゃったら教えてください。m(_ _)m