Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не закрывается TExcelApplication 
V
    Опции темы
Garmahis
Дата 3.10.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Мне надо считать данные с нескольких страниц экселевского файла. Я делаю это так:
Код

var
  APP:TExcelApplication;
  WorkBk : _WorkBook;
  WorkSheet : _WorkSheet;
begin
  if (dlgOpenFile.Execute) and (dlgOpenFile.FileName<>'') then
  begin
    APP:=TExcelApplication.Create(Self);
    APP.Workbooks.Add(dlgOpenFile.FileName,0);
    APP.Connect;
    APP.DisplayAlerts[0] := False;
    WorkBk := APP.WorkBooks.Item[1];
    memAccLoader.First;
    WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
   // Дальше я в цикле считываю данные
    APP.Quit;
    APP.Disconnect;
    APP.Free;
end;

Счтитывается всё нормально. Но закрывается всё по видимому не корректно потому что после закрытия программы если запустить эксель то автоматически открываются все открытые в программе файлы. И если открываешь два разных файла то вместо второго упрямо грузится первый открытый файл. Подскажите плиз как правильно мне всё закрывать?
PM   Вверх
volvo877
Дата 3.10.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Закрывается все как раз корректно (проверено на D2007 + Office XP - в момент открытия файла EXCEL.EXE, естественно появляется в списке процессов, после выполнения Disconnect он оттуда исчезает...)

Смотри свой код чтения данных, возможно там что-то "держит" процесс?
PM MAIL   Вверх
Garmahis
Дата 3.10.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



ну вот вся процедура только она длинновата.
Код

procedure TTableAccLoader.acOpenFileClientExecute(Sender: TObject);
var
  APP:TExcelApplication;
  WorkBk : _WorkBook; 
  WorkSheet : _WorkSheet;
  s:String;
  i: Integer;
  Err, Flag:Boolean;
