Excelファイルを画像として取得

ユーザーの要求は「Webフォームで入力したデータを帳票表示して印刷したい。Excelで作った図表を帳票にはめこめるように」
('A`)Excelスプレッドシート部分のデータだけならADO.NETとかを介して取り込むことはできるんだけどグラフやらオートシェイプやらも一緒にといわれるともうお手上げ。

WebアプリケーションでのOfficeシステムの扱いに苦労してる人はいっぱいいるみたい。便利で使い慣れたOffice製品を使いたいユーザーの気持ちはわかるんだけどね。

デキネーヨと突っぱねたいけどそうもいかないので、いろいろ調べてみると、Range.CopyPictureというメソッドでそのまま画像として取得できそうなことが判明。

Excel 2003で確認。しかし改ページプレビューの線とかもそのまま表示されてしまうw おそらく

xlCopyRange.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap);

の第一引数にExcel.XlPictureAppearance.xlScreenを渡しているのをExcel.XlPictureAppearance.xlPrinterにしてやれば良いと思うんだけど、そうすると何故か"Range クラスの CopyPicture メソッドが失敗しました。"とかエラーがでてしまう。深く追求したいけど体力の限界に近づいてきたので中断。

あと、クリップボードを介してデータのやり取りをしているので、上手く排他制御してやらないと酷いことになる。しかしクリップボード排他制御ってどうやるんだ。Clipboardクラスは[STAThread]指定されたメソッドでないと動かないのを知らずに悩んでしまったのは内緒。



あとOfficeオートメーションを使うコードではCOMはちゃんと開放しないとけない。
参考:COM オブジェクトの参照カウントを解放する
KrdLab氏がGenericを使ってCOMオブジェクトの開放を楽にするComRefなるクラスを公開しているので使わせていただこうかな。
id:KrdLab:20070102