.NETでExcelファイルを読み込むライブラリを作る
Excel(Office)ファイルの扱いの難しさ
Microsoft Officeのオートメーション機能を使用すれば、
コード上でOffice文書の作成から読み込みまで思いのままです。
ちょー便利に見えるこの機能ですが、.NET Frameworkとの相性は最悪としかいいようがありません。
コード上でOffice文書の作成から読み込みまで思いのままです。
ちょー便利に見えるこの機能ですが、.NET Frameworkとの相性は最悪としかいいようがありません。
その最大の理由は、一度使ったCOMオブジェクトに対し、
参照からはずれるときまたは必要なくなったとき、確実にオブジェクトの解放を行わなければならないことです。
参照からはずれるときまたは必要なくなったとき、確実にオブジェクトの解放を行わなければならないことです。
これを怠ると、処理が終わったあとタスクにExcelのプロセスが残り続けることになります。
これは誰もが一度は直面する問題でしょう。
特にピリオドなどで間接的に参照していることに気づかず、
泥沼にはまる例はいろいろな掲示板を見ていても後を絶ちません。
これは誰もが一度は直面する問題でしょう。
特にピリオドなどで間接的に参照していることに気づかず、
泥沼にはまる例はいろいろな掲示板を見ていても後を絶ちません。
問題はこればかりではなく、
Office製品にバージョンがあるように、
オートメーション(サーバー)にもバージョンがあることも懸念材料の一つ。
使用するOfficeのバージョンに合わせて使用するオートメーションのバージョンを変えなければならないのです。
つまりどういうことかというと、
例えばExcel2003でファイルを読み込むために書いたコードがExcel2000には使えないということ。
やってられませんね。
これを攻略するには遅延バインディングという手法が有効なのですが、
C#でこの方法を取るとかなり冗長なコードとなってしまいます。
(といっても解放解放ですでに冗長なんですが)
Office製品にバージョンがあるように、
オートメーション(サーバー)にもバージョンがあることも懸念材料の一つ。
使用するOfficeのバージョンに合わせて使用するオートメーションのバージョンを変えなければならないのです。
つまりどういうことかというと、
例えばExcel2003でファイルを読み込むために書いたコードがExcel2000には使えないということ。
やってられませんね。
これを攻略するには遅延バインディングという手法が有効なのですが、
C#でこの方法を取るとかなり冗長なコードとなってしまいます。
(といっても解放解放ですでに冗長なんですが)
前置き終わり。
改善案
今回考えているのはExcelの表をメモリ上に落とすこと。
最近触れたADO.NETに触発された感もあるのですが、
Excelの表をDataTableのようなメモリ上の表に置き換えることができれば、
要素(セル)へのアクセスも楽チンだろうというもの。
DataTableのような大層なものはめんどくさいので、
セルと行とシートをリスト(List<>)で構成するようにしてみます。
また、遅延バインディングを用いてExcelのバージョンに依存しないようにするとともに、
Excel操作から完全に切り離した形にすることで、安心、安全を目指します。
最近触れたADO.NETに触発された感もあるのですが、
Excelの表をDataTableのようなメモリ上の表に置き換えることができれば、
要素(セル)へのアクセスも楽チンだろうというもの。
DataTableのような大層なものはめんどくさいので、
セルと行とシートをリスト(List<>)で構成するようにしてみます。
また、遅延バインディングを用いてExcelのバージョンに依存しないようにするとともに、
Excel操作から完全に切り離した形にすることで、安心、安全を目指します。
- ExcelReader
- Readメソッドを使ってExcelファイルを読み込めば、表データを収めたContextオブジェクトが手に入ります。
- (Openメソッドは勉強のためのおまけ)
- Context
- シートを表すSheetオブジェクトをリストで持っています。
- Sheet
- 行を表すRowオブジェクトをリストで持っています。
- Row
- セルを表すStringオブジェクトをリストで持っています。
かなり単純です・・・。何かもっと機能をつけたければこいつらを改良してください。
- バージョンUPの問題はうちもあるよ~。
しかも2007はオートメーションサーバすらないよ~。 -- qutto (2007-04-05 00:40:29) - あじっすか -- NZ-000 (2007-04-05 00:51:55)