#excel #delphi #ole
#excel #delphi #ole
Вопрос:
Я пытаюсь сохранить данные в приложении Delphi в виде excel-файла. Я использую OLEObject, но проблема в том, что процесс Excel остается открытым.
Мне нужны дополнительные листы, и в зависимости от того, как я их добавлю, процесс будет закрыт или нет. Смотрите код.
Процессы Excel всегда будут закрыты после того, как я закрою свое приложение (но не раньше). В чем проблема с версией кода 1?
Кстати. Я использую Delphi 10.2.3 и Excel 2010, Windows 7
var
lExcel : OLEVariant;
lMyWorkbook : OLEVariant;
lMyWorkSheets : OLEVariant;
begin
try
lExcel := CreateOleObject('Excel.Application');
except
exit;
end;
lExcel.visible := true;
lMyWorkbook := lExcel.Workbooks.Add;
lMyWorkSheets := lMyWorkbook.WorkSheets;
//adding another worksheet
//version1 - insert at the end of the list
//the excel process stays open after quit
lMyWorkSheets.Add( After:=lMyWorkbook.Worksheets[ lMyWorkSheets.Count ] );
//version2 - insert before active worksheet
//the excel process will be closed after quit
lMyWorkSheets.Add;
lMyWorkSheets:=unassigned;
lMyWorkbook.Close;
lMyWorkbook:=unassigned;
lExcel.Quit;
lExcel:=unassigned;
end;
Комментарии:
1. Черт возьми, я не могу воспроизвести проблему. Я использую Delphi XE7, Excel 2007 и Win 7
2. Я также тестировал с Excel 2013 и столкнулся с той же проблемой, поэтому я предполагаю, что более новая версия Delphi вызывает эту проблему.
Ответ №1:
Методом проб и ошибок я узнал, как решить мою проблему:
Вместо
lMyWorkSheets.Add( After:=lMyWorkbook.Worksheets[ lMyWorkSheets.Count ] );
который был адаптирован из справки MS VBA
(https://learn.microsoft.com/de-de/office/vba/api/excel.sheets.add )
Я должен использовать
LastWorkSheet := lMyWorkbook.Worksheets[ lMyWorkSheets.Count ];
lMyWorkSheets.Add( After := LastWorkSheet );