Delphi excel проверить а не открыт ли уже файл

1 / 1 / 0

Регистрация: 07.01.2017

Сообщений: 69

1

12.01.2017, 13:08. Показов 6211. Ответов 8


Студворк — интернет-сервис помощи студентам

Помогите пожалуйста нужно проверить открыт ли конкретный excel файл и если да, то закрыть его.(delphi)



0



5501 / 4296 / 1379

Регистрация: 14.04.2014

Сообщений: 19,295

Записей в блоге: 19

12.01.2017, 14:16

2

эмм, он открыт в Excel, и надо прибить Excel ?



0



Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

12.01.2017, 16:17

3

Markontr, пригодится для Excel



0



Markontr

1 / 1 / 0

Регистрация: 07.01.2017

Сообщений: 69

17.01.2017, 14:19

 [ТС]

4

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

Delphi
1
2
3
4
5
6
7
8
9
Ap.Workbooks.Open(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 Ap.WorkSheets[1].Activate;
 d:=Ap.ActiveSheet.UsedRange.Rows.Count+1;// подсчет кол-во знятых строк+1
    Ap.Cells.Item[d,1] :=Edit9.Text;
 Ap.DisplayAlerts:=False;
 Ap.ActiveWorkbook.SaveAs(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 showmessage('сохранил ');
 Ap.ActiveWorkbook.Close;
 Ap.Application.Quit;



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

17.01.2017, 15:45

5

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

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

я же Вам дал ссылку выше. Стоило посмотреть самому

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure OpenWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  CheckExtension(WorkBookName);
  if VarIsEmpty(Excel) = true then
  begin
    Excel := CreateOleObject('Excel.Application');
    Excel.Visible := true;
  end;
  k := WorkBookIndex(WorkBookName);
  if k = 0 then
    Excel.Workbooks.Open(WorkBookName)
  else
    MessageDlg('Книга с таким именем уже открыта.', mtWarning, [mbOk], 0);
end;

Следует учитывать взаимосвязь процедур и функции в приведенной статье. Например, функция WorkBookIndex() — отдельная функция и приведена там же.



0



1 / 1 / 0

Регистрация: 07.01.2017

Сообщений: 69

17.01.2017, 15:46

 [ТС]

6

Благодарю



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

17.01.2017, 15:49

7

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

и закрывала его

Из той же статьи

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure CloseWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  if VarIsEmpty(Excel) = false then
  begin
    k := WorkBookIndex(WorkBookName);
    if k <> 0 then
      Excel.ActiveWorkbook.Close(WorkBookName)
    else
      MessageDlg('Книга с таким именем отсутствует.', mtWarning, [mbOk], 0);
  end;
end;

Все будет красиво оформлено. Главное — правильно применить!



0



1 / 1 / 0

Регистрация: 07.01.2017

Сообщений: 69

17.01.2017, 15:50

 [ТС]

8

Все все, спасибо большое. Принял!



0



droider

17.01.2017, 15:53


    Проверить открыт ли файл excel, если да закрыть

Не по теме:

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

Принял

;) Good



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

17.01.2017, 15:53

9

    msm.ru

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

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

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


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


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


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

    >
    Как узнать, что файл Excel уже открыт?

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



    Сообщ.
    #1

    ,
    24.12.03, 12:20

      мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем.
      Как можно проверить, что его кто-то уже открыл?

      ЗЫ. И как можно сделать, чтобы ексель не спрашивал при сохранении, куда и что сохранять, а просто сохранял, куда скажут (программно) и в каком формате?

      Сообщение отредактировано: Voice — 24.12.03, 12:32


      QUE



      Сообщ.
      #2

      ,
      24.12.03, 13:42

        Цитата
        Voice,  <b>сегодня в</b> 15:20

        В FAQ …. И читать … читать ….


        Voice



        Сообщ.
        #3

        ,
        25.12.03, 08:55

          Там этого нету……


          filh



          Сообщ.
          #4

          ,
          25.12.03, 10:27

            Full Member

            ***

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

            Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл???
            Да, файл создается, но для просмотра его не существует!

            dry.gif

            Может на мысль натолкнет

            smile.gif


            Guest



            Сообщ.
            #5

            ,
            25.12.03, 13:06

              так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
              Нет ли флага какого, что файл занят или как-то еще?


              Voice



              Сообщ.
              #6

              ,
              26.12.03, 07:58

                так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
                Нет ли флага какого, что файл занят или как-то еще?


                filh



                Сообщ.
                #7

                ,
                29.12.03, 08:39

                  Full Member

                  ***

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

                  Нашел :)

                  ExpandedWrap disabled

                    FileOpen(‘e:1.xls’, fmShareExclusive);

                  При возвращении -1 файл открыт, все что >0 никто не использует.
                  Делаешь проверку перед открытием и все.
                  Для примера взят файл 1.xls
                  Но! если файла не существует, FileOpen будет <0

                  Сообщение отредактировано: filh — 29.12.03, 08:43


                  n0wheremany



                  Сообщ.
                  #8

                  ,
                  29.12.03, 12:45

                    Чел, юзай череп (свой)!
                    Если файл открыт, то открыто окно!!

                    >>> Поищи окна (задачу)


                    Voice



                    Сообщ.
                    #9

                    ,
                    29.12.03, 13:17

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал :)
                      if Excel.WorkBooks[1].ReadOnly then…..

                      Добавлено в 29.12.03, 13:29:

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал ;)
                      if Excel.WorkBooks[1].ReadOnly then…..
                      Но скорее, воспользуюсь твоим методом, т.к. Excel.WorkBooks[1].ReadOnly возвратит true, даже если файл никем не открыт, но просто имеет атрибут «для чтения»
                      а если FileOpen(‘e:1.xls’, fmShareExclusive)<0 можно проверить и на существование файла
                      например
                      if FileOpen(‘e:1.xls’, fmShareExclusive)<0 then
                      if FileExists(‘e:1.xls’) then
                      …………….
                      спасибо :rolleyes:

                      n0wheremany
                      Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм) :angry:
                      Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ) <_<


                      filh



                      Сообщ.
                      #10

                      ,
                      30.12.03, 04:50

                        Full Member

                        ***

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

                        Цитата

                        n0wheremany от 29.12.03, 15:45
                        Если файл открыт, то открыто окно!!
                        >>> Поищи окна (задачу)

                        А если придется открывать файл по сети? Что тогда?


                        Song



                        Сообщ.
                        #11

                        ,
                        30.12.03, 06:12

                          Цитата

                          filh, 30.12.03, 07:50
                          А если придется открывать файл по сети? Что тогда?

                          А что, от этого окна не появляется?


                          n0wheremany



                          Сообщ.
                          #12

                          ,
                          30.12.03, 07:54

                            Цитата

                            n0wheremany
                            Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм)
                            Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ)

                            Это ты зря память сканить не надо!

                            ExpandedWrap disabled

                              function tform1.listprocesses:string;

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if result=» then result:=’ ‘+StrPas(buff) else result:=result+’#13#10’+’ ‘+StrPas(buff);

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Вот адаптированная для тебя

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Проверь и посмотри!!

                            Добавлено в 30.12.03, 07:58:
                            Чуть чуть ошибся

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=false;                  {<<<<<<<<<<<}

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;


                            Петрович



                            Сообщ.
                            #13

                            ,
                            30.12.03, 08:00

                              Цитата

                              Song, 30.12.03, 09:12
                              А что, от этого окна не появляется?

                              Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                              А еще, можно открыть файл через COM интерфейс, не порождая при этом окон.


                              filh



                              Сообщ.
                              #14

                              ,
                              30.12.03, 08:52

                                Full Member

                                ***

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

                                Song,

                                Цитата

                                Петрович от 30.12.03, 11:00
                                Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                                Об этом я и говорил.


                                Song



                                Сообщ.
                                #15

                                ,
                                30.12.03, 09:01

                                  Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1!
                                  Мы что, сканим на предмет окон с Comp2 ?

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

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

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

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0451 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                                  Содержание

                                  1. Delphi проверить открыт или нет excel
                                  2. Delphi проверить открыт или нет excel
                                  3. Работа с Excel в Delphi. Основы основ.
                                  4. Введение
                                  5. 1. Как проверить установлен ли Excel на компьютере пользователя?
                                  6. Как проверить открыт ли в Excele нужный файл
                                  7. 8 ответов
                                  8. Excel в Delphi
                                  9. Работа с Excel в Delphi. Основы основ
                                  10. Excel в Delphi. Методы объекта WorkSheet (лист)
                                  11. Диаграммы Excel в Delphi. Общие сведения
                                  12. Excel в Delphi. Работа с объектом Range (диапазон)
                                  13. Excel в Delphi. Как изменить внешний вид ячеек?
                                  14. Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
                                  15. Быстрая обработка данных Excel в Delphi
                                  16. Пост-ответ. Работа с примечаниями в Excel
                                  17. Excel в Delphi. Работа со свойствами документа
                                  18. Создаем свои контролы на ленте Microsoft Office

                                  Delphi проверить открыт или нет excel


                                  >| 2005-02-28 17:18 ) [1]

                                  Можна например так
                                  GetPidFromProcessName(«EXCEL.EXE») <> $FFFF
                                  но это как-то неправильно.


                                  MU ( 2005-02-28 17:21 ) [2]

                                  может,
                                  function GetActiveOleObject(const ClassName: string): IDispatch;


                                  wild_arg © ( 2005-02-28 17:22 ) [3]

                                  if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation, [mbYes,mbNo],0)=mrYes
                                  then
                                  //открыт
                                  else
                                  //не открыт

                                  🙂 сорьки, не удержался.


                                  pasha_golub © ( 2005-02-28 17:25 ) [4]

                                  wild_arg © (28.02.05 17:22) [3]
                                  LOL

                                  MU (28.02.05 17:21) [2]
                                  ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..

                                  function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «. по непонятным причинам»


                                  MU ( 2005-02-28 17:28 ) [6]

                                  2 pasha_golub ©
                                  подойдет


                                  ArchValentin © ( 2005-02-28 18:10 ) [7]

                                  не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow , и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.


                                  Ольга ( 2005-02-28 18:25 ) [8]

                                  А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.


                                  aus ( 2005-02-28 18:30 ) [9]

                                  ArchValentin © (28.02.05 18:10) [7]
                                  не гони, я ведь имею право свой хелловорлд назвать «MS Exel»


                                  > [3] wild_arg © (28.02.05 17:22)
                                  > if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
                                  > [mbYes,mbNo],0)=mrYes
                                  > then
                                  > //открыт
                                  > else
                                  > //не открыт

                                  С точки зрения программиста, пользователь — это периферийное устройство,
                                  вводящее набор символов в ответ на команду READ. 🙂


                                  GanibalLector © ( 2005-03-01 02:10 ) [11]

                                  Вариант№1(облегченный)

                                  var Excels:Variant;
                                  begin
                                  try
                                  try
                                  Excels:=GetActiveOleObject(«Excel.Application»);
                                  finally
                                  //значит есть 😉
                                  Excels:=Unassigned;
                                  end;
                                  except
                                  MessageDlg(«Нет его тут!»,mterror,[MbOk],0);
                                  end;
                                  end;


                                  GanibalLector © ( 2005-03-01 02:16 ) [12]

                                  Вариант №2(с коннектом)
                                  var Excels:Variant;
                                  n:integer;
                                  begin
                                  try
                                  try
                                  Excels:=GetActiveOleObject(«Excel.Application»);
                                  Caption:=»Найдено документов:»+ IntToStr(Excels.WorkBooks.Count);
                                  for n:=1 to Excels.WorkBooks.Count do
                                  begin
                                  if AnsiSameText(«E:Kharkov.xls»,Excels.Workbooks[n].FullName) then
                                  begin
                                  // тут работаем
                                  Excels.WorkBooks[1].WorkSheets[1].Name:=»Привет из Харькова!»;
                                  //
                                  end;
                                  end;
                                  finally
                                  Excels:=Unassigned;
                                  end;
                                  except
                                  MessageDlg(«Excel не найден!»,mterror,[MbOk],0);
                                  end;
                                  end;


                                  GanibalLector © ( 2005-03-01 02:22 ) [13]

                                  2 >|И еще,хотел поинтересоваться.
                                  В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try . except не помешали .
                                  З.Ы.Пардон,если что.


                                  ArchValentin © ( 2005-03-01 03:41 ) [14]


                                  > aus (28.02.05 18:30) [9]

                                  . и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))

                                  Источник

                                  Delphi проверить открыт или нет excel

                                  Как узнать, запущен ли Excel(2000) и закрыть его в случае необходимости?


                                  Гость Бывалый ( 2005-09-19 15:41 ) [1]

                                  Есть такое «Я его породил, я его и убью» (с).
                                  Может нехорошо закрывать программу открытую не Вами ? Обьясните причину.


                                  Rouse_ © ( 2005-09-19 15:42 ) [2]

                                  AppProgId := «Excel.Application»;
                                  AResult := GetActiveObject(ProgIDToClassID(AppProgId), nil, Unknown);
                                  if (AResult <> MK_E_UNAVAILABLE) then
                                  begin
                                  App := GetActiveOleObject(AppProgId);
                                  App.Quit;
                                  end;


                                  Новый Гость ( 2005-09-19 16:13 ) [3]


                                  > Гость Бывалый

                                  Идет обмен данными по DDE между программой и открытым в Excel документом — открытие происходит непосредственно перед обменом командой ShellExecute — поэтому, если до запуска файла Excel не был открыт, то по завершении работы его необходимо закрыть, иначе просто закрыть рабочий файл. Закрыть файл по DDE получается ([CLOSE]), а закрыть весь Excel нет ([QUIT]).

                                  Источник

                                  Работа с Excel в Delphi. Основы основ.

                                  Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
                                  Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

                                  Введение

                                  Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
                                  Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

                                  Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.

                                  Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

                                  1. Как проверить установлен ли Excel на компьютере пользователя?

                                  Создаем новый модуль (unit) и подключаем в uses следующие модули:

                                  Источник

                                  Как проверить открыт ли в Excele нужный файл

                                  Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.

                                  Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.

                                  8 ответов

                                  Я бы сделал бы так

                                  Sub Макрос1()
                                  Dim WB As Workbook
                                  Dim myWorkBook As String

                                  myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
                                  On Error Resume Next
                                  Windows(myWorkBook).Activate
                                  If Err.Number = 9 Then
                                  MsgBox «Книга » & myWorkBook & » не открыта!», , «»
                                  End If
                                  On Error GoTo 0
                                  End Sub

                                  Sub Макрос2()
                                  Dim WB As Workbook
                                  Dim myWorkBook As String

                                  myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
                                  For Each WB In Application.Workbooks
                                  If WB.Name = myWorkBook Then
                                  Windows(WB.Name).Activate
                                  End
                                  End If
                                  Next
                                  If ActiveWorkbook.Name <> myWorkBook Then MsgBox «Книга » & myWorkBook & » не открыта!», , «»
                                  End Sub

                                  первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel’я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.

                                  пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).

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

                                  может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё

                                  Проверяй на существование экземпляр Excel.

                                  Function CheckWorksheet(strName As String) As Boolean

                                  On Error Resume Next
                                  Dim pExcel As Excel.Application
                                  ‘Получаем объект
                                  Set pExcel = GetObject(class:=»Excel.Application»)

                                  If Not pExcel Is Nothing Then
                                  Dim wb As Workbook

                                  Источник

                                  Excel в Delphi

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

                                  Работа с Excel в Delphi. Основы основ

                                  Это вводная статья по работе с excel в delphi, которая поможет вам разобраться с основами по взаимодействия вашего приложения Delphi и Microsoft Excel. В статье рассмотрены следующие вопросы:

                                  Excel в Delphi. Методы объекта WorkSheet (лист)

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

                                  Диаграммы Excel в Delphi. Общие сведения

                                  В статье рассмотрен способ добавления диаграммы в лист Excel через объект ChartObjects. План статьи следующий:

                                  Excel в Delphi. Работа с объектом Range (диапазон)

                                  Статья дает более полное представление о том, как можно работать с данными листа Excel в Delphi, используя объект Range (диапазон). Рассмотрены свойства и методы объекта range. План статьи:

                                  Excel в Delphi. Как изменить внешний вид ячеек?

                                  В статье рассматриваются вопросы оформления ячеек таблицы Excel в Delphi:

                                  Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот

                                  В статье рассматривается достаточно нетривиальный вопрос: как добраться до диаграммы Excel, внедренной в документ Word и работать с ней в Delphi? Статья состоит из трех частей:

                                  Быстрая обработка данных Excel в Delphi

                                  Эта статья раскрывает вопросы, касающиеся быстрой обработки данных при работе с Excel в Delphi. Одной из проблем, с которой сталкиваются начинающие разработчики, является то, что рассмотренные в предыдущих статьях методы чтения/записи данных в Excel работают очень медленно при большом количестве данных. Статья позволяет понять то, как сократить время операций при работе с Excel в Delphi в несколько раз, используя вариантные массивы и библиотеку XLSReadWrite.

                                  Пост-ответ. Работа с примечаниями в Excel

                                  В статье рассматривается то, как, используя Delphi вставлять и редактировать примечания в ячейках Excel. План статьи:

                                  Excel в Delphi. Работа со свойствами документа

                                  Статья раскрывает вопросы изменения свойств документа Excel в Delphi и состоит из трех частей:

                                  Создаем свои контролы на ленте Microsoft Office

                                  Небольшая заметка о том, как получить доступ у ленте Excel и добавить на неё свою кнопку.

                                  Эти и другие статьи, посвященные работе с Excel в Delphi вы всегда сможете найти в блоге по тегу Excel в Delphi

                                  Источник

                                   
                                  }|{yk ©
                                   
                                  (2005-02-28 17:11)
                                  [0]

                                  Собственно.


                                   
                                  }|{yk ©
                                   
                                  (2005-02-28 17:18)
                                  [1]

                                  Можна например так
                                  GetPidFromProcessName("EXCEL.EXE")  <> $FFFF
                                  но это как-то неправильно…


                                   
                                  MU
                                   
                                  (2005-02-28 17:21)
                                  [2]

                                  может,
                                  function GetActiveOleObject(const ClassName: string): IDispatch;


                                   
                                  wild_arg ©
                                   
                                  (2005-02-28 17:22)
                                  [3]

                                  if MessageDlg("А не открыт ли у Вас Excel?", mtConfirmation, [mbYes,mbNo],0)=mrYes
                                  then
                                   //открыт
                                  else
                                   //не открыт

                                  :) сорьки, не удержался…


                                   
                                  pasha_golub ©
                                   
                                  (2005-02-28 17:25)
                                  [4]

                                  wild_arg ©   (28.02.05 17:22) [3]
                                  LOL

                                  MU   (28.02.05 17:21) [2]
                                  ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..


                                   
                                  Ольга
                                   
                                  (2005-02-28 17:27)
                                  [5]

                                  function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «… по непонятным причинам»


                                   
                                  MU
                                   
                                  (2005-02-28 17:28)
                                  [6]

                                  2 pasha_golub ©
                                   подойдет


                                   
                                  ArchValentin ©
                                   
                                  (2005-02-28 18:10)
                                  [7]

                                  не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow, и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.


                                   
                                  Ольга
                                   
                                  (2005-02-28 18:25)
                                  [8]

                                  А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.


                                   
                                  aus
                                   
                                  (2005-02-28 18:30)
                                  [9]

                                  ArchValentin ©   (28.02.05 18:10) [7]
                                  не гони, я ведь имею право свой хелловорлд назвать «MS Exel»


                                   
                                  Алхимик ©
                                   
                                  (2005-02-28 18:40)
                                  [10]


                                  > [3] wild_arg ©   (28.02.05 17:22)
                                  > if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
                                  > [mbYes,mbNo],0)=mrYes
                                  > then
                                  >  //открыт
                                  > else
                                  >  //не открыт

                                  С точки зрения программиста, пользователь — это периферийное устройство,
                                  вводящее набор символов в ответ на команду READ. :)


                                   
                                  GanibalLector ©
                                   
                                  (2005-03-01 02:10)
                                  [11]

                                  Вариант№1(облегченный)

                                   var Excels:Variant;
                                  begin
                                   try
                                     try
                                       Excels:=GetActiveOleObject("Excel.Application");
                                     finally
                                       //значит есть ;)
                                       Excels:=Unassigned;
                                     end;
                                   except
                                     MessageDlg("Нет его тут!",mterror,[MbOk],0);
                                   end;
                                  end;


                                   
                                  GanibalLector ©
                                   
                                  (2005-03-01 02:16)
                                  [12]

                                  Вариант №2(с коннектом)
                                   var Excels:Variant;
                                       n:integer;
                                  begin
                                   try
                                     try
                                       Excels:=GetActiveOleObject("Excel.Application");
                                       Caption:="Найдено документов:"+ IntToStr(Excels.WorkBooks.Count);
                                       for n:=1 to Excels.WorkBooks.Count do
                                       begin
                                         if AnsiSameText("E:Kharkov.xls",Excels.Workbooks[n].FullName) then
                                         begin
                                           // тут работаем
                                           Excels.WorkBooks[1].WorkSheets[1].Name:="Привет из Харькова!";
                                           //
                                         end;
                                       end;
                                     finally
                                       Excels:=Unassigned;
                                     end;
                                   except
                                     MessageDlg("Excel не найден!",mterror,[MbOk],0);
                                   end;
                                  end;


                                   
                                  GanibalLector ©
                                   
                                  (2005-03-01 02:22)
                                  [13]

                                  2 }|{yk ©
                                  И еще,хотел поинтересоваться…
                                  В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try … except не помешали .
                                  З.Ы.Пардон,если что…


                                   
                                  ArchValentin ©
                                   
                                  (2005-03-01 03:41)
                                  [14]


                                  > aus   (28.02.05 18:30) [9]

                                  …и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))


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

                                  Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
                                  Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

                                  Введение

                                  Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
                                  Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

                                  Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.

                                  Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

                                  Создаем новый модуль (unit) и подключаем в uses следующие модули:

                                  uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;

                                  теперь объявляем глобальную переменную:

                                  Одну константу (для удобства):

                                  const ExcelApp = 'Excel.Application';

                                  И пишем простенькую функцию:

                                  function CheckExcelInstall:boolean;
                                  var
                                    ClassID: TCLSID;
                                    Rez : HRESULT;
                                  begin
                                  // Ищем CLSID OLE-объекта
                                    Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID);
                                    if Rez = S_OK then  // Объект найден
                                      Result := true
                                    else
                                      Result := false;
                                  end;

                                  Или ещё короче:

                                  function CheckExcelInstall: boolean;
                                  var
                                    ClassID: TCLSID;
                                  begin
                                    Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
                                  end;

                                  Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно — Excel установлен.

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

                                  2. Определяем запущен ли Excel

                                  function CheckExcelRun: boolean;
                                  begin
                                    try
                                      MyExcel:=GetActiveOleObject(ExcelApp);
                                      Result:=True;
                                    except
                                      Result:=false;
                                    end;
                                  end;

                                  Думаю тут лишних объяснений не потребуется? Всё предельно просто — если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное — не забыть проверить — может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.

                                  3. Как запустить Excel?

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

                                  function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
                                  begin
                                    try
                                  {проверяем установлен ли Excel}
                                      if CheckExcelInstall then
                                        begin
                                          MyExcel:=CreateOleObject(ExcelApp);
                                  //показывать/не показывать системные сообщения Excel (лучше не показывать)
                                          MyExcel.Application.EnableEvents:=DisableAlerts;
                                          MyExcel.Visible:=Visible;
                                          Result:=true;
                                        end
                                      else
                                        begin
                                          MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR);
                                          Result:=false;
                                        end;
                                    except
                                      Result:=false;
                                    end;
                                  end;

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

                                  Также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel — пользователь может занервничать.

                                  Переходим к следующему этапу работы — созданию рабочей книги.

                                  4. Создаем пустую рабочую книгу Excel

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

                                  function AddWorkBook(AutoRun:boolean=true):boolean;
                                  begin
                                    if CheckExcelRun then
                                      begin
                                        MyExcel.WorkBooks.Add;
                                        Result:=true;
                                      end
                                    else
                                     if AutoRun then
                                       begin
                                         RunExcel;
                                         MyExcel.WorkBooks.Add;
                                         Result:=true;
                                       end
                                     else
                                       Result:=false;
                                  end;

                                  Второй вариант (более лаконичный):

                                  function AddWorkBook(AutoRun: boolean = true): boolean;
                                  begin
                                    Result := CheckExcelRun;
                                    if (not Result) and (AutoRun) then
                                    begin
                                      RunExcel;
                                      Result := CheckExcelRun;
                                    end;
                                    if Result then
                                      MyExcel.WorkBooks.Add;
                                  end;

                                  То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу — всё зависит от ситуации.

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

                                  function GetAllWorkBooks:TStringList;
                                  var i:integer;
                                  begin
                                    try
                                      Result:=TStringList.Create;
                                      for i:=1 to MyExcel.WorkBooks.Count do
                                        Result.Add(MyExcel.WorkBooks.Item[i].FullName)
                                    except
                                      MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR);
                                    end;
                                  end;

                                  Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.

                                  Ну, и наконец, после того, как поработали с книгами — их требуется закрыть. Точнее сохранить, а потом уж закрыть.

                                  5. Сохраняем рабочую книгу и закрываем Excel

                                  Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:

                                  function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean;
                                  begin
                                    try
                                      MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName);
                                      if MyExcel.WorkBooks.Item[WBIndex].Saved then
                                        Result:=true
                                      else
                                        Result:=false;
                                    except
                                      Result:=false;
                                    end;
                                  end;

                                  Если у Вас открыто 10 книг — просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.

                                  А закрывается Excel вот так:

                                  function StopExcel:boolean;
                                  begin
                                    try
                                      if MyExcel.Visible then MyExcel.Visible:=false;
                                      MyExcel.Quit;
                                      MyExcel:=Unassigned;
                                      Result:=True;
                                    except
                                      Result:=false;
                                    end;
                                  end;

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

                                  Книжная полка

                                  Название:Разработка приложений Microsoft Office 2007 в Delphi

                                  Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

                                  купить книгу delphi на ЛитРес

                                  5
                                  3
                                  голоса

                                  Рейтинг статьи

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

                                  Like this post? Please share to your friends:
                                • Delphi excel поиск по ячейкам
                                • Delphi excel открыть один лист
                                • Delphi excel объединенные ячейки в excel
                                • Delphi excel не найдено
                                • Delphi excel не закрывать