- - PR -
既存Excelファイルの操作に関して
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-21 09:41
C#.NETの超初心者です。
既出のテーマではあるのですが、過去スレを調べても解決できませんでしたので投稿させて頂きました。 既存のExcelファイルを開き、値を挿入するというプログラムを書いているのですが、Visible = trueにしているにも関わらず、Excelが表示されません。 また、値の挿入を行っても反映されません。 さらに、SaveAsを使用する際、パラメータにExcel.XlSaveAsAxxessModeが必要とされますが、XlSaveAsAxxessModeがExcelにありませんと怒られてしまいます。名前空間の設定に何か問題があるのでしょうか? プログラムは以下のように書いています。 初歩の質問で申し訳ありませんが、何卒ご教授願えればと思います。 よろしくお願いします。 private void Excel_Click(object sender, System.EventArgs e) { Excel.Application xlApp = new Excel.Application(); Excel.Workbooks xlBooks; xlBooks = xlApp.Workbooks; Excel._Workbook book = xlBooks.Open("C:\\test2.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); //Excel表示を行う xlApp.Visible = true; //アクティブなシートを取得 Excel._Worksheet sheet = (Excel._Worksheet)book.ActiveSheet; //セルに値を貼り付け Excel.Range range = sheet.get_Range("A1", Type.Missing); range.Value2 = "XXXX"; book.Close(false, Type.Missing, Type.Missing); // Excel を終了する xlApp.Quit(); // COM オブジェクトを解放する System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); } | ||||||||||||||||||||
|
投稿日時: 2006-07-21 09:56
Excel._Workbook book = xlBooks.Open("C:\\test2.xls", Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); でコンパイル通りましたか? 私の環境はC#2003ですが、 引数が多すぎるって警告が出ます この部分を直すと素直にExcelが表示されてデータも書き込まれましたけど・。 | ||||||||||||||||||||
|
投稿日時: 2006-07-21 10:09
こんにちは。
開発環境ですが、 Excel 2000ですか それともExcel2002, 2003? Excelのバージョンによりメソッドの引数の数が違ったり、 型が変わっていたりします。 これはExcelの参照するライブラリのバージョンが異なるからなのですが、 Excel2000の場合は // Microsoft Excel 9.0 Library cBook.SaveAs(strFileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing); [ メッセージ編集済み 編集者: カルガモ 編集日時 2006-07-21 10:11 ] | ||||||||||||||||||||
|
投稿日時: 2006-07-21 10:22
>カルガモさん、和也さん
ご返答ありがとうございます。 私の環境もC#2003です。 Excelのバージョンは2003で、Microsoft Excel 11.0 Object Library を使用しています。 引数に関しては、一応コンパイルは通っています。 私の環境だと15個の引数が要求されています。 和也さんの環境で問題なく動くということは、私の環境設定に何か問題があるのかもしれません。(それが何かは見当つきませんが(^^;)) | ||||||||||||||||||||
|
投稿日時: 2006-07-21 10:59
これについては、すでに書かれています。
なぜ、こちらの型を使われているのでしょうか? 素直に、Excel.Workbook, Excel.Worksheet を使えない理由があるのでしょうか?
'sheet' と 'book' の参照カウントをデクリメントし忘れていますね。 このままでは、実行環境で メモリリーク を起こします。
同環境ですが、Excel.XlSaveAsAccessMode.xlNoChange メンバで問題なく通ります。
これは、どのように実行して確認されたのでしょうか? この実装で、Excel アプリケーションが表示されないことはないと思います。 ブレーク ポイントを設定して、停止した状態で確認されたのでしょうか? 後者の "値の挿入を行っても反映されません" についてですが、
この状況で、どうやって確認されたのでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-07-21 11:23
>じゃんぬねっとさん
書き込みありがとうございます。 やはり突っ込みどころが一杯でしたね。 ・Excel._Worksheet及びExcel._Workbookに関して これは色々調べていて、このように書いている方がいたので真似してみました。 特に深い意図は無いです。 先ほどExcel.Worksheetに直してみました。(状況は変わらずです) ・'sheet' と 'book' の参照カウントをデクリメントし忘れていますね。 すみません、失念していました。 ・同環境ですが、Excel.XlSaveAsAccessMode.xlNoChange メンバで問題なく通ります。 この部分に関しては、xlNoChangeを付加してもコンパイルが通りません。 あ、でもExcelにないとかではなくて、 「'System.web.UIWebControls.Button'に'XlSaveAsAccessMode'の定義がありません」 と怒られます。 ・この状況で、どうやって確認されたのでしょうか? ブレークポイントを設定した状態と、設定しない状況の両方です。 タスクマネージャで確認すると、Openした後プロセスは起動していました。 また、OpenからQuitの間は、ASPNETがファイルをロックしている状態でした。 ですので、まったく動いていないという訳ではなさそうなのです。 値の挿入に関しては、 range.Value2 = "XXXX"; 実行後に、ファイルを開いて確認したのみです。 状況はこのような感じです。 よろしくお願いします。 | ||||||||||||||||||||
|
投稿日時: 2006-07-21 11:37
>・同環境ですが、Excel.XlSaveAsAccessMode.xlNoChange メンバで問題なく通ります。 この部分に関しては、xlNoChangeを付加してもコンパイルが通りません。 あ、でもExcelにないとかではなくて、 「'System.web.UIWebControls.Button'に'XlSaveAsAccessMode'の定義がありません」 と怒られます。 ボタンコントロール名が Excelになっていませんか? Excelオブジェクトとかぶっている気がします。 [ メッセージ編集済み 編集者: カルガモ 編集日時 2006-07-21 11:38 ] | ||||||||||||||||||||
|
投稿日時: 2006-07-21 12:20
今回のコードを記述しているクラス内に 'Excel' というメンバがいるようですね。 this.Excel... と、コンパイラは解釈しています。 'System.web.UIWebControls.Button' の方の名前を変更するか、 Excel 名前空間を別名でインポートするかで回避できるでしょう。
これでは、確認できないですね。 この状況では確認しようがないと思うのです。 先に書かせて頂いたことが伝わっていないようですので、もっと噛み砕きます。
本題の方は、名前の衝突を防ぐことで解決するかと思います。 あともう少し、頑張ってください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |