Приветствую!
Экспортирую данные из DataGridView в Excel. И столкнулся со следующими проблемами:
- Если Excel не активирован, то иногда при попытке запуска возникает исключение с кодом 0x800AC472
“Исключение из HRESULT: 0x800AC472”.
Нашел решение, заключающееся в циклических попытках запуска, пока не запустится нормально. Но очень похоже на костыль. Может кто-нибудь знает, как по-человечески сделать?
bool completed = false;
do
{
Microsoft.Office.Interop.Excel.Application xlApp = null;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook = null;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet = null;
try
{
this.ArtDBView.SelectAll();
DataObject dataObj = this.ArtDBView.GetClipboardContent();
if (dataObj != null)
{
Clipboard.SetDataObject(dataObj);
}
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = false;
xlApp.Interactive = false;
Object misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.EnableSelection = Microsoft.Office.Interop.Excel.XlEnableSelection.xlNoSelection;
Microsoft.Office.Interop.Excel.Range cells = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[1, 1];
cells.Select();
xlWorkSheet.PasteSpecial(cells, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
//Autofit all columns
xlWorkSheet.Cells.EntireColumn.AutoFit();
xlApp.Visible = true;
xlApp.Interactive = true;
completed = true;
}
catch (Exception exp)
{
completed = false;
}
finally
{
if (xlWorkSheet != null)
{
this.ReleaseObject(xlWorkSheet);
}
if (xlWorkBook != null)
{
this.ReleaseObject(xlWorkBook);
}
if (xlApp != null)
{
this.ReleaseObject(xlApp);
}
}
} while (completed != true);
- После закрытия окна с Excel остается непонятный зомби-процесс Excel в процессах.
В коде, отвечающем за открытие Excel в блоке finally есть освобождение ресурсов. Но не помогает. Код метода освобождения ресурсов.
private void ReleaseObject(Object Obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(Obj);
}
finally
{
Obj = null;
GC.Collect();
}
}