ExcelDataReader で XLS と XLSX の両方を読込む方法
Excel ファイルをデータ交換に利用する
Excel は本来、表計算ソフトとして、表組みデータの計算や図表の作成などを行うソフトとして発展してきています。
と同時に、 Excel ファイル上のデータは、CSV や固定長データファイル等と比べても、可読性が良好で、 人手による編集も容易であるため、柔軟性のあるデータファイルとしても広く使われています。
そのため、各システム間のデータの橋渡し、インテグレーションなどの状況では、 しばしば Excel ファイルが登場することになります。
Excel データファイルのフォーマット
データを保存するために Excel ファイルにはフォーマットがいくつかありますが、広く使われているのは2種類です。
ひとつは Excel 97-2003 形式のバイナリーフォーマットです。拡張子は .xls です。 Excel 2003 までのメインフォーマットです。 実際の現場では、これしか対応できないソフトウェアもまだあるので、 旧式ではありますが完全消滅というには程遠く、むしろ今でもしばしばみかけるので無視はできません。
もうひとつは Office Open XML 形式です。拡張子は *.XLSX です。 こちらは新しいオープンなフォーマットです。 今後はどんどん xlsx に移行していくことでしょう。
実は xlsx ファイルもバイナリーファイルですが、XML ファイルのアーカイブになっています。 拡張子を xlsx から zip に変えると、展開できて中身をみることができます。
XLSX ファイルだけを扱うなら、ClosedXML というライブラリが非常に使いやすく、これで 読むのも書くのも簡単です。詳しくは「ClosedXML を用いて Excel ファイルを操作する方法」をみてください。
XLS ファイルについては、書き込む (作成する) のは少々厄介で、Excel のオートメーションがよく使われます。
この記事では XLS ファイルと XLSX ファイルの両方のフォーマットを読み込むのに役に立つ、ExcelDataReader というライブラリを紹介します。
ExcelDataReader のインストール
ExcelDataReader ライブラリは NuGet パッケージマネージャから直接インストールできます。
NuGet パッケージマネージャのコンソールを開きます。
Install-Package コマンドで ExcelDataReader と ExcelDataReader.DataSet をインストールします。
コマンドは次の通り。バージョンを指定しなければ最新版が入ります。
PM> Install-Package ExcelDataReader ... PM> Install-Package ExcelDataReader.DataSet
ExcelDataReader のバージョン 2 以前を使う場合は ExcelDataReader.DataSet は不要です。
準備はこれだけです。
XLS と XLSX ファイルの両方を読み込む
ExcelDataReader のパッケージがインストールできれば、それを利用するのは簡単です。
次のサンプルではフォルダ C:\test\files 内に XLS ファイルと XLSX ファイルが保存されており、 その内容をコンソールに出力します。
using ExcelDataReader;
using System;
using System.Data;
using System.IO;
namespace App1 {
class Program {
static void Main(string[] args) {
var path = @"C:\test\files";
var files = Directory.GetFiles(path);
foreach(var file in files) {
var ds = ReadExcelData(file);
if(ds == null) {
continue;
}
foreach(DataTable tbl in ds.Tables) {
Console.WriteLine("TABLE {0}", tbl.TableName);
foreach(DataRow row in tbl.Rows) {
for(var i=0; i<tbl.Columns.Count; i++) {
Console.Write("{0} ", row[i]);
}
Console.WriteLine("");
}
}
}
}
static DataSet ReadExcelData(string path) {
DataSet ds = null;
var ext = Path.GetExtension(path);
try {
using(var stream = File.Open(path, FileMode.Open, FileAccess.Read)) {
using(var reader = ExcelReaderFactory.CreateReader(stream)) {
ds = reader.AsDataSet();
}
}
}
catch(Exception ex) {
Console.Error.WriteLine(ex.Message);
}
return ds;
}
}
}
ExcelReaderFactory クラスの CreateReader メソッドで、ファイルの読み込みを受け持つリーダーオブジェクトを作成します。
XLS ファイルにはバイナリリーダーが、XLSX ファイルには XML リーダーが作成されます。ファイルは拡張子で自動判別されます。
自動判別が都合が悪い場合はあまり無いと思いますが、必要とあらばそれぞれのリーダーを明示的に指定することも可能です。
リーダーオブジェクトの AsDataSet メソッドを呼ぶと Excel ファイルの内容が DataSet オブジェクトの中にまるごと読み込まれます。
Excel ファイルはワークブックの中に、ワークシートが複数含まれる、という階層構造になっています。 ワークシート毎に DataSet 内の DataTable に取り込まれ、DataTabe の名前としてワークシート (タブ) のラベルが設定されます。
以上、ExcelDataReader を使って Excel のバイナリ形式ファイルと XML 形式ファイルの両方を読込む方法を紹介しました。