プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております

只今C#でExcelファイルを出力するプログラムを作成しています。
以前やり方が分からずここに質問し、なんとかExcelに出力できるようになったのですが
Excelのバージョンが2007にしか対応していないことが分かり
遅延バインディング仕様に作り変えている最中です。

ところが、あと少しというところでクリアできない問題が2つ出てきたので、質問させていただきます。

1つは枠線を引く処理です。現在以下のように記述していますが
どうしても例外が発生してしまいます(0x800A03EC)

Type line = Type.GetTypeFromProgID("Excel.XlLineStyle.xlContinuous");
Type insidevertical = Type.GetTypeFromProgID("Excel.XlBordersIndex.xlInsideVertical");
Object tempA = objRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, objRange, null);
Object tempB = tempA.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, tempA, new object[] { insidevertical });
tempB.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, tempB, new object[] { line });

これがどう解決していいかわかりません・・・
遅延バインディングという手法も最近知ったばかりで、見よう見まねという状況です。


2つ目は、ファイル保存時の拡張子です。
現在は以下のように記述しています
(問題なく動作はしてくれます)

object[] mySave ={strFileName,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing};
objBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, objBook, mySave);


以前はこのようにしていました
objBook.SaveAs(strFileName,
     Excel.XlFileFormat.xlExcel8,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Excel.XlSaveAsAccessMode.xlNoChange,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing,
     Type.Missing);

保存する拡張子をxlsに統一したいのですが、遅延にした場合のファイル形式の指定方法がわかりません
Type.Missingにすると、実行環境にあるものに合わせた拡張子で保存されてしまい
Excel2007を使用している環境ではxlsxのファイルを作ってしまいます。
Type exFormat = Type.GetTypeFromProgID("Excel.XlFileFormat.xlExcel8");
のような感じで使えるかとも思ったのですが、できませんでした。。

わかる方がいましたら、よろしくお願いします。

開発環境
  Vista
  VisualStudio2008
  .NET Framework 3.5

A 回答 (2件)

Excel 2000/XP/2003には,xlExcel8 (=56) は存在せず,xlWorkbookNormal (=-4143) を使います。


遅延バインドするのであれば,整数値をそのまま付けばよいです。
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます
拡張子の問題が解決しました!
数値での指定ができるとは驚きです。
本当にありがとうございます!

あとは枠線・・・

補足なのですが、枠線指定の部分は
Type.GetTypeFromProgID("Excel.XlLineStyle.xlContinuous");
などの部分がどうやらnullとして返されてるようです。
そのあたりが解決すれば上手く引けそうな気がします・・・
ここらへんも数値で指定とかができるのでしょうか?

お礼日時:2009/09/16 16:33

事前バインディング時に列挙型になっている物は,整数型として扱えます。



私が現在やっているプロジェクトでは,
・インターフェイス用のプロジェクト
 ・ここにIApplicationやIWorkbookといった,バージョンに依存せず使うためのインターフェース
 ・共通で使うための列挙型 (2007のPIAからリフレクションで取得)
・各バージョン用のプロジェクト
 ・各バージョンのIAやPIAへの参照を持つ
 ・インターフェイス用のプロジェクトのインターフェイスを実装。内部はほぼIA/PIAへの委譲のみ
 ・列挙値は名前を使って変換
 ・パラメータが必要数より多い場合は無視
・全体をとりまとめるためのプロジェクト
 ・バージョンチェックを遅延バインディングで実行
 ・バージョンによって,各バージョン用のプロジェクトをリフレクションで実行時ロード
という方法を使っています。
各バージョン用の物がコピペになるのが悲しいのですが,バージョンごとの差異も吸収できるので,実用にならない,ということはないと思います。
どちらかというと,それだけのバージョンのExcelを入手できるかにかかってきますが……。
    • good
    • 0
この回答へのお礼

2度も回答ありがとうございます。
整数を調べて実装したら無事動くようになりました!
思わず万歳しそうになりましたw

なるほど、そういうふうに分けて利用する方法もあるのですね
今度試してみて、部品化出来るようにしていけたらと思います。
でも、遅延バインディングを選択せずにExcelを扱う必要がある時っていうのはどういう時なのでしょうか?
今回のことで遅延万歳状態になりつつあるのですがw
メリットやデメリットなんかも教えてもらえるとうれしいです。

Excelにもいろいろとバージョンがあるんですよね、まだ把握しきれていないので、今回の壁にぶつかったことで色々と目が覚めました。
少しずつ色々なことが出来るようになると本当にプログラミングは楽しいですね。
これからもがんばります。

ありがとうございました!

お礼日時:2009/09/16 20:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!