Delphi как отключить excel

Цитата
Сообщение от qwertehok
Посмотреть сообщение

у нас есть такая тема
Delphi + Excel

да, спасибо за ссылку, я как раз эту тему уже выкурил, теперь заполняю более корректно одним запросом:

Delphi
1
2
3
4
5
6
7
Excel.Range['A1','A1'].Select;
               Excel.ActiveSheet.Hyperlinks.Add(
               Anchor:=Excel.Selection,
               Address:='http://....',
               ScreenTip:='http://....',
               TextToDisplay:='Go to http://....'
               );

все равно вызов самого Hyperlinks.Add вызывает висюк…

из модуля Excell2000 вот такой конструктор достал:

Delphi
1
2
function Add(const Anchor: IDispatch; const Address: WideString; SubAddress: OleVariant; 
                 ScreenTip: OleVariant; TextToDisplay: OleVariant): IDispatch; dispid 181;

если указать на ненужных мне параметрах EmptyParam то на прохождении по этому конструктору вылетает «сохранить изменения?» — прерывается работа.

Добавлено через 28 минут
в чем же дело…. если закрыть свою программу экземпляр экселя тоже умирает в диспетчере….

Добавлено через 7 минут
и еще, может натолкнет на мысль… если открыть файл экселем и закрыть его, он пропадает из диспетчера при работающей далее программе вызвавшей его.

Добавлено через 40 минут
В общем остановился на приемлемом варианте

Delphi
1
2
3
4
5
6
7
8
9
   try
        Excel :=GetActiveOleObject('Excel.Application');
   except
        try
          Excel :=CreateOleObject('Excel.Application');
        except
          raise Exception.Create('Ошибка запуска Excel');
        end;
   end;

выходит что в любой момент времени остается висеть только один экземпляр экселя. Убивается он если открыть документ самим экселем и закрыть его, либо закрыть вызвавшую его программу.

Как-бы один экземпляр висюка еще можно потерпеть в ОЗУ. Почитав Василия Корнякова «Программирование документов и приложений MS Office в Delphi » понял что я делаю все правильно, это видимо лаг самого офиса, и не факт что он повторится на другой версии офиса.

Спасибо qwertehok и droider за помощь.

Would someone assist with what I’m sure is a basic error on my part please.

My goal is to open an Excel spreadsheet (invisibly), populate it, attach it to an email, send and close everything.

It is close to complete, except that Excel remains open — in the Task Manager — after the process is complete.

The block of code is:

procedure TFMain.SendEmail;
var
  i, j, r: Integer;
  vBody, vSaveVer: string;
  vAttach: TIdAttachment;
  vMftQty: array [1 .. 2] of Integer;
  vQtyTot: array [1 .. 12] of Integer;
  vNetTot: array [1 .. 12] of Real;
  oXL, oWB, oSheet: Variant;
begin
  IdMessage1.From.Address := 'sage@valid-email.co.uk';
  IdMessage1.From.Domain := 'valid-email.co.uk';
  IdMessage1.From.Text := 'Sage <sage@valid-email.co.uk>';
  IdMessage1.Subject := 'Sage';
  try
    SQLQuery1.Close;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('SELECT comp,dept,e_addr FROM acc_email WHERE dept="' +
      EMailQuery.FieldByName('Dept').Text + '"');
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      IdMessage1.Recipients.EMailAddresses :=
        EMailQuery.FieldByName('E_Addr').Text;
      SQLQuery2.Close;
      SQLQuery2.SQL.Clear;
      SQLQuery2.SQL.Add('SELECT * FROM invoice WHERE global_dept_number="' +
        EMailQuery.FieldByName('Dept').Text +
        '" ORDER BY account_ref, stock_code');
      SQLQuery2.Open;

      oXL := CreateOleObject('Excel.Application');
      oXL.DisplayAlerts := False;
      oWB := oXL.Workbooks.Add;
      while not SQLQuery2.Eof do
      begin
        oXL.Cells[r, 1].Value := 'Code';
        oXL.Cells[r, 2].Value := 'Description';
        oXL.Cells[r, j * 2 + 1].Value := 'Qty';
        oXL.Cells[r, j * 2 + 2].Value := 'Value';
        Inc(r);
        oWB.Worksheets.Add(After := oWB.Worksheets[oWB.Worksheets.Count]);
        oSheet := oWB.ActiveSheet;
        oSheet.Name := SQLQuery2.FieldByName('account_ref').Text;
        oXL.Cells[1, j * 2 + 1].Value := 'Month';
        r := 2;
        SQLQuery2.Next;
      end;
      if oWB.Worksheets.Count > 1 then
        oWB.Worksheets.Item['Sheet1'].Delete;
      oWB.Worksheets[1].Select;
      oWB.SaveAs(vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
      SQLQuery1.Next;
    end;
    try
      if IdMessage1.Recipients.EMailAddresses <> '' then
      begin
        vAttach := TIdAttachmentFile.Create(IdMessage1.MessageParts,
          vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1);
        IdMessage1.Recipients.EMailAddresses := '';
        IdMessage1.Body.Text := '';
      end;
    finally
      if IdSMTP1.Connected then
        IdSMTP1.Disconnect;
    end;
  finally
    vAttach.Free;
    oSheet := Unassigned;
    oWB := Unassigned;
    oXL.Quit;
    oXL := Unassigned;
  end;
end;

Yet Excel remains in the Task Manager and as the process runs a few times over the day, they build up in the background.

Could someone direct me to either the solution or how to troubleshoot the problem?

 
scorpio_md
 
(2005-12-16 11:35)
[0]

Подскажите плиз, как закрыть екселевское приложение без запроса на сохранение, пробовал

xls.quit;
xls.quit(2);
— По аналогии с WORD — ругается, неизветсный параметр


 
Scorpio ©
 
(2005-12-16 15:07)
[1]

Мастера подскажите как мне всетаки закрыть ексель без сохранения, а то мозги уже кипят.


 
Zz_
 
(2005-12-16 15:09)
[2]

DisplayAlerts


 
Scorpio ©
 
(2005-12-16 15:16)
[3]

xls := CreateOleObject(«Excel.Application»);
    app := XLS.Workbooks.Open(«c:spravkaspravka»);
    xls.worksheets[«Ëèñò1″].Cells[1,1].Cells:=»Ïðèâåò»;
    XLS.ActiveWindow.SelectedSheets.PrintOut(Copies:=1,Collate:=True);

    xls.DisplayAlerts;
    xls.quit;
    xls := unassigned;
    app := Unassigned;

Я пробовал с  xls.quit; и без, он мне выдает «Метод DisplayAlerts из класса Application  завершен неверно».


 
umbra ©
 
(2005-12-16 15:23)
[4]

xls.DisplayAlerts := false;


 
Vlad ©
 
(2005-12-16 15:49)
[5]


> Scorpio ©   (16.12.05 15:16) [3]

Можно его обмануть :-)

XLS.WorkBooks[1].Saved := True;
XLS.Quit;


 
Scorpio ©
 
(2005-12-16 16:03)
[6]

