###環境
■ 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」の部分ですが、この部分を通るとプロセスが解放されずに残り続けます。
単純に開いて保存するだけであれば、プロセスは全て解放されています。
値設定時、何か私の方法が間違っているでしょうか?
詳しい方がいれば、ご教示お願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 10:56