begin
  memAccLoader.Active:=False;
  memBankLoader.Active:=False;
  memNostra.Active:=False;
  memWrong.Active:=False;
  memAccLoader.Active:=True;
  memBankLoader.Active:=True;
  memNostra.Active:=True;
  memWrong.Active:=True;
  if (dlgOpenFile.Execute) and (dlgOpenFile.FileName<>'') then
  begin
    APP:=TExcelApplication.Create(Self);
    APP.Workbooks.Add(dlgOpenFile.FileName,0);
    APP.Connect;
    APP.DisplayAlerts[0] := False;
    WorkBk := APP.WorkBooks.Item[1];
    memAccLoader.First;
    WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
    i:=3;
    Flag:=true;
    Application.ProcessMessages;
    while Flag do
    begin
      Inc(i);
      s:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      if s='' then Break;
      memAccLoader.Insert;
      memAccLoader.FieldByName('Number').AsInteger:=StrToInt(s);
      memAccLoader.FieldByName('Name').AsString:=Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value;
      memAccLoader.FieldByName('AccNumber').AsInteger:=Worksheet.Range['C'+IntToStr(i),'C'+IntToStr(i)].Value;
      memAccLoader.FieldByName('BalNumber').AsInteger:=20002;
      memAccLoader.FieldByName('usd').AsCurrency:=Worksheet.Range['L'+IntToStr(i),'L'+IntToStr(i)].Value;
      memAccLoader.FieldByName('rur').AsCurrency:=Worksheet.Range['M'+IntToStr(i),'M'+IntToStr(i)].Value;
      memAccLoader.FieldByName('eur').AsCurrency:=Worksheet.Range['N'+IntToStr(i),'N'+IntToStr(i)].Value;
      memAccLoader.FieldByName('jpy').AsCurrency:=Worksheet.Range['O'+IntToStr(i),'O'+IntToStr(i)].Value;
      memAccLoader.FieldByName('byr').AsCurrency:=Worksheet.Range['P'+IntToStr(i),'P'+IntToStr(i)].Value;
      memAccLoader.FieldByName('dem').AsCurrency:=Worksheet.Range['Q'+IntToStr(i),'Q'+IntToStr(i)].Value;
      memAccLoader.FieldByName('gbp').AsCurrency:=Worksheet.Range['R'+IntToStr(i),'R'+IntToStr(i)].Value;
      memAccLoader.FieldByName('lvl').AsCurrency:=Worksheet.Range['S'+IntToStr(i),'S'+IntToStr(i)].Value;
      memAccLoader.FieldByName('chf').AsCurrency:=Worksheet.Range['T'+IntToStr(i),'T'+IntToStr(i)].Value;
      memAccLoader.FieldByName('czk').AsCurrency:=Worksheet.Range['U'+IntToStr(i),'U'+IntToStr(i)].Value;
      memAccLoader.FieldByName('aud').AsCurrency:=Worksheet.Range['V'+IntToStr(i),'V'+IntToStr(i)].Value;
      memAccLoader.FieldByName('zar').AsCurrency:=Worksheet.Range['W'+IntToStr(i),'W'+IntToStr(i)].Value;
      memAccLoader.FieldByName('cyp').AsCurrency:=Worksheet.Range['X'+IntToStr(i),'X'+IntToStr(i)].Value;
      memAccLoader.Post;
    end;
    WorkSheet := WorkBk.WorkSheets.Get_Item(4) as _WorkSheet;
    i:=2;
    Flag:=true;
    while Flag do
    begin
      Inc(i);
      Err:=False;
      s:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      if s='' then Break;
      memAccLoader.Insert;
      memAccLoader.FieldByName('Number').AsInteger:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      memAccLoader.FieldByName('Name').AsString:=Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value;
      memAccLoader.FieldByName('AccNumber').AsInteger:=Worksheet.Range['C'+IntToStr(i),'C'+IntToStr(i)].Value;
      try
        memAccLoader.FieldByName('BalNumber').AsInteger:=Worksheet.Range['D'+IntToStr(i),'D'+IntToStr(i)].Value;
      except
        memLog.Lines.Add('Неверный номер Балансового счёта у '+Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value);
        Err:=True;
      end;
      memAccLoader.FieldByName('usd').AsCurrency:=Worksheet.Range['E'+IntToStr(i),'E'+IntToStr(i)].Value;
      memAccLoader.FieldByName('rur').AsCurrency:=Worksheet.Range['F'+IntToStr(i),'F'+IntToStr(i)].Value;
      memAccLoader.FieldByName('eur').AsCurrency:=Worksheet.Range['G'+IntToStr(i),'G'+IntToStr(i)].Value;
      memAccLoader.FieldByName('jpy').AsCurrency:=Worksheet.Range['H'+IntToStr(i),'H'+IntToStr(i)].Value;
      memAccLoader.FieldByName('byr').AsCurrency:=Worksheet.Range['I'+IntToStr(i),'I'+IntToStr(i)].Value;
      memAccLoader.FieldByName('dem').AsCurrency:=Worksheet.Range['J'+IntToStr(i),'J'+IntToStr(i)].Value;
      memAccLoader.FieldByName('gbp').AsCurrency:=Worksheet.Range['K'+IntToStr(i),'K'+IntToStr(i)].Value;
      memAccLoader.FieldByName('lvl').AsCurrency:=Worksheet.Range['L'+IntToStr(i),'L'+IntToStr(i)].Value;
      memAccLoader.FieldByName('chf').AsCurrency:=Worksheet.Range['M'+IntToStr(i),'M'+IntToStr(i)].Value;
      memAccLoader.FieldByName('czk').AsCurrency:=Worksheet.Range['N'+IntToStr(i),'N'+IntToStr(i)].Value;
      memAccLoader.FieldByName('aud').AsCurrency:=Worksheet.Range['O'+IntToStr(i),'O'+IntToStr(i)].Value;
      memAccLoader.FieldByName('zar').AsCurrency:=Worksheet.Range['P'+IntToStr(i),'P'+IntToStr(i)].Value;
      memAccLoader.FieldByName('cyp').AsCurrency:=Worksheet.Range['Q'+IntToStr(i),'Q'+IntToStr(i)].Value;
      if not Err then
        memAccLoader.Post
      else
        memAccLoader.Delete;
    end;
    WorkSheet := WorkBk.WorkSheets.Get_Item(2) as _WorkSheet;
    i:=2;
    Flag:=true;
    while Flag do
    begin
      Inc(i);
      s:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      if s='' then Break;
      memBankLoader.Insert;
      memBankLoader.FieldByName('Name').AsString:=Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value;
      memBankLoader.FieldByName('Acc').AsString:=Worksheet.Range['C'+IntToStr(i),'C'+IntToStr(i)].Value;
      memBankLoader.FieldByName('SWIFT').AsString:=Worksheet.Range['D'+IntToStr(i),'D'+IntToStr(i)].Value;
      memBankLoader.FieldByName('BIC').AsInteger:=Worksheet.Range['E'+IntToStr(i),'E'+IntToStr(i)].Value;
      memBankLoader.FieldByName('Address').AsString:=Worksheet.Range['I'+IntToStr(i),'I'+IntToStr(i)].Value;
      memBankLoader.FieldByName('Mail').AsString:=Worksheet.Range['H'+IntToStr(i),'H'+IntToStr(i)].Value;
      memBankLoader.FieldByName('City').AsString:=Worksheet.Range['J'+IntToStr(i),'J'+IntToStr(i)].Value;
      memBankLoader.FieldByName('Country').AsString:=Worksheet.Range['K'+IntToStr(i),'K'+IntToStr(i)].Value;
      memBankLoader.Post;
    end;
    WorkSheet := WorkBk.WorkSheets.Get_Item(3) as _WorkSheet;
    i:=2;
    Flag:=true;
    while Flag do
    begin
      Inc(i);
      s:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      if s='' then Break;
      memNostra.Insert;
      memNostra.FieldByName('Name').AsString:=Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value;
      memNostra.FieldByName('Acc').AsString:=Worksheet.Range['C'+IntToStr(i),'C'+IntToStr(i)].Value;
      memNostra.FieldByName('INN').AsString:=Worksheet.Range['D'+IntToStr(i),'D'+IntToStr(i)].Value;
      memNostra.FieldByName('KPP').AsString:=Worksheet.Range['E'+IntToStr(i),'E'+IntToStr(i)].Value;
      memNostra.FieldByName('OpenDate').AsDateTime:=Worksheet.Range['F'+IntToStr(i),'F'+IntToStr(i)].Value;
      memNostra.FieldByName('Currency').AsString:=Worksheet.Range['G'+IntToStr(i),'G'+IntToStr(i)].Value;
      memNostra.FieldByName('Dest').AsString:=Worksheet.Range['H'+IntToStr(i),'H'+IntToStr(i)].Value;
      memNostra.FieldByName('BalAcc').AsString:=Worksheet.Range['J'+IntToStr(i),'J'+IntToStr(i)].Value;
      memNostra.FieldByName('Bal').AsString:=Worksheet.Range['K'+IntToStr(i),'K'+IntToStr(i)].Value;
      memNostra.FieldByName('SWIFT').AsString:=Worksheet.Range['L'+IntToStr(i),'L'+IntToStr(i)].Value;
      memNostra.FieldByName('BIC').AsString:=Worksheet.Range['M'+IntToStr(i),'M'+IntToStr(i)].Value;
      memNostra.Post;
    end;
    WorkSheet := WorkBk.WorkSheets.Get_Item(5) as _WorkSheet;
    i:=1;
    Flag:=true;
    while Flag do
    begin
      Inc(i);
      s:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      if s='' then Break;
      memWrong.Insert;
      memWrong.FieldByName('Number').AsInteger:=Worksheet.Range['B'+IntToStr(i),'B'+IntToStr(i)].Value;
      memWrong.FieldByName('TheDate').AsDateTime:=Worksheet.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value;
      memWrong.FieldByName('BankBik').AsString:=Worksheet.Range['C'+IntToStr(i),'C'+IntToStr(i)].Value;
      memWrong.FieldByName('Amount').AsCurrency:=Worksheet.Range['I'+IntToStr(i),'I'+IntToStr(i)].Value;
      memWrong.FieldByName('Currency').AsString:=Worksheet.Range['K'+IntToStr(i),'K'+IntToStr(i)].Value;
      memWrong.FieldByName('Details').AsString:=Worksheet.Range['L'+IntToStr(i),'L'+IntToStr(i)].Value;
      memWrong.FieldByName('NostroName').AsString:=Worksheet.Range['E'+IntToStr(i),'E'+IntToStr(i)].Value;
      memWrong.FieldByName('NostroNumber').AsString:=Worksheet.Range['F'+IntToStr(i),'F'+IntToStr(i)].Value;
      memWrong.FieldByName('Sender').AsString:=Worksheet.Range['G'+IntToStr(i),'G'+IntToStr(i)].Value;
      memWrong.FieldByName('SenderAcc').AsString:=Worksheet.Range['H'+IntToStr(i),'H'+IntToStr(i)].Value;
      memWrong.Post;
    end;
    APP.Quit;
    APP.Disconnect;
    APP.Free;
  end;
end;

PM   Вверх
Albinos_x
Дата 4.10.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



здесь у тебя ошибка:
Цитата(Garmahis @  3.10.2008,  11:05 Найти цитируемый пост)
...
APP.Workbooks.Add(dlgOpenFile.FileName,0);   
 APP.Connect;
...

эти две строчки местами поменяй
после строчки
Цитата(Garmahis @  3.10.2008,  11:05 Найти цитируемый пост)
APP:=TExcelApplication.Create(Self);

поставь AutoConnect и AutoQuit в False
ConnectKind приведи к NewInstanse, т.к. удержание может проводить и не твоё приложение, а также это избавит от бага, проявление которого приведёт к тому, что если пользователь уже работает при запуске процедуры с Excel, и этот эксель тоже закроется... что будет не очень приятно... осоенно если данные не сохранены


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Данкинг
Дата 4.10.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



А зачем так сложно подключаться к Excel? Куда проще нечто вроде:

Код

var 
ex:variant;
...

ex:=createoleobject('excel.application');
ex.visible:=false;
Ex.DisplayAlerts:=False;
ex.Workbooks.open('d:\aaa.xls');
...
ex.application.quit;
ex:=unassigned;




--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Garmahis
Дата 8.10.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Большое спасибо!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.