Всем спасибо, теперь у меня все работает.


    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Правильно закрыть Excel

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    30.11.10, 17:06

      Full Member

      ***

      Рейтинг (т): 10

      Ребят, всем привет. Использую для работы с Excel следующую конструкцию. По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE. Как его оттуда убрать?

      ExpandedWrap disabled

        var

          Excel : Variant;

        procedure TMainForm.LoadFromExcel();

        begin

          //создаем объект

          Excel := CreateOleObject(‘Excel.Application’);

          //что то с ним делаем

          Excel.DisplayAlerts := False; //блокировка уведомлений о сохранении

          Excel.WorkBooks[1].SaveAs(ExcelFileName);

          try

            Excel.Workbooks.Close;

          except

          end;

        end;


      Fr0sT



      Сообщ.
      #2

      ,
      30.11.10, 17:33

        Цитата seska @ 30.11.10, 17:06

        По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE

        Так ты его и не закрываешь, закрываешь только одну вкладку. Вероятно, надо вызывать что-то вроде Excel.Quit


        seska



        Сообщ.
        #3

        ,
        30.11.10, 17:45

          Full Member

          ***

          Рейтинг (т): 10

          Excel.Quit тоже не работает. Вероятно нужно что-то вроде этого, а что конкретно я к сожалению не могу найти ;(


          VahaC



          Сообщ.
          #4

          ,
          30.11.10, 18:39

            в DRKB -> ActiveX, COM и Другие технологии -> Работа с приложениями Microsoft Office -> Работа с Microsoft Excel -> Как зыкрыть Excel говорят что вот так

            ExpandedWrap disabled

              try  

                Ex1.Workbooks.Close(LOCALE_USER_DEFAULT);  

                Ex1.Disconnect;  

                Ex1.Quit;  

                Ex1:=nil;  

               except  

               end;


            andrew.virus



            Сообщ.
            #5

            ,
            30.11.10, 18:47

              seska, для получения результата нужно выполнить следующее:

              ExpandedWrap disabled

                var

                  tmpExcel: variant;

                begin

                  // создаем объект

                  tmpExcel:=CreateOleObject(‘Excel.Application’);

                  // что то с ним делаем

                  tmpExcel.Workbooks.Add;        // добавляем один лист в книгу

                  // сохраняем полученный результат

                  tmpExcel.DisplayAlerts:=false; // блокируем уведомления о сохранении

                  tmpExcel.ActiveWorkbook.SaveAs(extractfilepath(application.ExeName) + ‘1.xls’);

                  tmpExcel.ActiveWorkbook.Close

                end;

              з.ы.: во вложении пример с использованием данного кода …


              Прикреплённый файлПрикреплённый файлexcel_close.zip (1,79 Кбайт, скачиваний: 161)


              seska



              Сообщ.
              #6

              ,
              30.11.10, 19:14

                Full Member

                ***

                Рейтинг (т): 10

                Спасибо, VahaC! Вроде процесс удаляется теперь. Только код немного видоизменил, так он не компилируется.

                ExpandedWrap disabled

                    try

                      Excel.Workbooks.Close;

                    except

                    end;

                    Excel.Quit;

                    Excel := null;

                Добавлено 30.11.10, 19:16
                andrew.virus да, тут задача чтобы Excel была глобальной переменной. Если она локальная, как у тебя, то после выхода из процедуры процесс действительно исчезает


                Light13



                Сообщ.
                #7

                ,
                01.12.10, 09:31

                  Есть замечательная функция Excel := Unassigned. Перед присвоением не забыть сделать Quit.


                  Fr0sT



                  Сообщ.
                  #8

                  ,
                  01.12.10, 11:23

                    Excel := nil тоже вполне сработает

                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                    0 пользователей:

                    • Предыдущая тема
                    • Delphi: Общие вопросы
                    • Следующая тема

                    Рейтинг@Mail.ru

                    [ Script execution time: 0,0344 ]   [ 18 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  


                    Не могу закрыть Excel из Delphi

                    От:

                    yuriyr

                     
                    Дата:  06.07.04 11:06
                    Оценка:

                    У меня форма запускает через Ole Excel

                        SaveName:=Name;
                        XLap := CreateOLEObject('Excel.Application');
                        Workbook := XLap.WorkBooks.Open(Name);
                        xlap.Visible := true;
                        xlap.DefaultFilePath:=ExtractFileDir(Name);

                    а сама всплывает поверх его (из нее я перетаскиваю в ячейки всякую шнягу)
                    она держит application екселя до своего закрытия,
                    а при закрытии этой формы я все сохраняю и закрываю ексель

                        xlap.DisplayAlerts := False;
                        Workbook.SaveAs(SaveNAme);
                        xlap.Quit;
                        Application.ProcessMessages;

                    Так вот если в екселе не редактируется ячейка все проходит на ура
                    а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
                    Вопрос: Как бы его вывести из состояния редактирования ячейки?
                    YuriyR


                    Re: Не могу закрыть Excel из Delphi

                    От:

                    Softwarer

                    http://softwarer.ru
                    Дата:  06.07.04 11:16
                    Оценка:

                    +1

                    Здравствуйте, yuriyr, Вы писали:

                    Y> xlap.Quit;

                    Y>Так вот если в екселе не редактируется ячейка все проходит на ура
                    Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.

                    Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.


                    Re[2]: Не могу закрыть Excel из Delphi

                    От:

                    yuriyr

                     
                    Дата:  06.07.04 11:23
                    Оценка:

                    Здравствуйте, Softwarer, Вы писали:

                    S>Здравствуйте, yuriyr, Вы писали:


                    Y>> xlap.Quit;

                    Y>>Так вот если в екселе не редактируется ячейка все проходит на ура
                    Y>>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.

                    S>Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.

                    Нет первая команда xlap.DisplayAlerts := False;
                    Она отменяет все вопросы Excel на счет подтверждения сохранения
                    Но и она — самая первая — не выполняется exeption выдает каманда игнорирована


                    Re[3]: Не могу закрыть Excel из Delphi

                    От:

                    Softwarer

                    http://softwarer.ru
                    Дата:  06.07.04 11:28
                    Оценка:

                    Здравствуйте, yuriyr, Вы писали:

                    Y>Нет первая команда xlap.DisplayAlerts := False;

                    Виноват, действительно прореагировал «на рефлексах». Прошу прощения.


                    Re[3]: Не могу закрыть Excel из Delphi

                    От:

                    akasoft

                    Россия

                     
                    Дата:  06.07.04 13:36
                    Оценка:

                    Здравствуйте, yuriyr, Вы писали:

                    Y>Нет первая команда xlap.DisplayAlerts := False;

                    Y>Она отменяет все вопросы Excel на счет подтверждения сохранения

                    Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…

                    … << RSDN@Home 1.1.4 beta 2 >>


                    Re[4]: Не могу закрыть Excel из Delphi

                    От:

                    yuriyr

                     
                    Дата:  06.07.04 16:25
                    Оценка:

                    Здравствуйте, akasoft, Вы писали:

                    A>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…

                    Попробовал и так. Изменений нет
                    OLE error ‘Вызов был отклонен’
                    Использую ExcelXP
                    Help! Please


                    Re: Не могу закрыть Excel из Delphi

                    От:

                    Slicer [Mirkwood]

                    Россия

                    https://ru.linkedin.com/in/maksim-gumerov-039a701b
                    Дата:  06.07.04 19:01
                    Оценка:

                    Да не команду на закрытие он игнорирует, а любые OLE-вызовы

                    Slicer

                    Специалист — это варвар, невежество которого не всесторонне :)


                    Re[5]: Не могу закрыть Excel из Delphi

                    От:

                    Григоричев Денис

                     
                    Дата:  08.07.04 05:15
                    Оценка:

                    6 (1)

                    Здравствуйте, yuriyr, Вы писали:
                    Y>Здравствуйте, akasoft, Вы писали:

                    A>>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…


                    Y>Попробовал и так. Изменений нет

                    Y>OLE error ‘Вызов был отклонен’
                    Y>Использую ExcelXP
                    Y>Help! Please
                    Таки да, есть такая бодяга. Проходили.Вылечилось так:
                    EA.SendKeys(‘{ESC}’,0,LOCALE_USER_DEFAULT);
                    Где EA — ExcelApplication.
                    Этим мы вырубаем режим редактирования ячейки. Дальше он принимает все OLE вызовы.

                    … << RSDN@Home 1.1.3 stable >>


                    Re[6]: Не могу закрыть Excel из Delphi

                    От:

                    Slicer [Mirkwood]

                    Россия

                    https://ru.linkedin.com/in/maksim-gumerov-039a701b
                    Дата:  08.07.04 09:04
                    Оценка:

                    Логично
                    Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
                    Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения. Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
                    Кстати, напомню, что в ряде случаев такая блокировка со стороны Excel очень логична (если, например, юзверь сидит в диалоговом окне).

                    Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только пользователь переключится на другой элемент нашего окна, automation закроет эксель (в т.ч. если эксель был в режиме редактирования — но не в диалоговом окне). Правда, есть и досадный глюк (по кр. мере, в D6): если в design-time открыть (open, а не edit) объект в OLEContainer, а потом закрыть только книгу (но не эксель), будет закрыта и эксель тоже. А вот если то же проделать в рантайме — эксель останется открыта. Подробно не смотрел — может, как-то это регулируется. Ну сопровождение этого глюка — если один раз объект открыли в режиме open и закрыли, потом с ним можно делать что угодно — но в режиме просмотра в контейнере он при этом будет заштрихован серым (как если в данный момент редактируется в режиме open).

                    На выбор еще три варианта, не полностью, но решающих проблему: 1) ждем, пока Excel не согласна будет выполнить нашу команду (юзер покинет диалог или выйдет из режима редактирования), 2) блокируем пользовательский интерфейс Excel, 3) открываем данные в режиме «только для чтения» (проблема с диалогами остается).

                    Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?

                    Slicer

                    Специалист — это варвар, невежество которого не всесторонне :)


                    Re[7]: Не могу закрыть Excel из Delphi

                    От:

                    Григоричев Денис

                     
                    Дата:  09.07.04 05:27
                    Оценка:

                    Здравствуйте, Slicer [Mirkwood], Вы писали:

                    SM>Логично

                    SM>Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
                    IMHO, нет. Я не нашел, спрашивал об этом на Королевстве Дельфи — мне так и сказали. Так же мне сказали, что сплошная безнадега пытаться узнать позицию курсора при редактировании ячейки.
                    SM>Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения.
                    Мне это подходило, ибо я все равно затираю содержимое ячейки. В ЭТОМ случае. В другом — ставлю в позицию редактирования. Нашел способ.
                    SM> Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
                    О, Excel это такая загадочная вещь!
                    SM>Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только
                    Я его так и использую. Мне нужно было достроить меню своими фишками, и, чтобы не мучиться с Add-in-ами, сделал в OleContainer.

                    SM>Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?

                    Не всегда это подходит. У меня это делается в диалоговом окне. Т.е., юзер, сам решает, когда ему прекратить редактирование. Но убиваем Excel из нашего приложения. Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
                    Денис

                    … << RSDN@Home 1.1.3 stable >>


                    Re[8]: Не могу закрыть Excel из Delphi

                    От:

                    Slicer [Mirkwood]

                    Россия

                    https://ru.linkedin.com/in/maksim-gumerov-039a701b
                    Дата:  09.07.04 09:52
                    Оценка:

                    ГД>Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
                    Это вряд ли хорошо — в экселе могут быть открыты чьи-то еще документы, кроме подсунутых Вами

                    Slicer

                    Специалист — это варвар, невежество которого не всесторонне :)


                    Re[9]: Не могу закрыть Excel из Delphi

                    От:

                    yuriyr

                     
                    Дата:  09.07.04 11:21
                    Оценка:

                    Сделал так
                    Не могу использовать OleContainer так как суть работы заключается в OLE перетаскивании данных из одного обьекта
                    в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.

                    procedure TDSBOXF.OpenTemplate(Name: string);
                    begin
                    try
                    SaveName := Name;
                    XLap := CreateOLEObject(‘Excel.Application’);
                    Workbook := XLap.WorkBooks.Open(Name);
                    xlap.Visible := true;
                    xlap.DefaultFilePath := ExtractFileDir(Name);
                    except
                    end;
                    Show;
                    end;

                    procedure TDSBOXF.FormClose(Sender: TObject; var Action: TCloseAction);
                    var
                    i: integer;
                    findapp: string;
                    begin

                    ////////////////////////////////////////////////////////////////////////////////
                    // Save Workbook
                    ////////////////////////////////////////////////////////////////////////////////

                    try
                    xlap.DisplayAlerts := False;
                    Workbook.SaveAs(SaveNAme);
                    Workbook.Close(False);
                    Application.ProcessMessages;
                    except
                    on E: Exception do
                    begin
                    // if (E.ClassName = ‘EOleSysError’) AND (EOleSysError(E).ErrorCode = -2147417848) then Exit; // Отключен клиент
                    if (E.ClassName = ‘EOleSysError’) and (EOleSysError(E).ErrorCode = -2147418111) then // Заблокирован Excel
                    begin
                    findapp := ‘Microsoft Excel — ‘ + ChangeFileExt(ExtractFileNAme(SaveNAme), »);
                    if not AppActivate(Pchar(findapp)) then
                    begin
                    findapp := ‘Microsoft Excel*’;
                    if not AppActivate(Pchar(findapp)) then Exit;
                    end;
                    begin
                    try
                    SendKeys(‘{TAB}’, True);
                    Application.ProcessMessages;
                    xlap.DisplayAlerts := False;
                    Workbook.SaveAs(SaveNAme);
                    Workbook.Close(False);
                    Application.ProcessMessages;
                    except
                    end;
                    end;
                    end;
                    end;
                    end;

                    Покритикуйте!
                    Посылаю TAB через Sendkey32 немного модифицированный.
                    Там еще пишут XLap := CreateOLEObject(‘Excel.Application 7.8.9… ‘);
                    Вот эти 7-8-9 сильно нужны или нет ? У меня вроде и так все работает.

                    Подождите ...

                    Wait...

                    • Переместить
                    • Удалить
                    • Выделить ветку

                    Пока на собственное сообщение не было ответов, его можно удалить.


                    Форум программистов Vingrad

                    Модераторы: Poseidon, Snowy, bems, MetalFan

                    Поиск:

                    Ответ в темуСоздание новой темы
                    Создание опроса
                    > Как корректно закрыть Excel 

                    :(

                       

                    Опции темы

                    Akella
                    Дата 24.2.2004, 15:52 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Творец
                    ****

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

                    Репутация: 36
                    Всего: 329

                    использую WinXP, ExcelXP, D7

                    На дополнительной модальной форме лежит компонена TExcelApplication со страницы Servers
                    Автоподключение и автовыход отключены (False)

                    Uses System, …., ExcelXP;
                    также объявлены глобальные переменные

                    WorkBook: _WorkBook;
                    Sheet: _WorkSheet;

                    В нажатия кнопки коде пишу:

                    Excel.Connect;
                    Excel.WorkBooks.Open(параметры, имя файла);

                    выполняю какие-то действия


                    Excel.DisConnect;//это не помогает
                    Excel.Quit;//это тоже не помогает

                    и то и другое вместе тоже не помогает

                    Открываю диспетчер задач — висит Excel, исчезает только после закрытия основного окна, т.е. выхода из программы.

                    Использовать CreetOleObject не хочется, т.к. много переделывать, а уже все работает идеально кроме закрытия Excel`я

                    весь код я уже выкладывал.

                    PM MAIL   Вверх
                    Cashey
                    Дата 24.2.2004, 17:00 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Бессмертный
                    ****

                    Профиль
                    Группа: Завсегдатай
                    Сообщений: 3441
                    Регистрация: 13.11.2002
                    Где: в столице

                    Репутация: 2
                    Всего: 60

                    Выгрузи переменные WorkBook и Sheet из памяти.

                    ———————

                    библия учит любить ближнего, а камасутра обучает как именно

                    PM Jabber   Вверх
                    Albinos
                    Дата 24.2.2004, 19:03 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Шустрый
                    *

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

                    Репутация: 1
                    Всего: 3

                    А чего нибудь типа Close() там нет?

                    PM MAIL   Вверх
                    Georg4
                    Дата 25.2.2004, 01:19 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Опытный
                    **

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

                    Репутация: 0
                    Всего: 10

                    Отличный вопросsmile.gifsmile.gifsmile.gif
                    Нет не пугайтесь, кто бы то ни был, я не буду опять вбухивать суда всю мануала по ЕХЕЛУ, я действительно задолбался это делать, так что:
                    Закрытие Excel

                    Испольуя раннее связывание
                    if Assigned(IExcel) then begin
                    if (IExcel.Workbooks.Count > 0) and (not IExcel.Visible[xlLCID]) then
                    // не закрывайте не свои книги
                    begin
                    IExcel.WindowState[xlLCID] := TOLEEnum(Excel8_TLB.xlMinimized);
                    IExcel.Visible[xlLCID] := true;
                    Application.BringToFront;
                    end
                    else
                    IExcel.Quit;
                    IExcel := nil; // см. Хорошая практика
                    end;
                    Зачем столько кода? Зачем столько кода? Вы не запускали новый процесс, вы «законнектились» к уже существовавшему. В нем была открыта книга. Если оставить только присваивание в nil, то существовавший процесс не будет выгружен (он же существовал до запуска вашего приложения), но будет, возможно, спрятан от пользователя с его открытой книгой.
                    Используя компоненты Delphi 5
                    if Assigned(Excel) then begin
                    if (Excel.Workbooks.Count > 0) and (not Excel.Visible[xlLCID]) then
                    // не закрывайте не свои книги
                    begin
                    Excel.WindowState[xlLCID] := TOLEEnum(Excel97.xlMinimized);
                    Excel.Visible[xlLCID] := true;
                    Application.BringToFront;
                    end
                    else
                    Excel.Quit;
                    FreeAndNil(Excel);
                    end;
                    В Delphi 5 вы работаете уже не с интерфейсом напрямую, а с экземпляром класса TExcelApplcation. Это настоящий экземпляр класса, освободить который просто необходимо. Поэтому вместо присваивания в nil — FreeAndNil.
                    Используя позднее связывание
                    if not VarIsEmpty(Excel) then begin
                    if (Excel.Workbooks.Count > 0) and (not Excel.Visible) then
                    // не закрывайте не свои книги
                    begin
                    Excel.WindowState := Excel97.xlMinimized;
                    Excel.Visible := true;
                    Application.BringToFront;
                    end
                    else
                    Excel.Quit;
                    Excel := UnAssigned;
                    end;
                    Внимание — хорошая практика!
                    Процесс Excel останется в памяти, скрыто выполняясь, до тех пор, пока вы не освободите все ваши указатели на любые, использованные вами, интерфейсы Excel. Отсоедините все компоненты, присвойте всем интерфейсным переменным nil и установите все переменные типа variant в Unassigned, чтобы избежать этого.

                    Вот и все!

                    ———————

                    Никто и никогда не должен решать одну проблему дважды

                    PM MAIL ICQ   Вверх
                    Kesh
                    Дата 25.2.2004, 13:52 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Эксперт
                    ****

                    Профиль
                    Группа: Эксперт
                    Сообщений: 2488
                    Регистрация: 31.7.2002
                    Где: Германия, Saarbrü cken

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

                    Georg4 Ты бы весь цикл статей привел… Ибо это есть гуд…
                    По-моему «По волнам интеграции…»

                    ———————

                    user posted image

                    PM MAIL WWW ICQ Skype   Вверх
                    Cashey
                    Дата 25.2.2004, 15:44 (ссылка)
                    | (нет голосов)
                    Загрузка ... Загрузка …




                    Быстрая цитата

                    Цитата

                    Бессмертный
                    ****

                    Профиль
                    Группа: Завсегдатай
                    Сообщений: 3441
                    Регистрация: 13.11.2002
                    Где: в столице

                    Репутация: 2
                    Всего: 60

                    Georg4, все твои рекоммендации сводятся к одному Quit и выгрузка из памяти , что я и говорил.

                    По поводу статей, я и сам бы мог поделиться не малым опытом работы с екселем, но для етого хорошо было бы создать отдельный форум, что бы добро не пропало smile.gif, а главное для того, что бы этим могли воспользоваться и те кто работает с другими языками и бывает на других форумах.

                    ———————

                    библия учит любить ближнего, а камасутра обучает как именно

                    PM Jabber   Вверх



















                    Ответ в темуСоздание новой темы
                    Создание опроса
                    Правила форума «Delphi: Общие вопросы»
                    SnowyMetalFan
                    bemsPoseidon
                    Rrader

                    Запрещается!

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

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

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


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

                     

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

                    Работа с EXCEL из Delphi

                    В этой статье я познакомлю вас как работать с MS Excel из Delphi
                    . Данная статья может быть полезна людям, которые хотят научиться создавать различные отчеты в Excel
                    из программ написанных на Delphi
                    . Статья содержит справочные данные необходимые для работы с MS Excel
                    . Здесь вы найдете информацию о том как:

                    Подключить и правильно отключить интерфейс Excel;
                    — Как изменить размер, цвет и тип шрифта;
                    — Как выделить, объединить, заполнить и размножить диапазон ячеек;
                    — Как повернуть и отцентрировать текст;
                    — Как нарисовать границы ячеек;
                    — Как ввести формулу в ячейку и многое другое…

                    И так, начнем…

                    Работать будем через модуль ComObj,
                    для этого в uses
                    необходимо добавить модуль ComObj
                    и модуль Excel_TLB
                    (для MS Excel 2007
                    ).

                    Uses ……, ComObj, Excel_TLB;

                    Модуль Excel_TLB
                    содержит необходимые константы
                    для работы с Excel
                    , его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel
                    они разные.
                    Внимание!!!

                    Модуль Excel_TLB
                    в других версиях MS Excel
                    может называться по другому. Перед подключением модуля Excel_TLB,
                    необходимо импортировать библиотеку Excel
                    . Для этого выберите Component->Import Component->Import a Type Library->
                    находим MS Excel
                    и следуем инструкциям.

                    В разделе описания переменных мы должны описать переменную типа Variant
                    или OleVariant
                    для подключения интерфейса Excel.
                    Я описал переменную excel
                    .

                    Form1: TForm1;
                    excel

                    : variant;
                    // Переменная в которой создаётся объект EXCEL

                    Создание документа

                    Внимание!!!

                    Всегда когда создаете объект интерфейса, заключайте процедуру создания в модуль обработки ошибок:
                    try

                    создаем интерфейс;
                    формируем отчет;
                    освобождаем интерфейс;
                    Except

                    обрабатываем ошибки;
                    освобождаем интерфейс;
                    end;

                    try

                    // создаем обьект EXCEL

                    // Чтоб не задавал вопрос о сохранении документа

                    excel.DisplayAlerts:= false;

                    // создаем новый документ
                    рабочую книгу

                    excel.WorkBooks.Add;

                    // или загружаем его из директории с программой

                    excel.WorkBooks.Open(GetCurrentDir() + «отчет.xls»);

                    { GetCurrentDir()- возвращает путь к директории с программой}

                    // Делаем его видимым
                    данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
                    excel.Visible:= true;

                    //задаем тип формул в формате R1C1

                    excel.Application.ReferenceStyle:= xlR1C1;

                    // задаем тип формул в формате A1

                    excel.Application.ReferenceStyle:= xlA1;

                    // Задаем название первому и второму листу

                    excel.WorkBooks.WorkSheets.Name:= «Отчет1»;
                    excel.WorkBooks.WorkSheets.Name:= «Отчет2»;

                    //задаем формат числа для первой и четвертой колонки формат числа

                    excel.WorkBooks.WorkSheets.Columns.NumberFormat:= «0,00»;
                    excel.WorkBooks.WorkSheets.Columns.NumberFormat:= «0,0»;

                    // задаем ширину первой и второй колонки

                    excel.WorkBooks.WorkSheets.Columns.ColumnWidth:= 10;
                    excel.WorkBooks.WorkSheets.Columns.ColumnWidth:= 20;

                    // задаем начертание, цвет, размер и тип шрифта для первого ряда

                    excel.WorkBooks.WorkSheets.Rows.Font.Bold:= True; //жирный

                    excel.WorkBooks.WorkSheets.Rows.Font.Color:= clRed; // цвет красный

                    excel.WorkBooks.WorkSheets.Rows.Font.Size:= 12; //размер 12

                    excel.WorkBooks.WorkSheets.Rows.Font.Name:= «Times New Roman»; //шрифт

                    //присваиваем ячейке 1,4 и 2,4 значения (1 — ряд, 4 — колонка)

                    excel.WorkBooks.WorkSheets.Cells := «А так можно внести значение в ячейку»;
                    excel.WorkBooks.WorkSheets.Cells := «А так можно внести значение в ячейку»;

                    //ввод в ячейку «A12» формулы «=b5+c4»

                    excel.WorkBooks.WorkSheets.Range[«A12″].Formula:=»=b5+c4»;

                    // Выравнивам первый ряд по центру по вертикали

                    excel.WorkBooks.WorkSheets.Rows.VerticalAlignment:= xlCenter;

                    // Выравнивам первый ряд по центру по горизонтали

                    excel.WorkBooks.WorkSheets.Rows.HorizontalAlignment:= xlCenter;

                    // Выравнивам в ячейке по левому краю

                    excel.WorkBooks.WorkSheets.Cells.HorizontalAlignment:= xlLeft;

                    // Выравнивам в ячейке по правому краю

                    excel.WorkBooks.WorkSheets.Cells.HorizontalAlignment:= xlRight;

                    // Обьединяем ячейки «A1:A8»

                    excel.WorkBooks.WorkSheets.Range[«A1:A8»].Merge;

                    // Поворачиваем слова под углом 90 градусов для второго ряда

                    excel.WorkBooks.WorkSheets.Rows.Orientation:= 90;

                    // Поворачиваем слова под углом 45 градусов для диапазона ячеек «B3:D3»

                    excel.WorkBooks.WorkSheets.Range[«B3:D3»].Orientation:= 45;

                    //рисуем границы выделенного диапазона левая

                    excel.Selection.Borders.LineStyle:= xlContinuous; // стиль линии сплошная

                    excel.Selection.Borders.Weight:= xlMedium;// толщина линии

                    //рисуем границы выделенного диапазона верхняя

                    excel.Selection.Borders.Weight:= xlMedium;

                    //рисуем границы выделенного диапазона нижняя

                    excel.Selection.Borders.Weight:= xlMedium;

                    //рисуем границы выделенного диапазона правая

                    excel.Selection.Borders.Weight:= xlMedium;

                    //рисуем границы выделенного диапазона вертикальные внутрениие

                    excel.Selection.Borders.Weight:= xlMedium;

                    //рисуем границы выделенного диапазона горизонтальные внутрениие

                    excel.Selection.Borders.Weight:= xlMedium;

                    //автозаполнение выделенного диапазона

                    //для примера заполним область ячеек «A10:C10» словом «привет»
                    //и размножим его вниз еще на пять ячеек «A10:C15»

                    excel.WorkBooks.WorkSheets.Range[«A10:C10″].Value:=»привет»;

                    //выделяем диапазон ячеек «A10:C10»

                    excel.WorkBooks.WorkSheets.Range[«A10:C10»].Select;

                    //автозаполняем (копируем) выделенным диапазоном область ячеек «A10:C15»

                    excel.selection.autofill(excel.WorkBooks.WorkSheets.Range[«A10:C15»],xlFillDefault);

                    //отключаем предупреждения, чтобы не задавал вопросов о сохранении и других

                    excel.DisplayAlerts:= False;

                    //сохраняем документ в формате Excel 97-2003

                    excel.ActiveWorkBook.Saveas(GetCurrentDir() + «отчет.xls»,xlExcel8);

                    //сохраняем документ в текущем формате Excel 2007

                    excel.ActiveWorkBook.Saveas(GetCurrentDir() + «отчет.xlsx»);

                    //закроем все книги

                    excel.Workbooks.Close;

                    //закрываем Excel

                    excel.Application.quit;

                    //освобождаем интерфейсы

                    excel:= Unassigned;

                    //обрабатываем ошибки

                    //закроем все книги

                    excel.Workbooks.Close;

                    //закрываем Excel

                    excel.Application.quit;

                    //освобождаем интерфейсы

                    excel:= Unassigned;
                    end;

                    end;

                    При работе с листом Excel
                    мы можем использовать следующие варианты:
                    — работать с областью Range[«B3:D3»];
                    — работать с ячейкой Cells где 2 — ряд, 4 — колонка;
                    — работать с рядами Rows или с диапазоном рядов Rows[«1:5»];
                    — работать с колонками Columns или диапазоном колонок Columns[«A:I»];

                    Range[«A1»] и Cells обозначают одно и тоже.

                    После сформирования документа или возникновении ошибки вы должны правильно освободить интерфейсы.
                    Иначе при закрытии Excel
                    он скрывается с экрана, но если открыть диспетчер задач он продолжает там висеть и если данный процесс не завершить, то при каждом новом запуске их будет накапливаться больше и больше, пока компьютер не начнет виснуть. Поэтому обязательно необходимо освобождать все интерфейсы с вязанные с Excel
                    с его книгами и листами.

                    Например так:

                    //закроем все книги

                    excel.Workbooks.Close;

                    //закрываем Excel

                    excel.Application.quit;

                    //освобождаем интерфейсы

                    sheet:=Unassigned; //интерфейс листа если он был создан
                    WorkBook:= Unassigned;//интерфейс рабочей книги если он был создан
                    excel:= Unassigned;//интерфейс самого предложения если он был создан

                    Ниже привожу пример вывода в

                    Excel из Delphi таблицы умножения с подробными комментариями.

                    Unit Unit1;

                    Uses
                    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                    Dialogs, comobj, StdCtrls, Excel_TLB;

                    Type
                    TForm1 = class(TForm)
                    Button1: TButton;
                    procedure Button1Click(Sender: TObject);
                    private
                    { Private declarations }
                    public
                    { Public declarations }
                    end;

                    Var
                    Form1: TForm1;
                    excel: variant; // Переменная в которой создаётся объект EXCEL
                    MyData: variant; // Переменная в которой формируется таблица умножения
                    i,j:integer;
                    implementation

                    Procedure TForm1.Button1Click(Sender: TObject);
                    begin
                    try
                    // Обьект EXCEL
                    excel:= CreateOleObject(«Excel.Application»);
                    // Чтоб не задавал вопрос о сохранении документа
                    excel.DisplayAlerts:= false;
                    // новый документ
                    excel.WorkBooks.Add;

                    //объявляем вариантный массив
                    MyData:= VarArrayCreate(,varVariant);
                    for I:= 1 to 9 do
                    for J:= 1 to 9 do
                    MyData:=i*j;

                    // Обьединяем ячейки «A1:I1»
                    excel.WorkBooks.WorkSheets.Range[«A1:I1»].Merge;
                    //Пишем заголовок
                    excel.WorkBooks.WorkSheets.Range[«A1″].Value:=»Таблица умножения»;
                    // Выравнивам заголовок по центру
                    excel.WorkBooks.WorkSheets.Range[«A1»].HorizontalAlignment:= xlCenter;
                    // задаем ширину колонок с A по I
                    excel.WorkBooks.WorkSheets.Columns[«A:I»].ColumnWidth:= 3;

                    //выделяем область таблицы умножения [«A2:I10»] и рисуем границы
                    excel.WorkBooks.WorkSheets.Range[«A2:I10»].select;
                    //рисуем границы выделенного диапазона левая
                    excel.Selection.Borders.LineStyle:= xlContinuous; // стиль линии сплошная
                    excel.Selection.Borders.Weight:= xlThin;// толщина линии
                    //рисуем границы выделенного диапазона верхняя
                    excel.Selection.Borders.LineStyle:= xlContinuous;
                    excel.Selection.Borders.Weight:= xlThin;
                    //рисуем границы выделенного диапазона нижняя
                    excel.Selection.Borders.LineStyle:= xlContinuous;
                    excel.Selection.Borders.Weight:= xlThin;
                    //рисуем границы выделенного диапазона правая
                    excel.Selection.Borders.LineStyle:= xlContinuous;
                    excel.Selection.Borders.Weight:= xlThin;
                    //рисуем границы выделенного диапазона вертикальные внутрениие
                    excel.Selection.Borders.LineStyle:= xlContinuous;
                    excel.Selection.Borders.Weight:= xlThin;
                    //рисуем границы выделенного диапазона горизонтальные внутрениие
                    excel.Selection.Borders.LineStyle:= xlContinuous;
                    excel.Selection.Borders.Weight:= xlThin;

                    //присваиваем диапазону [«A2:I10»] значения вариантного массива MyData это значительно ускоряет работу, нежели вывод по //ячеечно

                    Excel.WorkBooks.WorkSheets.Range[«A2:I10»].Value:=MyData;

                    // Делаем его видимым
                    excel.Visible:= true;
                    //освобождаем интерфейсы
                    MyData:= Unassigned;
                    excel:= Unassigned;
                    Except
                    showmessage(«Внимание! Произошла ошибка при создании MS Excel приложения»);
                    //закрываем Excel
                    excel.Application.quit;
                    //освобождаем интерфейсы
                    MyData:= Unassigned;
                    excel:= Unassigned;
                    end;
                    end;

                    При написании статьи использовался материал с сайта

                    В этой статье мы рассмотрим основные конструкции, позволяющие получить доступ к книге MS Excel из Delphi.

                    Организация доступа к книге EXCEL

                    Для взаимодействия с MS Excel в программе необходимо использовать модуль ComObj

                    Uses ComObj;

                    и объявить переменную для доступа к MS Excel следующего типа:

                    Var MsExcel: Variant;

                    Инициализация переменной Excel в простейшем случае можно осуществить так:

                    MsExcel:= CreateOleObject(«Excel.Application»);

                    Создание новой книги:

                    MsExcel.Workbooks.Add;

                    Открытие существующей книги (где path — путь к фалу с расширением xls.):

                    MsExcel.Workbooks.Open;

                    Открытие существующей книги только для чтения:

                    MsExcel.Workbooks.Open;

                    Закрытие Excel:

                    MsExcel.ActiveWorkbook.Close;
                    MsExcel.Application.Quit;

                    Блокировка запросов (подтверждений, уведомлений) Ms Excel, например, запретить запрос на сохранение файла:

                    MsExcel.DisplayAlerts:=False;

                    Отображаем Excel на экране:

                    MsExcel.Visible:= True;

                    или скрываем:

                    MsExcel.Visible:= False;

                    Печать содержимого активного листа MS Excel:

                    MsExcel.ActiveSheet.PrintOut;

                    Чтение/запись данных в EXCEL

                    Доступ к ячейке в текущей книге Excel можно осуществить следующим образом:

                    Для записи значения в ячейку:

                    MsExcel.Range[«B2″]:=»Привет!»;

                    Для чтения значения из ячейки:

                    S:=MsExcel.Range[«B2»];

                    где B2
                    — адрес ячейки.

                    Или используя стиль ссылок R1C1:

                    MsExcel.Range]:=»Привет!»;

                    где
                    — координата ячейки.

                    Вообще, ячейке Excel можно присваивать любое значение (символьное, целое, дробное, дата) при этом Ms Excel установит форматирование в ячейке применяемое по умолчанию.

                    Формат ячеек в EXCEL

                    Выделить (выбрать) группу ячеек для последующей работы можно так:

                    MsExcel.Range, MsExcel.Cells].Select;
                    // или
                    MsExcel.Range[«A1:C5»].Select;

                    при этом будет выделена область находящаяся между ячейкой A1 и C5.

                    После выполнения выделения можно установить объединение ячеек, перенос по словам, а также горизонтальное и вертикальное выравнивание:

                    // объединение ячеек
                    MsExcel.Selection.MergeCells:=True;
                    // перенос по словам
                    MsExcel.Selection.WrapText:=True;
                    // горизонтальное выравнивание
                    MsExcel.Selection.HorizontalAlignment:=3;
                    // вертикальное выравнивание
                    MsExcel.Selection.VerticalAlignment:=1;

                    Для вертикального и горизонтального выравнивания используются следующие значения:

                    1 — используется выравнивание по умолчанию
                    2 — выравнивание слева
                    3 — по центру
                    4 — справа.

                    Граница ячеек

                    При значении 1 границы ячеек рисуются тонкими сплошными линиями.

                    Кроме этого можно указать значения для свойства Borders, например, равное 3. Тогда установится только верхняя граница для блока выделения:

                    MsExcel.Selection.Borders.LineStyle:=1;

                    Значение свойства Borders задает различную комбинацию граней ячеек. В обоих случаях можно использовать значения в диапазоне от 1 до 10.

                    Использование паролей в EXCEL

                    Установка пароля для активной книги может быть произведена следующим образом:

                    Try
                    // попытка установить пароль
                    MsExcel.ActiveWorkbook.protect(«pass»);
                    except
                    // действия при неудачной попытке установить пароль
                    end;

                    где pass
                    — устанавливаемый пароль на книгу.

                    Снятие пароля с книги аналогично, используем команду

                    MsExcel.ActiveWorkbook.Unprotect(«pass»);

                    где pass

                    Установка и снятие пароля для активного листа книги Excel производится командами

                    MsExcel.ActiveSheet.protect(«pass»); // установка пароля
                    MsExcel.ActiveSheet.Unprotect(«pass»); // снятие пароля

                    где pass
                    — пароль, установленный для защиты книги.

                    Вспомогательные операции в EXCEL

                    Удаление строк со сдвигом вверх:

                    MsExcel.Rows[«5:15»].Select;
                    MsExcel.Selection.;

                    при выполнении данных действий будут удалены строки с 5 по 15.

                    Установка закрепления области на активном листе Excel

                    // снимаем закрепление области, если оно было задано
                    MsExcel.ActiveWindow.FreezePanes:=False;
                    // выделяем нужную ячейку, в данном случае D3
                    MsExcel.Range[«D3»].Select;
                    // устанавливаем закрепление области
                    MsExcel.ActiveWindow.FreezePanes:=True;

                    Сохранение активной книги Excel

                    На каждой из ступеней этой модели можно останавливаться и изучать её месяцами. Если будет особая необходимость в изучении каких-либо дополнительных свойств и методов — мы обязательно вернемся и изучим. А теперь, приступим к работе в Delphi с листами рабочей книги.

                    2. Как активировать лист рабочей книги Excel?

                    Как Вы знаете при создании пустой рабочей книги Excel

                    автоматически добавляет в эту книгу 3 пустых листа. Чтобы работать с конкретным листом (WorkSheet
                    или просто Sheet
                    ) этот лист необходимо активировать. Один из способов активации листа рабочей книги Excel

                    в Delphi

                    выглядит следующим образом:

                    resourcestring

                    rsEInvalidSheetIndex =
                    «Задан неверный индекс для WorkBooks. Активация листа прервана»
                    ;

                    rsEInvalidSheetActivate =
                    «Активация листа завершена с ошибкой»
                    ;

                    function
                    ActivateSheet(WBIndex:
                    integer
                    ;
                    SheetName:
                    string
                    )
                    :
                    boolean
                    ;

                    var

                    i:
                    integer
                    ;

                    begin

                    Result :
                    =
                    false
                    ;

                    if
                    WBIndex >
                    MyExcel.
                    WorkBooks
                    .
                    Count
                    then

                    raise
                    Exception.
                    Create
                    (rsEInvalidSheetIndex)
                    ;

                    try

                    for
                    i :
                    =
                    1
                    to
                    MyExcel.
                    WorkBooks
                    [
                    WBIndex]
                    .
                    Sheets
                    .
                    Count
                    do

                    if
                    AnsiLowerCase
                    (MyExcel.
                    WorkBooks
                    [
                    WBIndex]
                    .
                    Sheets
                    .
                    Item
                    [
                    i]
                    .
                    Name
                    )

                    =
                    AnsiLowerCase
                    (SheetName)
                    then

                    begin

                    MyExcel.
                    WorkBooks
                    [
                    WBIndex]
                    .
                    Sheets
                    .
                    Item
                    [
                    i]
                    .
                    Activate
                    ;

                    Result :
                    =
                    true
                    ;

                    break;

                    end
                    ;

                    except

                    raise
                    Exception.
                    Create
                    (rsEInvalidSheetActivate)
                    ;

                    end
                    ;

                    end
                    ;

                    Здесь в качестве параметров функции задается индекс рабочей книги (WBIndex) в коллекции WorkBooks
                    и название листа.

                    Если хотите, то можете активировать тот же лист по индексу в коллекции WorkSheets
                    — при этом сама функция немного упрощается (не требуется условие проверки названия листа).

                    Также, если вы уверены, что в данный момент времени активна необходимая Вам рабочая книга, то можно избежать использования лишней переменной (индекса рабочей книги WBIndex) и активировать лист вот так:

                    MyExcel.
                    ActiveWorkBook
                    .
                    Sheets
                    .
                    Item
                    [
                    i]
                    .
                    Activate
                    ;

                    Теперь рассмотрим более подробно методы, используемые объектом WorkSheet
                    .

                    3. Методы листа книги Excel

                    Теперь рассмотрим более подробно объект WorkSheet
                    .

                    На рисунке представлены те методы, которые я когда-либо использовал в своей работе.

                    Всего объект WorkSheet
                    насчитывает 30

                    различных методов, которые Вы можете использовать.

                    Метод
                    Описание
                    Activate

                    Делает текущий лист активным. Работу метода мы уже с Вами рассмотрели

                    рассчитывает все открытые книги, конкретный лист в книге, или указанный диапазон ячеек на листе

                    проверка орфографии на выбранном листе

                    сохраняет все изменения в файле

                    удаляет текущий лист WorkSheet

                    выделение листа

                    копирует лист в другое место в рабочей книге

                    вставляет содержимое буфера обмена на лист

                    возвращает объект, который представляет собой либо одну диаграмму (объект ChartObject
                    ChartObjects
                    ) на листе

                    перемещение листа. Этот метод аналогичен методу Copy

                    . Различие лишь в том, что после вcтавки копируемый лист удаляется из книги

                    Рассмотрим теперь каждый из представленных выше методов.

                    Ниже, в качестве expression
                    должен выступать лист (WorkSheet
                    ), если не сказано иное.

                    Метод Calculate

                    Расчёт рабочей книги, листа или диапазона ячеек.

                    Стоит отметить, что вызов метода Calculate
                    возможен не только для конкретного рабочего листа книги Excel. Рассмотрим варианты вызова метода Calculate.

                    var
                    MyExcel:
                    OleVariant;

                    MyExcel.
                    Calculate

                    в приведенном ниже фрагменте кода рассчитывается активный лист

                    MyExcel.
                    ActiveWorkBook
                    .
                    ActiveWorkSheet
                    .
                    Calculate

                    Рассчитаем все формулы в столбцах A, B и C:

                    MyExcel.
                    ActiveWorkBook
                    .
                    ActiveWorkSheet
                    .
                    UsedRange
                    .
                    Columns
                    («A:
                    C»)
                    .
                    Calculate

                    Метод CheckSpelling

                    Вызов метода выглядит следующим образом:

                    expression

                    .
                    CheckSpelling(CustomDictionary, IgnoreUppercase, AlwaysSuggest, SpellLang)

                    При этом в качестве expression
                    должен выступать лист (WorkSheet
                    ).

                    Параметр
                    Тип
                    Описание
                    CustomDictionary
                    Variant
                    с
                    трока, указывающая имя файла пользовательского словаря, который будет рассмотрен, если слово не найдено в основном словаре. Если этот аргумент опущен, то будет использоваться словарь по-умолчанию
                    IgnoreUppercase
                    Variant
                    True
                    , если необходимо, чтобы Microsoft Excel

                    пропускал слова, которые написаны прописными буквами. False
                    для того, чтобы Microsoft Excel

                    проверить все слова. Если этот аргумент опущен, то используются текущие настройки Excel.
                    AlwaysSuggest
                    Variant
                    True
                    , для того, чтобы Microsoft Excel

                    отображал список предложений других вариантов написания при обнаружении неправильного написанного слова. False
                    , чтобы Microsoft Excel

                    ожидал ввода правильного написание. Если этот аргумент опущен, то используются текущие настройки.
                    SpellLang
                    Variant
                    язык словаря. Может принимать значения одной из констант MsoLanguageID

                    , например для русского языка SpellLang = 1049
                    , для английского (США) SpellLang = 1033
                    и т.д. Более подробно про идентификаторы языков .

                    Как проверить грамматику на листе Excel в Delphi?

                    MyExcel.
                    ActiveWorkBook
                    .
                    ActiveWorkSheet
                    .
                    CheckSpelling
                    (CustomDictionary:
                    =
                    EmptyParam,

                    IgnoreUppercase:
                    =
                    false
                    ,

                    AlwaysSuggest:
                    =
                    EmptyParam,

                    SpellLang:
                    =
                    1033
                    )

                    в этом случае MS Excel

                    проверит текущий лист, включая проверку слов из прописных букв. Язык проверки — русский. Обратите внимание, что для того, чтобы вызвать метод мы явно указывали, какому параметру какое значение присвоить. Причём для того, чтобы пропустить какой-либо параметр, мы использовали EmptyParam
                    (пустой параметр), который в Delphi

                    представляет собой переменную типа OleVariant
                    .

                    Понятно, что подобный способ вызова методов (с явным указанием всех параметров) для Вас не совсем удобен и широко не практикуется в программировании на Delphi

                    , но тем не менее только так и никак иначе можно вызывать методы, используемые в Excel

                    .

                    Метод SaveAs

                    Сохранение рабочего листа книги Excel.

                    Вызов метода:

                    expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru,TextCodepage, TextVisualLayout, Local)

                    Параметр
                    Тип
                    Описание
                    FileName
                    Variant
                    строка, представляющая собой имя сохраняемого файла. Необходимо указывать полный путь к файлу, иначе файл будет сохранен в папку Excel

                    .
                    FileFormat
                    Variant
                    формат файла, который используется при сохранении. По умолчанию файл сохраняется в формате, который вы выбирали в последний раз в Excel.

                    Password
                    Variant
                    пароль для файла (не более 15 символов). Пароль чувствителен к регистру.
                    WriteResPassword
                    Variant
                    пароль, который будет использоваться для внесения изменений в рабочую книгу. Если пароль не будет указан, то книга будет открыта в режиме “Только для чтения”
                    ReadOnlyRecommended
                    Variant
                    если параметр равен True

                    , то при открытии файла на дисплее появится сообщение, в котором рекомендуется, что бы файл был открыт только для чтения.
                    CreateBackup
                    Variant
                    True

                    , для того, чтобы создать резервный файл
                    AddToMru
                    Variant
                    True

                    , для того, чтобы добавить имя сохраняемого файла в список недавно открытых файлов в главном меню Excel

                    TextCodepage
                    и TextVisualLayout
                    Variant
                    в настоящее время не используются и сохранены для обеспечения обратной совместимости
                    Local
                    Variant
                    не обязательный параметр, по-умолчанию равен False.
                    Значение True
                    — сохранение файлов с языковыми Microsoft Excel (в том числе настройки панели управления).

                    MyExcel.ActiveWorkBook.ActiveWorkSheet.SaveAs(«C:MyExcelFile.xls»)

                    В этом случае при сохранении будут использованы настройки по умолчанию.

                    Если Вам необходимо сохранить файл Excel в другом формате, то в параметре FileFormat
                    можно использовать одно из значений перечислителя xlFileFormat

                    . Некоторые значения xlFileFormat

                    представлены в таблице ниже:

                    Имя
                    Значение
                    Описание
                    Расширение файла
                    xlCSV 6 CSV *.csv
                    xlExcel8 56 Книга Excel 97-2003 *.xls
                    xlHtml 44 Формат HTML *.htm; *.HTML
                    xlOpenDocumentSpreadsheet 60 Электронная таблица OpenDocument *.ods
                    xlOpenXMLWorkbook 51 Книга Open XML *.xlsx

                    Напишем небольшую процедуру, позволяющую сохранять лист Excel в различных форматах:

                    const

                    xlCSV =
                    6
                    ;

                    xlExcel8 =
                    56
                    ;

                    xlHtml =
                    44
                    ;

                    xlOpenDocumentSpreadsheet =
                    60
                    ;

                    xlOpenXMLWorkbook =
                    51
                    ;

                    resourcestring

                    rsESaveActiveSheet =
                    «Ошибка сохранения активного листа книги»
                    ;

                    procedure
                    SaveAs(const
                    AFileName:
                    TFileName;
                    AFileFormat:
                    integer
                    )
                    ;

                    begin

                    try

                    MyExcel.
                    ActiveWorkBook
                    .
                    ActiveSheet
                    .
                    SaveAs
                    (AFileName,
                    AFileFormat)
                    ;

                    except

                    raise
                    Exception.
                    Create
                    (rsESaveActiveSheet)
                    ;

                    end
                    ;

                    end
                    ;

                    Метод Delete

                    Удаление рабочего листа Excel.

                    MyExcel.ActiveWorkBook.WorkSheets.Item.Select

                    Выделяет третий лист книги

                    Метод Copy

                    Копирование листа в другое место в рабочей книге.

                    Вызов метода:

                    expression.Copy(Before, After)

                    При этом, если вы используете параметр Before
                    , то вы не должны использовать After
                    и наоборот. Обращу Ваше внимание, что указывается именно ЛИСТ, а не индекс листа.

                    Как копировать лист Excel в Delphi?

                    MyExcel.ActiveWorkBook.WorkSheets.Item.Copy(After:=MyExcel.ActiveWorkBook.WorkSheets.Item)

                    В этом случае первый лист будет скопирован и вставлен после третьего.

                    Метод Paste

                    Вставка содержимого буфера обмена на лист Excel.

                    Вызов метода:

                    expression.Paste(Destination, Link)

                    Как вставить содержимое буфера обмена на лист Excel в Delphi?

                    MyExcel.ActiveWorkBook.ActiveSheet.Paste(Destination:=MyExcel.ActiveWorkBook.ActiveSheet.Range(«D1:D5»))

                    В этом случае содержимое буфера будет вставлено в столбец D в строки с 1 по 5. Следует отметить, что если содержимое буфера не удовлетворяет условию, например в буфере только 1 число, то вызывается исключительная ситуация.

                    Метод ChartObjects

                    Возвращает объект, который представляет собой либо одну диаграмму (объект ChartObject
                    ) или совокупность всех диаграмм (объект ChartObjects
                    ) на листе.

                    Вызов метода:

                    expression.ChartObjects

                    Как получить диаграмму на листе Excel в Delphi?

                    MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects

                    В этом случае будет получена первая .

                    Метод Move

                    Перемещение листа. Этот метод аналогичен методу . Различие лишь в том, что после вcтавки копируемый лист удаляется из книги.

                    Вот та часть методов, которые я использовал когда-либо при работе с Excel

                    в Delphi

                    . Вообще можно сказать, что в Delphi

                    можно управлять MS Excel

                    не хуже, чем при непосредственной работе с этим приложением, главное не забывать, какой метод или свойство за что отвечает:). Ну, а для того, чтобы не забыть, я создал небольшой MindMap , который буду периодически дополнять и обновлять. Перейдя по ссылке, Вы сможете посмотреть объекты Excel, методы ими используемые, параметры методов и их типы в соответствии с типами Delphi. В общем небольшая графическая шпаргалка для любителей поразбираться с Excel в Delphi.

                    Обмен данными с MS Excel
                    в Delphi
                    при помощи OLE
                    .

                    Здравствуйте уважаемые коллеги!

                    Все мы рано или поздно сталкиваемся с задачами обмена данных с приложениями пакета MS Office
                    . Одно из них — это MS Excel
                    . И именно о взаимодействии с данным продуктом MS Office
                    пойдет речь в данной статье.

                    Один из способов взаимодействия Delphi
                    c MS Excel
                    — это подключиться к нему как к OLE
                    объекту.

                    Итак.
                    Прежде всего для работы с MS Excel
                    и OLE
                    добавим в секцию Uses
                    модули ComObj
                    и ActiveX
                    .

                    И первое что нам нужно проверить, а установлен ли MS Excel
                    на компьютере пользователя в принципе.
                    Для этого воспользуемся функцией CLSIDFromProgID
                    , которая ищет в реестре CLSID
                    для переданного ProgID
                    :
                    Справка из MSDN: Метод CLSIDFromProgID

                    Параметры:
                    pszProgID
                    : POleStr
                    — Строка с именем объекта
                    clsid
                    : TCLSID
                    — Указатель на структуру TGUID
                    в которую передается найденный объект;
                    Возвращает:
                    HRESULT
                    — Результат, который может принимать значения:
                    S_OK
                    — объект найден;
                    CO_E_CLASSSTRING
                    — Зарегистрированный CLSID
                    для ProgID
                    является недействительным;
                    REGDB_E_WRITEREGDB
                    — Ошибка записи CLSID
                    в реестр.
                    Из перечисленных результатов нам нужен S_OK
                    .
                    Напишем функию для определения наличия Excel
                    у пользователя:

                    Function IsXlsInstall: boolean;
                    var
                    CLSID: TCLSID;
                    begin
                    Result:= (CLSIDFromProgID(«Excel.Application», CLSID) = S_OK);
                    end;

                    Если Excel
                    установлен, тогда выполним подключение к нему. Сделать это можно двумя способами: GetActiveOleObject
                    — Получить ссылку на уже запущенный экземпляр Excel
                    или CreateOleObject
                    — Создать новый экземпляр Excel
                    .
                    Если у нас стоит задача получать данные из запущенного Excel
                    , тогда мы должны использовать только первый вариант, в остальных случаях пробуем подключиться и если не получается, то создаем.
                    Напишем 2 функции, для подключения XlsConnect
                    и запуска нового XlsStart
                    :
                    Добавим переменную FXlsApp
                    с типом Variant
                    , которая будет содержать в себе ссылку на объект Excel
                    .

                    Private
                    FXlsApp: variant;
                    ***
                    function XlsConnect: boolean;
                    begin
                    Result:= False;
                    try
                    FXlsApp:= GetActiveOleObject(«Excel.Application»);
                    Result:= True;
                    except
                    end;
                    end;
                    procedure XlsStart;
                    begin
                    FXlsApp:= CreateOleObject(«Excel.Application»);
                    end;

                    Теперь можно добавить кнопку, на клик которой подключимся к MS Excel
                    используя написанные функции:

                    Procedure btnConnectClick(Sender: TObject);
                    begin
                    if not IsXlsInstall then
                    raise Exception.Create(«Приложение MS Excel не найдено на данном компьютере!»);
                    if not XlsConnect then
                    XlsStart;
                    FXlsApp.Visible:= True;
                    end;

                    По умолчанию окно Excel
                    запускается в фоновом режиме. Строка FXlsApp.Visible:= True;
                    делает фоновое окно Excel
                    видимым.

                    Окно Excel
                    запускается пустое и в него нужно добавить рабочую книгу. Делается это при помощи метода WorkBooks.Add
                    , который добавляет новую книгу или открывает ранее сохраненную, если указать путь к файлу.
                    Добавим процедуру, которая будет это делать:

                    Procedure XWorkbookAdd(const FilePath: string = «»);
                    begin
                    FXlsApp.WorkBooks.Add(FilePath);
                    end;

                    Книга добавлена, теперь попробуем записать что-нибудь в неё.

                    FXlsApp.Cells := «Тестовая строка»;

                    Где Row
                    — индекс строки, и Col
                    — индекс столбца, которые начинаются с единицы.

                    FXlsApp.Range[«A1»] := «Ячейка А1»;

                    Где Range
                    — массив ячеек, а А1
                    — привычные для Excel
                    координаты ячейки.
                    В качестве координат может быть указан диапазон. Например, код

                    FXlsApp.Range[«A3:A10»] := 5;

                    заполнит цифрой 5 все ячейки с А3
                    по А10
                    , а код

                    FXlsApp.Range[«A3:A10»].Interior.Color:= clMoneyGreen;

                    выделит тот же диапазон светло-зеленым цветом.
                    В обратную сторону, то есть для получения данных из Excel
                    , работает так же. Строка

                    ShowMessage(FXlsApp.Cells);

                    Выведет сообщение с содержимым ячейки с координатами: Строка=5, Столбец=1.

                    После того, как мы произвели необходимые нам манипуляции с Excel
                    , мы можем сохранить полученную книгу в файл следующей командой:

                    FXlsApp.ActiveWorkbook.SaveAs(«C:Test.xlsx»);

                    Где ActiveWorkbook
                    — текущая книга.
                    И закрыть приложение Excel
                    командой:

                    FXlsApp.Quit;

                    Как понимаете этим возможности управления Excel
                    из Delphi
                    не ограничиваются. И есть один достаточной простой способ узнать, как выполнить необходимо действие с Excel
                    из Delphi
                    .
                    Называется оно — Макросы.

                    Представим, что нам необходимо выполнить объединение нескольких ячеек в одну и мы не знаем как это сделать. Но хотим узнать. Для этого выполняем следующие шаги:
                    1. Запускаем Excel
                    и создаем пустую книгу.
                    2. Запускаем команду «Записать макрос», по умолчанию название макроса будет «Макрос1». (В разных версиях Excel
                    данная команда находится в разных пунктах меню).
                    3. Выделяем некоторый диапазон ячеек и нажимаем кнопку «Объединить и поместить в центре».
                    4. Останавливаем запись макроса.
                    5. Вызываем список макросов и выбираем там свой записанный макрос.
                    6. Нажимаем кнопку «Изменить»
                    Запускается редактор Microsoft Visual Basic for Application
                    в котором видим код проделанных действий:

                    Sub Макрос1()
                    »
                    » Макрос1 Макрос
                    »
                    With Selection
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlBottom
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = False
                    .ReadingOrder = xlContext
                    .MergeCells = False
                    End With
                    Selection.Merge
                    End Sub

                    Давайте разберем по подробнее, что же такого он нам тут написал:
                    With Selection
                    — Для выделенного диапазона ячеек настраиваем свойства:
                    HorizontalAlignment = xlCenter
                    — Горизонтальная ориентация = по центру.
                    VerticalAlignment = xlBottom
                    — Вертикальная ориентация — по нижнему краю.
                    WrapText = False
                    — Перенос текста по словам — выключен.
                    Orientation = 0
                    — Ориентация 0 градусов.
                    AddIndent = False
                    — Использование автоматического отступа вкл/выкл.
                    IndentLevel = 0
                    — Уровень отступа в 0.
                    ShrinkToFit = False
                    — Сжимать текст по размерам столбца вкл/выкл.
                    ReadingOrder = xlContext
                    — Порядок чтения по контексту.
                    MergeCells = False
                    — Объединенные ячейки вкл/выкл
                    End With
                    — Конец секции работы с выделенным диапазоном.
                    Selection.Merge
                    — Объединить выделенный диапазон.

                    Теперь попробуем объединить ячейки из Delphi:

                    Выделяем нужный нам диапазон.

                    FXlsApp.Selection.MergeCells:= True;

                    Объединяем ячейки задав свойство. Или при помощи метода:

                    FXlsApp.Selection.Merge;

                    Таким способом можно получать код практически для любых необходимых манипуляций.
                    А если какое-то свойство или метод вызывает вопросы, то можно воспользоваться справкой на MSDN.

                    Обратите внимание на особенность работы с массивами в VBA
                    . Индексы в массивах в Delphi
                    оборачиваются в квадратные скобки, в то время как в VBA
                    они будут в круглых. И код в Delphi

                    FXlsApp.Range[«B5:C8»].Select;

                    в VBA
                    будет выглядеть как

                    Range(«D5:H14»).Select;

                    Ниже приведу небольшой FAQ
                    по вопросу взаимодействия с Excel
                    из Delphi

                    Как определить значения констант в Excel для использования в Delphi?

                    В редакторе VBA
                    ставим точку остановки напротив интересующей константы. Нажимаем выполнить и когда выполнение остановиться, наводим на интересующую константу:

                    Как отключить выводы сообщений в Excel?

                    FXlsApp.DisplayAlerts:= False;

                    Как получить список книг из Excel?

                    For i:= 1 to FXlsApp.Workbooks.Count do
                    ListBox1.Items.Add(FXlsApp.Workbooks.Item[i].Name);

                    Как отключить отображение сетки?

                    FXlsApp.ActiveWindow.DisplayGridlines:= False;

                    Как вывести текущий лист на предпросмотр печати?

                    FXlsApp.ActiveWindow.SelectedSheets.PrintPreview;

                    Как выделить жирным часть текста в ячейки?

                    Var
                    Row: integer; // Индекс строки
                    Col: integer; // Индекс ячейки
                    TextSelStart: integer; // Начиная с символа
                    TextSelLength: integer; // Кол-во выделенных символов
                    begin
                    FXlsApp.Cells.Characters(TextSelStart, TextSelLength).Font.Bold:= True;
                    end;

                    Как выполнить автоподбор высоты строки для склеенной ячейки?

                    Var
                    merge_area: variant;
                    cell_width,
                    cells_width,
                    i: integer
                    begin
                    // Сохраняем диапазон склеенных ячеек в переменную
                    merge_area:= FXlsApp.Range[«D5»].MergeArea;
                    // Сохраняем ширину ячейки, для которой будем подбирать высоту
                    cell_width:= FXlsApp.Range[«D5»].ColumnWidth;
                    cells_width:= 0;
                    for i:= 1 to merge_area.Columns.Count do
                    // Получаем общую ширину всех столбцов склеенного диапазона
                    cells_width:= cells_width + merge_area.Columns[i].ColumnWidth;
                    // Разъединяем ячейки
                    merge_area.UnMerge;
                    // Устанавливаем ширину интересуемой ячейки равной общей ширине
                    FXlsApp.Range[«D5»].ColumnWidth:= cells_width;
                    // Вызываем стандартный метод автоподбора высоты строки
                    FXlsApp.Rows.EntireRow.AutoFit;
                    // Возвращаем исходную ширину интересуемой ячейки
                    FXlsApp.Range[«D5»].ColumnWidth:= cell_width;
                    // Склеиваем обратно диапазон
                    merge_area.Merge;
                    end;

                    Как получить используемый диапазон ячеек?

                    Result:= exApp.ActiveSheet.UsedRange;

                    Как получить букву столбца по индексу?

                    Uses Math;
                    ***
                    function ColIdxToStr(const Col: integer): string
                    const
                    CharsCount: integer = 26;
                    Offset: integer = 64;
                    var
                    Rank: byte;
                    Col, Tmp: integer;
                    begin
                    Result:= «»;
                    while Col > 0 do begin
                    Rank:= 0;
                    Tmp:= Col;
                    while Tmp > CharsCount do begin
                    Tmp:= Ceil(Tmp / CharsCount — 1);
                    Inc(Rank);
                    end;
                    Result:= Result + Chr(Tmp + Offset);
                    Col:= Col — Trunc(Power(CharsCount,Rank)) * Tmp;
                    end;
                    end;

                    Очень многие документы создаются и хранятся в формате электронных таблиц Microsoft Excel. Несмотря на то, что эти таблицы обладают возможностями для автоматической обработки документа, нам, дельфистам, гораздо приятнее работать в привычной среде, что которая и обладает к тому же гораздо более развитыми возможностями. Давайте посмотрим, как получать данные из Excel. Естественно, табличные данные будем размещать в привычную нам таблицу StringGrid.

                    Для работы с Excel и другими программами из пакета Microsoft Office необходимо добавить в список uses
                    модуль ComObj:

                    unit
                    Unit1;

                    interface

                    uses

                    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                    Dialogs, StdCtrls, Grids, ComObj
                    ;

                    var

                    Form1: TForm1;
                    Excel: Variant;

                    Далее, нужно создать объект Excel. Excell Application создаётся пустым, без таблиц, поэтому необходимо добавить хотя бы одну книгу. Делать это нужно в каком-либо обработчике, например обработчике нажатия кнопки, хотя можно и сразу в OnCreate Формы:

                    Excel:=CreateOleObject(«Excel.Application»);
                    Excel.Application.WorkBooks.Add(«Имя_Файла.xls»);

                    Если создаётся пустая книга, метод Add применяется без параметра — без имени файла. Естественно, можно предложить пользователю выбрать файл:

                    with
                    OpenDialog1 do

                    if
                    Execute then

                    Excel.Application.WorkBooks.Add(FileName);

                    Для отладки необходимо, чтобы таблица Excel была видимой, а также лучше запретить задавать вопросы о сохранении данных при закрытии:

                    Excel.Visible:=True; //После отладки можно закомментировать эту строку


                    Excel.DisplayAlerts:=False;

                    Сразу создайте метод закрытия объекта Excel, иначе при отладке, да и при работе пользователя в компьютере наплодится столько невидимых процессов Excel, что мама дорогая!.. В обработчике OnCloseQuery Формы напишите:

                    try

                    Excel.Quit;
                    except

                    end;

                    CanClose:=True;

                    Естественно, будет произведён выход из Excel, и затем закроется всё приложение. Но если нам нужно после закрытия процесса Excel продолжить работу с программой, то этот код помещается в обработчик нажатия кнопки. Однако, в данном случае его недостаточно. Попробуйте, и вы убедитесь, взглянув в список процессов в Диспетчере Задач, что наш процесс Excel жив и здоров! Это произошло потому, что он остаётся связанным с переменной, его создавшей (Excel же). Для реального уничтожения процесса нужно разорвать эту связь. Дополните вышеприведённый код строкой:

                    Excel:=Unassigned;

                    И при нажатии кнопки закрытия наш Excel исчезнет из списка процессов.

                    Теперь нужно получить данные из Excel. В Excel столбцы именуются буквами, но мы в Delphi обращаемся к ним привычно, по порядковым номерам. Обратите внимание, что, поскольку в Delphi первым в индексе идёт индекс столбца, а в таблице Excel индекс строки, то индексы должны быть расположены на противоположных местах. В обработчике нажатия кнопки:

                    with
                    StringGrid1 do

                    for
                    i:=1 to
                    RowCount-1 do

                    for
                    j:=1 to
                    ColCount-1 do

                    Cells:=Excel.WorkSheets.Item[«Лист1»].Cells;

                    Маленькое предупреждение: если при отладке проверять внесение данных, то перед нажатием нашей кнопки нужно завершить ввод в Excel — нажать Enter. Ведь если ячейка таблицы Excel останется в режиме редактирования, то мы получим отказ от Excel.
                    И ещё. Данные в Excel адресуются начиная с 1. Попытка получить содержимое фиксированных ячеек не удаётся. Поэтому фиксированные ячейки в таблице StringGrid при необходимости нужно заполнять самому, отдельно.

                    А получить содержимое одной ячейки можно как указав номер строки и столбца, так и непосредственно указав адрес ячейки:

                    var
                    S1, S2: String
                    ;
                    begin

                    S1:=Excel.WorkSheets.Item[«Лист1»].Cells;
                    S2:=Excel.WorkSheets.Item[«Лист1»].Range[«F5»];
                    end;

                    В переменных S1 и S2 будет одинаковое значение.

                    Теперь в таблице StringGrid мы имеем данные для обработки, и делаем с ними что хотим. Затем можно перенести обработанные данные назад в таблицу Excel. Делается это совершенно аналогично, в обработчике нажатия другой кнопки:

                    for
                    i:=1 to
                    Grid.RowCount-1 do

                    for
                    j:=1 to
                    Grid.ColCount-1 do

                    Excel.WorkSheets.Item[«Лист1»].Cells:=Grid.Cells;

                    Если эти операции производятся с активным листом Excel, то можно сократить написание, и вместо:

                    Excel.WorkSheets.Item[«Лист1»].Cells

                    Excel.Cells

                    Или можно создать переменную и присвоить ей значение того листа Excel, с которым производится работа:

                    var
                    Sheet: Variant;
                    S1, S2: String;
                    begin

                    Sheet:=Excel.WorkSheets.Item[«Лист1»];
                    S1:=Sheet.Cells;
                    S2:=Sheet.Range[«F5»];
                    end;

                    Только имейте в виду, что таблица может содержать не только данные непосредственно в ячейках, но и формулы. При записи данных из нашей таблицы StringGrid всё, кроме непосредственно записываемого текста, будет уничтожено!

                    Напоследок нужно заставить таблицу Excel сохранить обработанные данные:

                    Excel.ActiveWorkbook.SaveAs(«Имя_Файла»);//Или SaveAs(«OpenDialog1.FileName»);

                    Можно вывести отчёт на печеть. Вот как задана функция печати:

                    function
                    PrintOut(
                    From: Variant;//Необязательно. Номер срааницы с которой начинается печать.


                    To: Variant;//Необязательно. Номер страницы по какую продолжается печать.


                    Copies: Variant;//Необязательно. Количество копий.


                    Preview: Variant;//Необязательно. Предварительный просмотр (True
                    или False
                    ).


                    ActivePrinter: Variant;//Необязательно. Имя активного принтера.


                    PrintToFile: Variant; True
                    печать будет идти в файл.


                    Collate: Variant//Необязательно. При значении True
                    копии страниц объединяются.


                    ): Workbook;

                    Воспользоваться этой функцией можно как методом переменной, указывающей страницу — Sheet
                    (также Excel.ActiveWorkBook
                    или Excel.WorkSheets
                    ):

                    Sheet.PrintOut(1, 1, 1, False, True);

                    Будет произведён вывод на печать с первой страницы по первую, одной копии, без предварительного просмотра, без указания принтера — печать идёт в файл. Предварительно будет выдан запрос на указание имени файла. Создаётся файл типа *.xps
                    . Для его просмотра нужны специальные программы.

                    Естественно, в Delphi можно осуществлять также и форматирование ячеек, и другие операции с таблицей Excel. Эту информацию добавлю чуть позже. А пока на первый раз достаточно.

                    Работа с регионом ячеек Excel

                    Продолжить хочу с того факта, что операции чтения и записи данных по одной ячейке занимают довольно много времени — вы уже и сами наверное заметили. Есть способ ускорить этот процесс. Для этого нужно освоить несложные операции работы с регионом ячеек Excel.

                    Регион ячеек таблицы Excel также имеет тип Variant и задаётся прямоугольником, с указанием левой верхней и правой нижней ячеек:

                    Var Range: Variant;
                    begin

                    end;

                    В частности, регион может состоять и из одной ячейки:

                    Range:=Excel.Range, Excel.Cells];

                    Эту запись проще выполнить с указанием адреса как в таблице Excel:

                    Range:=Excel.Range[«A1»];

                    Также можно задать и прямоугольный регион, если вам известны имена ячеек. Вот регион 4х4:

                    Range:=Excel.Range[«A1:D4»];

                    А вот как выполнить перепись региона 100Х100 ячеек Excel в таблицу StringGrid:

                    var
                    Range: Variant;
                    i, j: Integer;
                    begin

                    Range:=Excel.Range, Excel.Cells];
                    with
                    StringGrid1 do

                    for
                    i:=1 to
                    100 do

                    for
                    j:=1 to
                    100 do

                    Cells:=Range.Cells;
                    end;

                    Вот и всё! На моём компьютере, эта операция переписи региона 100х100 ячеек Excel в таблицу StringGrid длится около 300 мсек, что на 2 порядка быстрее, чем чтение и запись по одной ячейке.

                    А, например, операция занесения какого-либо одного значения во все ячейки региона выполняется ещё проще. Занесём в наш вышеопределённый регион 100х100 слово «Привет» :

                    Excel.Range, Excel.Cells]:=»Привет»;

                    Очистка региона выполняется методом Clear:

                    Excel.Range, Excel.Cells].Clear;

                    Понравилась статья? Поделить с друзьями:
                  • Delphi как заменить в word текст
                  • Delphi как выгрузить в excel
                  • Delphi имена листов excel
                  • Delphi замена в колонтитулах word
                  • Delphi если файл excel не открыт