ExcelファイルにSQL投げられるよ!よ!
対象のファイルをExcelで開いていると、お互いにリアルタイムで反映されて楽しいかもしれない。
ランタイム
今回はAccessデータベースエンジン(ACEエンジン)を使います。Accessのコンポーネントなので、インストールされていない環境であれば「Microsoft Access データベース エンジン 再頒布可能コンポーネント」を入れるとよいです。Access全体のランタイムもありますが、でかいです。
あと最近のOfficeを「クイック実行形式」でインストールするとOLEDBプロバイダも登録されないようなので、やはり別途インストールするのがよさそうです。
インストールされていれば new OleDbEnumerator().GetElements()
でそれらしいのが見れるはず。あと、例によってx86とx64別です。
なおExcel2003以前の形式(.xls)かつ32bit版でよければ、Windows付属の Microsoft.Jet.OLEDB.4.0
というプロバイダでも基本的に同じように使えます。
参考: Microsoft Access(.mdb、.accdb)のODBC、OLEDBドライバーに関するまとめ | アシスト
接続する
接続文字列に必要なパラメータは以下の通り。
- Provider:
Microsoft.ACE.OLEDB.12.0
- 2013では15.0(12.0は存在しても使えなかった記憶)
- 2016では16.0(12.0も付属しているし使える)
- Data Source: ファイル名
- Extended Properties:
{ISAM形式}; {オプション}
ISAM形式は Excel 12.0
Excel 12.0 Xml
Excel 12.0 Macro
Excel 8.0
など。 HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access\Access Connectivity Engine\ISAM Formats
(もしくはそれに準ずる場所)で一覧が見れます。
オプションは例えばこんなのがあります。
-
HDR=NO
:ヘッダ行なし(F1, F2, ...といった列名になる) -
MAXSCANROWS=[1..16]
:データ型の自動判定に使われる行数
var constr = new OleDbConnectionStringBuilder
{
["Provider"] = "Microsoft.ACE.OLEDB.12.0",
["Data Source"] = @"r:\hoge.xls",
["Extended Properties"] = "Excel 12.0 Xml"
}.ToString();
var con = new OleDbConnection(constr);
何ができるか
-
[名前]
(Excelで定義した領域名) -
[シート名$]
(データが入力されている左上から右下までの範囲) [シート名$名前]
-
[シート名$セル範囲]
([シート名$]
の範囲内のみ)
をテーブル名として、SELECT/INSERT/UPDATEが普通に使えます。ただしDELETEはできない。
- CREATE TABLE
既存の領域を指定すると見出しを変更できます。
$を含まない文字列を指定するとシート名として扱われ、新しいシートが作成されます。 - DELETE TABLE
列見出しも含めて消去します。定義済みの名前で指定すると、その名前も削除されるようです。