私はwinformアプリケーションでExcelプロセスを終了しようとしています。私は、SOや他のサイト上の記事の多くを経ており、これは私が今やっているものです:最初のインスタンスを除くすべてのExcelプロセスを閉じることができます
private void lsvSelectedQ_SelectedIndexChanged(object sender, EventArgs e)
{
FillSelectedItems();
}
private void FillSelectedItems()
{
string filepath = string.Empty;
string reportname = lblreportname.Text;
filepath = Application.StartupPath + "\\StandardReports\\" + reportname + ".xls";
Microsoft.Office.Interop.Excel.Application xlApp;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(filepath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
List<string> WorksheetList = new List<string>();
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item("Config");
Microsoft.Office.Interop.Excel.Range objRange = null;
objRange = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[6, 2];
if (objRange.Value != null)
{
int intSheet = Convert.ToInt32(objRange.Value);
for (int i = 0; i < intSheet; i++)
{
objRange = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[6, 3+i ];
if (objRange.Value != null)
{
lsvSelectedQ.Items.Add(Convert.ToString(objRange.Value));
}
}
}
ReleaseMyExcelsObjects(xlApp, xlWorkBook, xlWorkSheet);
}
を上記のコードでは、私はタスクバーにExcelのプロセスを実行しているのを取り除くためにReleaseMyExcelsObjects
メソッドを使用しています。あなたが見ることができるように
private void ReleaseMyExcelsObjects(Microsoft.Office.Interop.Excel.Application xlApp, Microsoft.Office.Interop.Excel.Workbook xlWorkBook, Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet)
{
xlApp.DisplayAlerts = false;
xlWorkBook.Save();
xlWorkBook.Close();
xlApp.DisplayAlerts = false;
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlWorkSheet = null;
xlWorkBook = null;
xlApp = null;
GC.Collect();
}
私はSelectedIndexChanged
上でExcelを開いて、私はまた、ReleaseMyExcelsObjects()
メソッドを介してプロセスをクローズしようとしていますし、それが生成された最初のExcelのプロセスを除いて動作します。つまり、イベントが起動され、Excelプロセスが開始され、ReleaseMyExcelsObjects()
は終了しませんが、もう一度SelectedIndexChanged
が起動され、別のExcelプロセスが開始されます。今回はReleaseMyExcelsObjects()
がこの2番目のExcelプロセスを終了します。しかし、最初にSelectedIndexChangedイベントが発生したときに開始された最初のExcelプロセスは決して閉じられません。
EDIT:
私は仕事を得ている答え自分を掲載しています。しかし、誰かがより良い解決策を思いつく場合に備えて、この質問を開いておくつもりです。 アプリケーションがを終了すると、あなたのC#の私の理解から
しかし、上記のコードは、Excelアプリケーションを閉じている各と毎回 'FillSelectedItems() 'が呼び出されます。最初の時間を除く毎回。 – Arbaaz
これは終了呼び出しを行いますが、C#アプリケーションが終了するまで適用されません。FillSelectedItems()を複数回呼び出すことで、タスクバーでチェックすることができます。各コールの後に新しい「Excel」プロセスが表示されます。 – Innat3
'FillSelectedItems()'が呼び出され、Excelプロセスのインスタンスが開始されるたびに。イベントが3回発生した場合、タスクマネージャには3つのExcelプロセスが存在しますが、ReleaseMyExcelsObjectsは毎回新しいインスタンスを閉じます。初めての場合を除きます。 (アプリケーションを終了する必要はありません) – Arbaaz