Excel ЧаВо


Как загрузить новый экземпляр


Для определения, будет ли запущен новый экземпляр 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



Содержание раздела