автоматизация c # и excel - завершение работающего экземпляра
Я пытаюсь автоматизировать Excel через C #. Я следовал всем инструкциям Microsoft о том, как это сделать, но я все еще изо всех сил пытаюсь отбросить окончательную ссылку (ссылки) на Excel, чтобы она закрылась и чтобы GC мог ее собрать.
Пример кода приведен ниже. Когда я закомментирую блок кода, который содержит строки, похожие на:
<code>Sheet.Cells[iRowCount, 1] = data["fullname"].ToString(); </code>
Затем файл сохраняется и Excel выходит. В противном случае файл сохраняется, но Excel остается запущенным как процесс. В следующий раз, когда этот код запускается, он создает новый экземпляр, и они в конечном итоге собираются.
Любая помощь приветствуется. Благодарю.
Это скелет моего кода:
<code> Excel.Application xl = null; Excel._Workbook wBook = null; Excel._Worksheet wSheet = null; Excel.Range range = null; object m_objOpt = System.Reflection.Missing.Value; try { // open the template xl = new Excel.Application(); wBook = (Excel._Workbook)xl.Workbooks.Open(excelTemplatePath + _report.ExcelTemplate, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); wSheet = (Excel._Worksheet)wBook.ActiveSheet; int iRowCount = 2; // enumerate and drop the values straight into the Excel file while (data.Read()) { wSheet.Cells[iRowCount, 1] = data["fullname"].ToString(); wSheet.Cells[iRowCount, 2] = data["brand"].ToString(); wSheet.Cells[iRowCount, 3] = data["agency"].ToString(); wSheet.Cells[iRowCount, 4] = data["advertiser"].ToString(); wSheet.Cells[iRowCount, 5] = data["product"].ToString(); wSheet.Cells[iRowCount, 6] = data["comment"].ToString(); wSheet.Cells[iRowCount, 7] = data["brief"].ToString(); wSheet.Cells[iRowCount, 8] = data["responseDate"].ToString(); wSheet.Cells[iRowCount, 9] = data["share"].ToString(); wSheet.Cells[iRowCount, 10] = data["status"].ToString(); wSheet.Cells[iRowCount, 11] = data["startDate"].ToString(); wSheet.Cells[iRowCount, 12] = data["value"].ToString(); iRowCount++; } DirectoryInfo saveTo = Directory.CreateDirectory(excelTemplatePath + _report.FolderGuid.ToString() + "\\"); _report.ReportLocation = saveTo.FullName + _report.ExcelTemplate; wBook.Close(true, _report.ReportLocation, m_objOpt); wBook = null; } catch (Exception ex) { LogException.HandleException(ex); } finally { NAR(wSheet); if (wBook != null) wBook.Close(false, m_objOpt, m_objOpt); NAR(wBook); xl.Quit(); NAR(xl); GC.Collect(); } private void NAR(object o) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(o); } catch { } finally { o = null; } } </code>Update
Независимо от того, что я пытаюсь, «чистый» способ или «уродливый»; метод (см. ответы ниже), экземпляр Excel по-прежнему зависает, как только эта строка нажата:
<code>wSheet.Cells[iRowCount, 1] = data["fullname"].ToString(); </code>
Если я прокомментирую эту строку (и другие аналогичные ниже, очевидно), приложение Excel завершится изящно. Как только одна строка выше не комментируется, Excel остается.
Я думаю, что мне нужно будет проверить, есть ли работающий экземпляр, до назначения переменной xl, и вместо этого подключиться к ней. Я забыл упомянуть, что это служба Windows, но это не имеет значения, не так ли?