Я пытаюсь автоматизировать Excel через C #. Я следовал всем инструкциям Microsoft о том, как это сделать, но я все еще изо всех сил пытаюсь отбросить окончательную ссылку (и) в Excel, чтобы она закрылась, и чтобы GC мог ее собрать.
Ниже приведен пример кода. Когда я закомментирую блок кода, который содержит строки, похожие на:
Sheet.Cells[iRowCount, 1] = data["fullname"].ToString();
затем файл сохраняется и Excel выходит. В противном случае файл сохраняется, но Excel остается запущенным как процесс. В следующий раз, когда этот код запускается, он создает новый экземпляр, и они в конечном итоге собираются.
Любая помощь приветствуется. Спасибо.
Это скелеты моего кода:
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;
}
}
Обновление
Независимо от того, что я пытаюсь, «чистый» метод или «уродливый» метод (см. Ответы ниже), экземпляр Excel все еще зависает, как только эта строка нажата:
wSheet.Cells[iRowCount, 1] = data["fullname"].ToString();
Если я прокомментирую эту строку (и, очевидно, другие похожие ниже), приложение Excel завершит работу изящно. Как только одна строка выше не комментируется, Excel остается без изменений.
Я думаю, мне нужно будет проверить, есть ли работающий экземпляр, прежде чем присваивать переменную xl, и вместо этого подключиться к ней. Я забыл упомянуть, что это служба Windows, но это не должно иметь значения, не так ли?