Как загрузить новый экземпляр
Для определения, будет ли запущен новый экземпляр Excel.Application или присоединение к уже запущенному, используется свойство TExcelApplication.ConnectKind. По умолчанию это свойство имеет значение ckRunningOrNew (константы определены в unit OleServer). Однако рекомендуется, если нет на то особой надобности, всегда запускать новый экземпляр Excel.Application во избежание конфликтов с запущенным раннее экземпляром Excel.Application. Свойство TExcelApplication.AutoQuit в конструкторе устанавливается по умолчанию в False (только в модуле ExcelXP в True) — это значит, что если вы хотите при отсоединении завершить работу Excel (закрыть), то нужно вызвать метод TExcelApplication.Quit или установить свойство TExcelApplication.AutoQuit равным True.
Delphi:
var
XL: TExcelApplication; begin
// запускаем новый экземпляр Excel'я
XL := TExcelApplication.Create(nil); try
XL.ConnectKind := ckNewInstance; XL.Connect; // подключение
XL.AutoQuit := False; // по умолчанию это свойство True только в unit ExcelXP
XL.Visible[lcid] := True; // здесь работаем с Excel'ем
finally
// отсоединяемся
XL.UserControl := True; // отдадим управление пользователю
XL.Quit; // закрыть Excel
XL.Disconnect; FreeAndNil(XL); end;
C#:
private Excel.Application StartExcel(bool asNewInstance) { Excel.Application XL = null; if (!(asNewInstance)) { try { XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application; } catch { // XL = null; } } if (XL == null) XL = new Excel.Application(); if (XL.Workbooks.Count == 0) XL.Workbooks.Add(Type.Missing); XL.Visible = true; return XL; } private void FinishExcel(Excel.Application XL) { if (XL != null) { XL.ScreenUpdating = true; if (! XL.Interactive) XL.Interactive = true; XL.UserControl = true; if (XL.Workbooks.Count == 0) { XL.Quit(); } else { if (! XL.Visible) XL.Visible = true; XL.ActiveWorkbook.Saved = true; } // System.Runtime.InteropServices.Marshal.ReleaseComObject(XL); XL = null; GC.GetTotalMemory(true); // вызов сборщика мусора // Пока не закрыть приложение EXCEL.EXE будет висеть в процессах } }
How to automate Microsoft Excel from Microsoft Visual C# .NET
How to use Visual C# to automate a running instance of an Office program
GC.GetTotalMemory Method
GC Class