- PR -

既存Excelファイルの操作に関して

投稿者投稿内容
dai
会議室デビュー日: 2006/06/23
投稿数: 7
投稿日時: 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/02/09
投稿数: 78
投稿日時: 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/06/27
投稿数: 20
投稿日時: 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 ]
dai
会議室デビュー日: 2006/06/23
投稿数: 7
投稿日時: 2006-07-21 10:22
>カルガモさん、和也さん
ご返答ありがとうございます。
私の環境もC#2003です。
Excelのバージョンは2003で、Microsoft Excel 11.0 Object Library
を使用しています。

引数に関しては、一応コンパイルは通っています。
私の環境だと15個の引数が要求されています。
和也さんの環境で問題なく動くということは、私の環境設定に何か問題があるのかもしれません。(それが何かは見当つきませんが(^^;))
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-21 10:59
引用:

daiさんの書き込み (2006-07-21 10:22) より:

引数に関しては、一応コンパイルは通っています。私の環境だと15個の引数が要求されています。和也さんの環境で問題なく動くということは、私の環境設定に何か問題があるのかもしれません。(それが何かは見当つきませんが(^^;))


これについては、すでに書かれています。

引用:

Excel._Workbook book
Excel._Worksheet


なぜ、こちらの型を使われているのでしょうか?
素直に、Excel.Workbook, Excel.Worksheet を使えない理由があるのでしょうか?

引用:

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);


'sheet' と 'book' の参照カウントをデクリメントし忘れていますね。
このままでは、実行環境で メモリリーク を起こします。

引用:

さらに、SaveAsを使用する際、パラメータにExcel.XlSaveAsAxxessModeが必要とされますが、XlSaveAsAxxessModeがExcelにありませんと怒られてしまいます。


同環境ですが、Excel.XlSaveAsAccessMode.xlNoChange メンバで問題なく通ります。

引用:

Visible = trueにしているにも関わらず、Excelが表示されません。
また、値の挿入を行っても反映されません。


これは、どのように実行して確認されたのでしょうか?
この実装で、Excel アプリケーションが表示されないことはないと思います。
ブレーク ポイントを設定して、停止した状態で確認されたのでしょうか?

後者の "値の挿入を行っても反映されません" についてですが、
  • Excel アプリケーションが表示されない
  • Workbook を保存していない (Or 保存できない)
という状況なのですよね?

この状況で、どうやって確認されたのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
dai
会議室デビュー日: 2006/06/23
投稿数: 7
投稿日時: 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/06/27
投稿数: 20
投稿日時: 2006-07-21 11:37

>・同環境ですが、Excel.XlSaveAsAccessMode.xlNoChange メンバで問題なく通ります。
この部分に関しては、xlNoChangeを付加してもコンパイルが通りません。
あ、でもExcelにないとかではなくて、
「'System.web.UIWebControls.Button'に'XlSaveAsAccessMode'の定義がありません」
と怒られます。


ボタンコントロール名が
Excelになっていませんか?

Excelオブジェクトとかぶっている気がします。


[ メッセージ編集済み 編集者: カルガモ 編集日時 2006-07-21 11:38 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-21 12:20
引用:

daiさんの書き込み (2006-07-21 11:23) より:

「'System.web.UIWebControls.Button'に'XlSaveAsAccessMode'の定義がありません」と怒られます。


今回のコードを記述しているクラス内に 'Excel' というメンバがいるようですね。
this.Excel... と、コンパイラは解釈しています。

'System.web.UIWebControls.Button' の方の名前を変更するか、
Excel 名前空間を別名でインポートするかで回避できるでしょう。

引用:

値の挿入に関しては、
range.Value2 = "XXXX";
実行後に、ファイルを開いて確認したのみです。


これでは、確認できないですね。
この状況では確認しようがないと思うのです。

先に書かせて頂いたことが伝わっていないようですので、もっと噛み砕きます。
  • Excel が表示できない -> 実行時に確認できない
  • 保存できていない -> ファイルを開いて確認することができない
ということですから、"実行後に、ファイルを開いて確認" という行為に意味がありません。

本題の方は、名前の衝突を防ぐことで解決するかと思います。
あともう少し、頑張ってください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)