言いたかった事
完璧な方法は存在しないと客に言える雰囲気を作っていきたい。
無理すれば何とか実現するやり方は見つかるが、大体の場合完璧ではないので、そのようなリスクがある事をちゃんと共有していく。
何でもかんでも Excel で取り扱ってデータを作ればいいや、で解決した気になるのは悪であるという空気を作りたい。
Excel のデータを外部と連携させるためには
- 非 Office アプリケーションから xls/xlsx を取り扱うという発想をまず捨てる
- ちゃんと設計する。どの部分のデータをエクスポートしたいのか、それとも書式込みでエクスポートしたいのか
- Workbook/Worksheet などの操作は基本的に Office あるいは VBA(マクロ) に任せる。あるいはマクロからファイル出力させる。
- 最終的には CSV 最強。
- すべてのシートの内容をマクロで値のみコピー&ペーストした上で CSV 出力するとか、そういう中間処理を挟む
Excel は UI であり、そのデータをプログラムが利用する場合はまた別コストの作業になる
- UI としての Excel はかなり強いので、そこは生かしていきたい。
- できる事とできない事、得意なところと不得意なところがあると認識する。全部これでできるわけではないと客に理解してもらう。
でも仕事だからやらないと! どうする?
ファイルをできる限り生で扱いたい
xls などの旧形式をサポートする必要がある場合
- 基本的に修羅の道です。もう時代遅れの形式だし。
- サーバサイドで作成・編集する場合は基本的に外部のライブラリを使うことになります。COMを使って操作するのはサポートされません。実際に、ユーザアカウントでなくSYSTEMアカウントでOfficeを起動させて失敗した経験があります。
- (例えばApache POIなどの)外部ライブラリが全ての要素に対して読み書きできる保証はありません。事前にそれがどれくらいのことが可能であるのか、実際に動かして調査しましょう。作成したファイルが開けないとか内容が壊れているとか十分にありえます。
- クライアントサイドで作成・編集する場合、できればExcelからマクロ(VBA)を使いましょう。そのための機能です。外部からCOMでやる場合は、VBSで操作するのがオススメです。
xlsx 限定でOKな場合
- Office Open XMLは標準化されているので、将来に向けてOffice無しで読み書きのできる環境が整っていく可能性が高いです。少なくとも過去のOfficeドキュメントよりは。
- xlsと同じく、外部ライブラリが全ての要素に対して読み書きできる保証はありません。事前にそれがどれくらいのことが可能であるのか調査しましょう。しかし、標準化された仕様があるため、それが正しくない物を出力する可能性は xls より低くなっているはずですし、ライブラリの作成者へフィードバックすれば将来的に直っていく可能性が高いです。
- と言うわけで、有償無償色々な物を試すと良いです。
とにかくデータ連係ができればよい
- マクロを利用して連携したい部分のデータを個別に出力しましょう
- CSV 保存をしてテキスト化しちゃいましょう
- 完全な自動化は難しいので、操作コストを下げていく方向で考える
まとめ
「ネットで探したら見つかったから」 「他のプロジェクトでやってたから」 などと安易に考えず、それで何をしたいのか要件を出し、それを満たせるか基礎研究を行い、実現可能であるか検証する時間を取りましょう。どんな値を扱うのか、装飾をするのか、等々、お客様へのヒアリングを丁寧に……。