質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

31309閲覧

c#でExcelをOpenするとプロセスが残る(Microsoft.Office.Interop.Excel使用)

Ineda

総合スコア45

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2018/10/26 08:32

###環境
■ Windows7Pro 32bit
■ Visualstudio 2010 professional
■ Excel2016

経緯

私は普段.net環境からExcelを呼び出す場合にはClosedXMLを使用しています。
実務でCOMを使用したエクセルプロセス解放に悩まされたため、ライブラリを使用することに決めていました。

ただ、「突き詰めよう」との気持ちが突然芽生え、こちらのサイトにある方法を試してみる事にしました。

以下のサイトにCOMの正しい解放の仕方がアップされていました。
Excelファイルを C# と VB.NET で読み込む "正しい" 方法

リンク先のソースを参考に以下のソースを作成しました。
プロセスの確認はタスクマネージャーから行います。

■非define時
0. 100回ブックをオープンする
0. ブックを保存する

■define時
0. 100回ブックをオープンする。
0. 一番左端のセルにABCDEFを入力する
0. ブックを保存する

c#

1//#define __VALUE_SET__ 2 3using System; 4using System.IO; 5using System.Runtime.InteropServices; 6using Microsoft.Office.Interop.Excel; 7 8namespace ConsoleApplication1 9{ 10 class Program 11 { 12 13 14 15 static void Main(string[] args) 16 { 17 18 for (int i = 1; i<=100; i++) 19 { 20 int no = i % 6 + 1; 21 22 string fileName = Path.Combine(@"c:\sample", no.ToString() + ".xlsx"); 23 Console.WriteLine(fileName); 24 25 // エクセルオープン 26 OpenExcel(fileName); 27 } 28 } 29 30 31 32 33 private static void OpenExcel(string fileName) 34 { 35 var excelApplication = new Microsoft.Office.Interop.Excel.Application(); 36 37 try 38 { 39 Workbooks workbooks = excelApplication.Workbooks; 40 41 try 42 { 43 Workbook workbook = workbooks.Open(fileName); 44 45 try 46 { 47 Sheets worksheets = workbook.Sheets; 48 49 try 50 { 51 Worksheet worksheet = worksheets[1]; 52 53 try 54 { 55#if __VALUE_SET__ 56// Rangeを使用して値をセットするとプロセスが解放されない 57 58 Range range1 = worksheet.Cells[1, 1]; 59 60 try 61 { 62 range1.Value = "ABCDEFG"; 63 } 64 finally { Marshal.ReleaseComObject(range1); } 65#endif 66 67 workbook.Save(); 68 69 } 70 finally { Marshal.ReleaseComObject(worksheet); } 71 72 } 73 finally { Marshal.ReleaseComObject(worksheets); } 74 75 } 76 finally 77 { 78 if (workbook != null) 79 { 80 workbook.Close(false); 81 } 82 Marshal.ReleaseComObject(workbook); 83 } 84 } 85 finally { Marshal.ReleaseComObject(workbooks); } 86 } 87 finally 88 { 89 if (excelApplication != null) 90 { 91 excelApplication.Quit(); 92 } 93 94 Marshal.ReleaseComObject(excelApplication); 95 } 96 } 97 } 98}

問題 Rangeを使用して値をセットするとプロセスが解放されない

defineしている「VALUE_SET」の部分ですが、この部分を通るとプロセスが解放されずに残り続けます。
単純に開いて保存するだけであれば、プロセスは全て解放されています。

値設定時、何か私の方法が間違っているでしょうか?

詳しい方がいれば、ご教示お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

worksheet.Cells[1, 1]ですが

  1. worksheet.Cells→シートの全てのセルを示すRange
  2. シートの全てのセルの中の[1, 1]Range

worksheet.Cells[1, 1]の二つのRangeが隠れています。

このうち「シートの全てのセルを示すRange」の解放が漏れているのだと思われます。

Officeの解放周りについては以下の記事も参考になると思います。

Office オートメーションで割り当てたオブジェクトを解放する – Part1 – Japan Office Developer Support Blog

投稿2018/10/26 09:15

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ineda

2018/10/26 10:56

指摘された点修正したら、100回やってもプロセス漏れはありませんでした! あんたスゴイヨッ!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問