C#でのEXCEL出力に関して(C・C++のQ&A)

解決済みの質問

C#でのEXCEL出力に関して

教えて下さい。

C#でEXCELシートにデータを出力していますが、その際に以下のような記述をした場合、
EXCELファイルは作成されるものの、そのファイルをダブルクリックで開こうとすると、
EXCELの枠だけ表示され、中身のシートが表示されない現象となってしまいます。

それらしきオブジェクトはすべて開放しているつもりですが、その事象を解決できません。

どこがおかしいか教えて頂きたいと思います。

記述に過不足あればご指摘下さい。

尚、環境は、WindowsXP Office2000-EXCEL です。


《記述内容》

//////////////////////////////////
//ここからエクセルシートへの転記//
//////////////////////////////////
Excel.Application objExcel = null;
Excel.Workbooks objBooks = null;
Excel.Workbook objBook = null;
Excel.Worksheet sheet = null;
Excel.Range range1 = null;
Excel.Range range2 = null;
Excel.Range range3 = null;

//ExcelのCOMオブジェクトの生成
objExcel = new Excel.Application();

//Excelを表示する設定
//objExcel.Visible = isVisible;

//ワークブックの集合体取得
objBooks = objExcel.Workbooks;

//ブックの新規作成
objBook = objBooks.Add(Missing.Value);

//シートを取得
sheet = (Excel.Worksheet)objBook.Sheets.get_Item(1);

//Rangeを取得
range1 = (Excel.Range)sheet.Cells[1, 1];
range2 = (Excel.Range)sheet.Cells[1, 2];

//文字列を設定
//ヘッダ書き込み
range1.Value = "仕入先名";
range2.Value = "図面番号";


//エクセルシート側の行数カウント変数
int rcount = 2;
//データテーブル側の行数カウント変数
int tcount = 0;

for (tcount = 0; tcount < mst_cnt;tcount++ )
{
range1 = (Excel.Range)sheet.Cells[rcount, 1];
range2 = (Excel.Range)sheet.Cells[rcount, 2];

range1.Value = 仕入先名[tcount];
range2.Value = 図面番号[tcount];

rcount++;
}

//エクセルシート削除
DeleteFile(@"c:\\" + h_no + ".xls");


//エクセルシート生成
objBook.SaveAs(
"c:\\" + h_no + ".xls",
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
0,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value
);

//COMオブジェクト解放
Marshal.ReleaseComObject(range1);
Marshal.ReleaseComObject(range2);

//COMオブジェクトの開放(必須)
Marshal.ReleaseComObject(objBook);
objBook = null;

Marshal.ReleaseComObject(sheet);
sheet = null;

Marshal.ReleaseComObject(objBooks);
objBooks = null;

//System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
objExcel.Quit();
Marshal.ReleaseComObject(objExcel);
objExcel = null;
//objExcel.Quit();


return;

}

よろしくお願いします。

投稿日時 - 2011-05-25 09:25:34

連想キーワード:

QNo.6762050

すぐに回答ほしいです

質問者が選んだベストアンサー

>range1.Value = 仕入先名[tcount];
>range2.Value = 図面番号[tcount];

の部分がエラーになるので

range1.Value = tcount;
range2.Value = tcount;

に変更し、

>DeleteFile



System.IO.File.Delete

に変更して試してみましたが、こちらの環境 ( Windows XP、VS 2008、Excel 2000 ) では再現できませんでした。
どこか別の関数とかで Excel の開放ができていないとか?
タスクマネージャのプロセスタブを監視しながら動作させてみてはいかがでしょうか。

投稿日時 - 2011-05-26 22:08:54

補足

ご回答ありがとうございます!

早速、教えて頂いた内容の通り記述してみましたが、結果は同じでした。

確かにタスクマネージャのプロセスは、EXCEL.EXEが残ったままです。

何か開放忘れでしょうか。。。

申し訳ありません。

もう少し教えて頂きたいと思います。

投稿日時 - 2011-05-27 09:40:34

ANo.2

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(1件中 1~1件目)

ANo.1

なんだか不可解な現象ですけど、出力したファイルを開こうとしたときに、ガベージコレクトされずにメモリ上に残っていた Excel がアクティブになると問題の現象が起きるようです。
xls に出力した後で、メモリ上に残っている Excel をタスクマネージャで強制的に終了させると、この現象は起きないと思います。
とりあえず、

>objExcel.Quit();
>Marshal.ReleaseComObject(objExcel);
>objExcel = null;

の後に

GC.Collect();

を入れてみてはいかがでしょうか。

投稿日時 - 2011-05-25 23:29:43

補足

ご回答ありがとうございます!

ご指摘頂いたように記述したら正しく起動するようになりました。

但し、もう1点、上記の記述をした場合、プログラムが起動している
最中はどうしても正しく開きません。(今までと同じ現象)

起動している最中は、何か掴んでいるのでしょうか???

教えて頂ければ幸いです。

よろしくお願いします。

投稿日時 - 2011-05-26 15:34:55

この質問に関連するQ&A
  • [ExcelVBA] objExcel.Sheetsのような感じで、o...
  • objExcelにオブジェクトがある状態で、 objExcel.Sheets(1).cells(1,1) でセルの情報が取得できます。 これと同じような感じで、マクロを作動させることはできるのでしょ...
  • VB.NET EXCEL
  • 下記のコードで、アプリケーション実行中 EXCELが起動したままになり アプリケーション終了時に、EXCELも一緒に終了する という、タスクマネージャーに残るという動作になります。 どこの COM...
  • vbs 文字位置を中央に
  • vbscriptでエクセルファイルへ出力するスクリプトを作成しています。 エクセルファイルのセルに文字列を入力し、文字を中央揃えにしたいのですが、うまくいきません。 ----------------...
合わせてチェックしたい
PR

OKWaveのオススメ