Delphi если файл excel не открыт

Содержание

  1. Клёвый код
  2. Решаем задачи Абрамян на C. Matrix78
  3. Решаем задачи Абрамян на C. Matrix77
  4. Решаем задачи Абрамян на C. Matrix76
  5. Решаем задачи Абрамян на C. Matrix75
  6. Решаем задачи Абрамян на C. Matrix74
  7. Решаем задачи Абрамян на C. Matrix73
  8. Решаем задачи Абрамян на C. Matrix72
  9. Решаем задачи Абрамян на C. Matrix71
  10. Решаем задачи Абрамян на C. Matrix70
  11. Решаем задачи Абрамян на C. Matrix69
  12. Delphi если файл excel не открыт
  13. Работа с Excel в Delphi. Основы основ.
  14. Введение
  15. 1. Как проверить установлен ли Excel на компьютере пользователя?
  16. Delphi если файл excel не открыт
  17. Delphi если файл excel не открыт

Клёвый код

Скриптописание и кодинг

Решаем задачи Абрамян на C. Matrix78

Matrix78. Дана матрица размера $$M times N$$. Упорядочить ее строки так, чтобы их минимальные элементы образовывали убывающую последовательность.

Решаем задачи Абрамян на C. Matrix77

Matrix77. Дана матрица размера $$M times N$$. Упорядочить ее столбцы так, чтобы их последние элементы образовывали убывающую последовательность.

Решаем задачи Абрамян на C. Matrix76

Matrix76. Дана матрица размера $$M times N$$. Упорядочить ее строки так, чтобы их первые элементы образовывали возрастающую последовательность.

Решаем задачи Абрамян на C. Matrix75

Matrix75. Дана матрица размера $$M times N$$. Элемент матрицы называется ее локальным максимумом, если он больше всех окружающих его элементов. Поменять знак всех локальных максимумов данной матрицы на противоположный. При решении допускается использовать вспомогательную матрицу.

Решаем задачи Абрамян на C. Matrix74

Matrix74. Дана матрица размера $$M times N$$. Элемент матрицы называется ее локальным минимумом, если он меньше всех окружающих его элементов. Заменить все локальные минимумы данной матрицы на нули. При решении допускается использовать вспомогательную матрицу.

Решаем задачи Абрамян на C. Matrix73

Matrix73. Дана матрица размера $$M times N$$. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений.

Решаем задачи Абрамян на C. Matrix72

Matrix72. Дана матрица размера $$M times N$$. Перед первым столбцом, содержащим только положительные элементы, вставить столбец из единиц. Если требуемых столбцов нет, то вывести матрицу без изменений.

Решаем задачи Абрамян на C. Matrix71

Matrix71. Дана матрица размера $$M times N$$. Продублировать столбец матрицы, содержащий ее минимальный элемент.

Решаем задачи Абрамян на C. Matrix70

Matrix70. Дана матрица размера $$M times N$$. Продублировать строку матрицы, содержащую ее максимальный элемент.

Решаем задачи Абрамян на C. Matrix69

Matrix69. Дана матрица размера $$M times N$$ и целое число $$K$$ $$(1 le K le $$N$$)$$. После столбца матрицы с номером $$K$$ вставить столбец из единиц.

Источник

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 попадалась :)))

Источник

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

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

Введение

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

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

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

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

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

Источник

Delphi если файл excel не открыт

Только начинаю осваивать сей продукт, Поэтому нужна помощь!

Нужно нажатием кнопки открыть файл Excel, если файл уже открыт(но является свернутым) выдать сообщени («файл уже открыт») и развернуть его на рабочий стол!

и если возможно то перед открытием файла включить проверку на наличие открытой книги на другой машине! (Допустим Книга 1 находится на сетевом диске к которому имеют доступ несколько человек. Так вот если 1-н сотрудник уже использует Книгу 1, а второй в это время пытается ее открыть, то 2-у вылетает сообщение эта книга уже используется!)

Помогите! Очень нужно!

Все еще актуально!!

Изменю суть вопроса

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

3) Каким образом можно запустить макрос в Excel е не запуская самого файла (не открывая его)

Неуж то нет идей.

Наверника есть ответ хотя бы на 1 вопрос.

По первому вопросу немного уточню! Есть папка, в которой лежит куча файлов Excel. В програмке подразумевается форма настройки. В этой форме мы задаем Эту общую папку желательно через окно открытия. Каждый файл Excel открывается отдельной кнопкой, так вот Можно сделать так чтобы путь к этому файлу брался из настройки (сам файл остается не изменным Т.е. имя его постоянно!) Единственное может менятся местонахождения всех файлов. Так вот, чтобы не менять туть для каждого отдельного файла возникла идея выбора папки с этими файлами!

Вот только как ее осуществит не знаю!

Подскажите.

Источник

Delphi если файл excel не открыт

Только начинаю осваивать сей продукт, Поэтому нужна помощь!

Нужно нажатием кнопки открыть файл Excel, если файл уже открыт(но является свернутым) выдать сообщени («файл уже открыт») и развернуть его на рабочий стол!

и если возможно то перед открытием файла включить проверку на наличие открытой книги на другой машине! (Допустим Книга 1 находится на сетевом диске к которому имеют доступ несколько человек. Так вот если 1-н сотрудник уже использует Книгу 1, а второй в это время пытается ее открыть, то 2-у вылетает сообщение эта книга уже используется!)

Помогите! Очень нужно!

Все еще актуально!!

Изменю суть вопроса

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

3) Каким образом можно запустить макрос в Excel е не запуская самого файла (не открывая его)

Неуж то нет идей.

Наверника есть ответ хотя бы на 1 вопрос.

По первому вопросу немного уточню! Есть папка, в которой лежит куча файлов Excel. В програмке подразумевается форма настройки. В этой форме мы задаем Эту общую папку желательно через окно открытия. Каждый файл 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,0390 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                                   
                                  }|{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 попадалась :)))


                                  I am having difficulty opening a EXCEL 2007 in Delphi 7 It works for Office 2003 and below but the wonderful people at microsoft have sent an update or something and the delphi app fell over just earlier this month.

                                    oE := GetActiveOleObject('Excel.Application');
                                    oE.Workbooks.Open(Filename:=sFilename, UpdateLinks:=false, ReadOnly:=true); //Error
                                  

                                  I get the following error:

                                  ‘c:TempBook1.xls’ could not be
                                  found. Check the spelling of the file
                                  name, and verify that the file
                                  location is correct.’#$A#$A’If you are
                                  trying to open the file from your list
                                  of most recently used files, make sure
                                  that the file has not been renamed,
                                  moved, or deleted’

                                  Yet if I run the same command in VBA there is no problem.

                                  RRUZ's user avatar

                                  RRUZ

                                  134k19 gold badges355 silver badges483 bronze badges

                                  asked Jun 17, 2010 at 6:47

                                  Traci's user avatar

                                  2

                                  I know this sounds stupid, but have you manually confirmed that the file exists at that location?

                                  What exactly is the contents of sFileName, is it the full path or only the filename? When it is only the filename, maybe Excel can’t find it because its current working directory is something else. If you are only passing the filename, try the full path instead.

                                  answered Jun 17, 2010 at 7:02

                                  The_Fox's user avatar

                                  The_FoxThe_Fox

                                  6,9422 gold badges43 silver badges69 bronze badges

                                  3

                                  the full code for the lookers :

                                  uses ComObj; ..
                                  
                                  procdure startExcel; 
                                  var   
                                    oE:Variant; 
                                  begin
                                    try 
                                      oE := GetActiveOleObject('Excel.Application');
                                    except
                                      oE := CreateOleObject('Excel.Application'); 
                                    end; 
                                    oE.Workbooks.Open(filename, false, false);
                                    oE.Visible := True; 
                                  end;
                                  

                                  source

                                  answered Mar 2, 2011 at 16:29

                                  none's user avatar

                                  nonenone

                                  4,59814 gold badges59 silver badges100 bronze badges

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

                                  Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
                                  Как ни крути, а время 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
                                  голоса

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

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




                                  Подготовка

                                  Откроем нашу среду разработки Delphi (в моем случае это Delphi 2010). Создадим новый проект. Должен сказать, что работа с Excel происходит через объекты COM. Поэтому нам надо подключить в раздел

                                  USES

                                  нашего проекта модуль

                                  COMObj

                                  . Так же нам понадобится модуль

                                  ActiveX

                                  . Это будет выглядеть примерно вот так:

                                  unit Unit1;
                                   
                                  interface
                                   
                                  uses
                                    Windows,, ActiveX, COMObj;



                                  Проверка наличия установленного Microsoft Excel в операционной системе

                                  Теперь собственно нам нужно, как писалось выше, определить наличие Excel в системе. Если он не будет обнаружен, то мы сообщим об этом пользователю и завершим программу. Для этого создадим простенькую функцию и объявим её в секции

                                  private

                                  нашей формы

                                  TForm1

                                  :

                                  private
                                      function CheckExcelInstalled(AValue: String): boolean;function TForm1.CheckExcelInstalled(AValue: String): boolean;
                                  var
                                    FCLSID: TCLSID;
                                  begin
                                    Result := (CLSIDFromProgID(PChar(AValue), FCLSID) = S_OK);
                                  end;

                                  Функция

                                  CLSIDFromProgID

                                  определена в модуле

                                  ActiveX

                                  и имеет следующее описание:

                                  function CLSIDFromProgID(pszProgID: POleStr; out clsid: TCLSID): HResult;

                                  Данная функция ищет

                                  CLSID

                                  , по соответствующему

                                  ProgID

                                  в реестре, в нашем случае мы ищем «Excel.Application». Если открыть реестр и перейти к ветке:


                                  HKEY_LOCAL_MACHINESOFTWAREClasses

                                  то там можно будет обнаружить много разделов. Среди них есть как раз нужный нам «Excel.Application» (при условии, что данное ПО установлено в системе). К сведению: у этого раздела имеется еще два подраздела:


                                  HKEY_LOCAL_MACHINESOFTWAREClassesExcel.ApplicationCLSID

                                  HKEY_LOCAL_MACHINESOFTWAREClassesExcel.ApplicationCurVer

                                  Параметры функции:



                                  pszProgID

                                  : строка, содержащая ProgID.



                                  clsid

                                  : получает CLSID.

                                  Возвращаемые значения:



                                  S_OK

                                  — CLSID создан успешно.



                                  CO_E_CLASSSTRING

                                  — CLSID зарегистрированный для ProgID неверен.



                                  REGDB_E_WRITEREGDB

                                  — ошибка записи в реестр.



                                  E_OUTOFMEMORY

                                  — нет памяти.



                                  E_INVALIDARG

                                  — указывает что один или более аргументов неверны. Стоит проверить правильность строки pszProgID.



                                  E_UNEXPECTED

                                  — неизвестная ошибка.

                                  Теперь на событии

                                  OnCreate

                                  формы

                                  TForm1

                                  напишем следующий код:

                                  procedure TForm1.FormCreate(Sender: TObject);
                                  begin
                                    if not CheckExcelInstalled('Excel.Application') then
                                    begin
                                      Application.MessageBox(PChar('Для работы программы необходимо ' +
                                            'иметь установленное программное обеспечение Microsoft Excel.'#13#10
                                            + 'Приложение будет закрыто.'), 'Ошибка', MB_ICONERROR);
                                      Halt;
                                    end;
                                  end;

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

                                  Halt

                                  . Если находим, то просто показываем форму.



                                  Проверить, запущен ли Microsoft Excel

                                  Далее давайте кинем на форму одну кнопку TButton. На событии

                                  OnClick

                                  будем писать код работы с Excel. Первое что мы сделаем, это добавим локальную переменную типа

                                  Variant

                                  для доступа к Excel с именем, например,

                                  FExcel

                                  :

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

                                  private

                                  :

                                  privatefunction CheckExcelRun(AValue: String; var ADest: Variant): boolean;function TForm1.CheckExcelRun(AValue: String; var ADest: Variant): boolean;
                                  begin
                                    try
                                      ADest := GetActiveOleObject(AValue);
                                      Result := true;
                                    except
                                      Result := false;
                                    end;
                                  end;

                                  Функция

                                  GetActiveOleObject

                                  определена в модуле

                                  COMObj

                                  и имеет следующее описание:

                                  function GetActiveOleObject(const ClassName: string): IDispatch;

                                  Функция возвращает ссылку на интерфейс

                                  IDispatch

                                  активного OLE-объекта указанного класса. Она использует информацию из таблицы активных объектов OLE (OLE running object table). Идентификатор класса объекта OLE в таблице активных объектов OLE передается в параметре

                                  ClassName

                                  . При невозможности выполнения функции GetActiveOleObject возникает исключение EOleSysError.

                                  Теперь как пользоваться нашей функцией:

                                  procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                    FExcel: Variant;
                                  begin
                                    if not CheckExcelRun('Excel.Application', FExcel) then
                                      Exit;
                                  end; 

                                  Стоить пояснить. Если в системе запущена программа Excel, то функция

                                  GetActiveOleObject

                                  находит его, при этом функция

                                  CheckExcelRun

                                  возвращает

                                  TRUE

                                  . Ссылка на интерфейс передается через параметр «var ADest» нашей созданной переменной

                                  FExcel

                                  . Теперь вы можете работать с этим экземпляром Excel. Если же запущенный эксель не найден, то функция

                                  GetActiveOleObject

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

                                  try…except…end

                                  . Вот в секции

                                  except

                                  мы присваиваем результат

                                  FALSE

                                  и т.о. выходим из процедуры

                                  Button1Click

                                  с помощью метода

                                  Exit

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



                                  Создание нового экземпляра Microsoft Excel

                                  Создать новый экземпляр можно с помощью функции

                                  CreateOleObject

                                  . Давайте сразу напишем шаблон.

                                   procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                    FExcel: Variant;
                                  begin
                                    try
                                      // Создаем новый экземпляр Excel
                                      FExcel := CreateOleObject('Excel.Application');
                                      FExcel.Visible := true;
                                      ... // Тут ваш код
                                    finally
                                      // Если переменная не пустая, то...
                                      if not VarIsEmpty(FExcel) then
                                      begin
                                        // ...отключаем диалог с вопросом сохранять ли файл при выходе или нет
                                        FExcel.DisplayAlerts := false;
                                        // Закрываем Excel
                                        FExcel.Quit;
                                        // Присваиваем неопределенный тип, освобождая при этом 
                                        // процесс excel.exe, чтобы он мог завершиться. Если этого не
                                        // сделать, то процесс останется висеть в памяти.
                                        FExcel := Unassigned;
                                      end;
                                    end;
                                  end;

                                  Функция

                                  VarIsEmpty

                                  определена в модуле

                                  Variants

                                  и имеет следующее описание:

                                  function VarIsEmpty(const V: Variant): Boolean;

                                  Функция проверяет, определен ли тип значения

                                  Variant

                                  -переменной. Возвращает

                                  TRUE

                                  , если переменная имеет неопределенный тип (Unassigned). Если типу переменной соответствует значение какой-либо константы

                                  VarType

                                  типа

                                  TVarData

                                  , то функция возвращает

                                  FALSE

                                  .



                                  Операции над программой Microsoft Excel из Delphi

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

                                  Сервис – Макрос – Начать запись

                                  . Там жмем ОК и выполняем необходимые нам операции в Excel. Когда закончите, жмем на

                                  Стоп

                                  . Затем нажимаем комбинацию клавиш

                                  Alt+F11

                                  и перед нами открывается

                                  редактор Visual Basic

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

                                  Modules

                                  . В свою очередь в ней располагаются модули. Вот эти модули и есть ваши макросы. Кликнем два раза на тот модуль, который мы только что записали (если это первая запись, то модуль будет один). И тут будут отображены все ваши действия в виде исходного кода на языке Visual Basic. Вам остается только перевести это дело на Delphi.

                                  По поводу констант. В Delphi придется объявлять их самим. Посмотреть чему они равны можно в том же редакторе Visual Basic. Делается это так. Вписываем любую нужную нам константу в редакторе. Кликаем правой клавишей мыши, чтобы появилось контекстное меню. И там выбираем пункт

                                  «Quick Info»

                                  . При этом будет показана всплывающая подсказка со значением этой константы. Все просто! Единственное оговорюсь. В Visual Basic будет показано так, например:

                                  &HFFFFEFF4

                                  , но Delphi этого не поймет. Надо объявлять в нем так:

                                  $FFFFEFF4

                                  .


                                  Работа с окном (формой) Excel


                                  FExcel.Visible := true;


                                  Делать Excel видимым (True)/не видимым(False). При установке

                                  Visible

                                  в

                                  FALSE

                                  , программа Excel Так же пропадает из панели задач Windows.


                                  FExcel.Application.EnableEvents := false;


                                  Показывать (True)/не показывать(False) системные сообщения Excel. Рекомендую отключать сообщения при построении отчета. А сам код писать после создания экземпляра Excel. Это увеличит скорость создания отчета. Пример:

                                  FExcel := CreateOleObject('Excel.Application');
                                  FExcel.Visible := false;
                                  FExcel.Application.EnableEvents := false;


                                  FExcel.DisplayAlerts := false;


                                  Показывать (True)/не показывать(False) предупреждающие сообщения.


                                  FExcel.WindowState := xlMaximized;


                                  Состояние окна Excel:


                                  const xlMaximized = $FFFFEFD7 (или -4137)

                                  — развернуть Excel на весь экран.


                                  const xlNormal = $FFFFEFD1 (или -4143)

                                  — восстановить Excel.


                                  const xlMinimized = $FFFFEFD4 (или -4140)

                                  — свернуть Excel на панель задач.


                                  FExcel.ScreenUpdating := false;


                                  Включить (True)/отключить (False) перерисовку окон. Используется для ускорения работы макроса, т.к. в это время не обновляется экран. Я в своих проектах не использовал данный метод, но возможно построение отчета будет выполняться быстрее, если отключить обновление окон Excel. После построения отчета перерисовку окон можно будет включить обратно.


                                  Работа над книгой (Workbooks)


                                  FExcel.Workbooks.Open(path);


                                  Открытие существующей книги (где path — путь к фалу). Функция Open описана так:

                                  function Open(
                                    const Filename: String; 
                                    UpdateLinks: Variant; 
                                    ReadOnly: Variant;
                                    Format: Variant; 
                                    Password: Variant; 
                                    WriteResPassword: Variant; 
                                    IgnoreReadOnlyRecommended: Variant; 
                                    Origin: Variant;
                                    Delimiter: Variant; 
                                    Editable: Variant; 
                                    Notify: Variant;
                                    Converter: Variant; 
                                    AddToMru: Variant
                                  ): Workbook;


                                  FileName

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


                                  UpdateLinks

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

                                  0 – никакие связи не обновляются;

                                  1 – обновляются внешние ссылки, но не обновляются удаленные ссылки;

                                  2 – обновляются удаленные ссылки, но не обновляются внешние ссылки;

                                  3 – обновляются оба типа ссылок


                                  ReadOnly

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


                                  Format

                                  — необязательный параметр. При открытии текстового файла этот параметр определяет вид символов-разделителей. Ниже представлены допустимые значения данного аргумента:

                                  1 – символы табуляции;

                                  2 – запятые;

                                  3 – пробелы;

                                  4 – точка с запятой;

                                  5 – разделители отсутствуют;

                                  6 – вид разделителя определяется пользователем (с помощью параметра Delimiter).


                                  Password

                                  — необязательный параметр, задающий строку пароля, необходимого для открытия защищенной рабочей книги. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.


                                  WriteResPassword

                                  — необязательный параметр. Предназначен для задания пароля, необходимого для записи в рабочую книгу. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.


                                  IgnoreReadOnlyRecommended

                                  — необязательный параметр. В случае задания ему значения True этот аргумент позволяет устранить вывод сообщения с рекомендацией открытия книги только для чтения (в том случае, если данная рабочая книга была сохранена с параметром Read-Only Recommended).


                                  Origin

                                  — необязательный параметр. При открытии текстового файла этот параметр указывает, где был создан этот файл, что необходимо для правильного распознавания страницы кодировки. Значениями данного аргумента может быть одна из констант: xlMacintosh, xlWindows или xlMSDOS**. Если данный аргумент отсутствует, то используются текущие параметры операционной системы.


                                  Delimiter

                                  — необязательный параметр. Если открывается текстовый файл и параметр Format имеет значение, равное 6, то этот аргумент определяет символ-разделитель.


                                  Editable

                                  — необязательный параметр. Если файл является файлом MS Excel 4.0, то этот параметр при задании ему значения True позволяет открыть надстройку как видимое окно. По умолчанию ему присвоено значение False.


                                  Notify

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


                                  Converter

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


                                  AddToMRU

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



                                  Примечание:


                                  * Сообщения будут выведены на экран, если вы не отключили их с помощью:


                                  FExcel.Application.EnableEvents := false;


                                  Показывать (True)/не показывать(False) системные сообщения Excel.

                                  ** Delphi не знает о существовании констант, поэтому чтобы посмотреть их значения, нужно воспользоваться средствами VBA. Эти константы соответственно равны 1, 2 и 3.

                                  ***


                                  FExcel.SheetsInNewWorkbook := X;


                                  Задать количество страниц в книге, где X — это количество страниц. Диапазон значений 1..255. Данный метод применяется только с


                                  FExcel.Workbooks.Add;


                                  и в коде Delphi пишется перед методом Add.


                                  FExcel.Workbooks.Add(path);

                                  // path — путь к фалу

                                  Создание новой книги. Причем создается стандартная книга с тремя листами. В этом методе можно указать стандартный тип шаблона Excel. Если же в нем указать имя (с полным путем) подготовленного файла (шаблоном может быть и «обычный» файл XLS, а не только файл XLT), то можно открыть книгу на диске как шаблон.


                                  FExcel.Workbooks.Add(Template);


                                  Template — Необязательный параметр. Этот параметр определяет, как будет создана рабочая книга. Если этот параметр будет иметь значение строки, определяющей имя файла (включая путь) существующей рабочей книги, то создается рабочая книга с использованием данного файла как шаблона. В случае когда данный параметр является одной из констант:

                                  xlWBATExcel4IntlMacroSheet = 4;



                                  xlWBATExcel4MacroSheet = 3;



                                  xlWBATWorksheet = $FFFFEFB9 (или -4167);



                                  xlWBATChart = $FFFFEFF3 (или -4109);


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

                                  SheetslnNewWorkbook

                                  .

                                  ***


                                  FExcel.Workbooks[1].SaveAs(path);

                                  // path — путь к фалу

                                  Сохранить книгу как… Чтобы укоротить код можно создать переменную

                                  FWorkbook

                                  типа

                                  Variant

                                  и присвоить ей ссылку либо на первую[1] книгу, либо на вновь созданную:


                                  FWorkbook := FExcel.Workbooks[1];

                                  либо

                                  FWorkbook := FExcel.Workbooks.Add;


                                  Тогда сохранение может выглядеть вот так:


                                  FWorkbook.SaveAs(path);

                                  // path — путь к фалу

                                  Функция SaveAs описана так:

                                  function SaveAs(
                                    FileName: Variant; 
                                    FileFormat: Variant; 
                                    Password: Variant;
                                    WriteResPassword: Variant;
                                    ReadOnlyRecommended: Variant;
                                    CreateBackup: Variant;
                                    AccessMode: Variant;
                                    ConflictResolution: Variant;
                                    AddToMru: Variant;
                                    TextCodePage: Variant;
                                    TextVisualLayout: Variant
                                  ): Workbook;


                                  FileName

                                  — необязательный параметр. Задает строку, определяющую имя сохраняемого файла. Можно указать полный путь или только имя файла (в этом случае файл будет сохранен в текущей папке).


                                  FileFormat

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

                                  таблице 1

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

                                  Формат                                            Константа
                                   
                                  Книга MS Excel                                    xlWorkbookNormal
                                  Web-страница                                      xlHTML
                                  Шаблон                                            xlTemplate
                                  Текстовые файлы (с разделителями табуляции)       xlTextWindows
                                  Текст Юникод                                      xlUnicodeText
                                  Книга MS Excel 5.0/95                             xlExcel7
                                  Книга MS Excel 95/97/2000                         xlExcel9795
                                  CSV (разделители – запятые)                       xlCSVWindows
                                  Файл MS Excel 4.0                                 xlExcel4
                                  Файл MS Excel 3.0                                 xlExcel3
                                  Файл MS Excel 2.1                                 xlExcel2
                                  Книга MS Excel 4.0                                xlExcel4Workbook
                                  WK4 (1-2-3)                                       xlWK4
                                  WK3, FM3 (1-2-3)                                  xlWK3FM3
                                  WK3 (1-2-3)                                       xlWK3
                                  WK1, FMT (1-2-3)                                  xlWK1FMT
                                  WK1, ALL (1-2-3)                                  xlWK1ALL
                                  WK1 (1-2-3)                                       xlWK1
                                  WKS (1-2-3)                                       xlWKS
                                  WQ1 (Quattro Pro/Dos)                             xlWQ1
                                  DBF4 (dBase IV)                                   xlDBF2
                                  DBF3 (dBase III)                                  xlDBF3
                                  DBF2 (dBase II)                                   xlDBF4
                                  Форматированный текст (разделители – пробелы)     xlTextPrinter
                                  Текст (Macintosh)                                 xlTextMac
                                  Текст (MS-DOS)                                    xlTextMSDOS
                                  CSV (Macintosh)                                   xlCSVMac
                                  CSV (MS-DOS)                                      xlCSVMSDOS
                                  DIF (Data Interchange Format)                     xlDIF
                                  SYLK (Symbolic Link)                              xlSYLK
                                  Надстройка MS Excel                               xlAddln

                                  Таблица 1 — Форматы файлов MS Excel 2000 и соответствующие им константы.


                                  Password

                                  — необязательный параметр. Данный параметр определяет защитный пароль для сохраняемого файла. Пароль определяется строкой, содержащей не более 15 символов.


                                  WriteResPassword

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


                                  ReadOnlyRecommended

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


                                  CreateBackup

                                  — необязательный параметр. Определяет возможность создания резервного файла (значение True).


                                  AccessMode

                                  — необязательный параметр. Этот параметр определяет режим доступа к рабочей книге и может иметь одно из следующих значений:

                                  xINoChange – режим доступа не изменяется (равно 1);

                                  xlShared – общие листы (равно 2);

                                  xlExclusive – монопольный доступ (равно 3).


                                  ConflictResolution

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

                                  xlUserResolution — отображает окно диалога для разрешения конфликтов (равно 1);

                                  xlLocalSessionChanges — автоматически принимаются изменения локального пользователя (равно 2);

                                  xlOtherSessionChanges — принимаются другие изменения вместо изменений локального пользователя (равно 3).


                                  AddToMru

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


                                  TextCodePage

                                  — необязательный параметр. В локализованной версии MS Office не используется.


                                  TextVisualLayout

                                  — необязательный параметр. В локализованной версии MS Office не используется.

                                  ***


                                  FWorkbook.Save;


                                  Если книга была открыта, то файл перезапишется. Если была создана новая книга, то будет задан вопрос о сохранении файла. Если вы нажмете «Нет», то будет вызвано исключение.


                                  FWorkbook.Close;


                                  Закрыть книгу. При этом если Excel видимый, то появится диалог с вопросом, хотите ли вы сохранить файл.

                                  Функция Close описана так:

                                  function Close(
                                    SaveChanges: Variant; 
                                    FileName: Variant; 
                                    RouteWorkbook: Variant
                                  ): Workbook;


                                  SaveChanges

                                  — Необязательный элемент. Если данный параметр опущен, то будет выдан запрос на сохранение файла. Если равен

                                  FALSE

                                  , то книга закроется без сохранения и каких-либо оповещений, даже при установленном параметре

                                  FileName

                                  . Если равен

                                  TRUE

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


                                  FileName

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


                                  RouteWorkbook

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



                                  Примечание:

                                  если файл уже существует, то тогда будет выведен диалог с вопросом о перезаписи файла.


                                  Пример:

                                  // Отключаем предупреждающие сообщения,
                                  // в нашем случае чтобы не было вопроса о том,
                                  // перезаписывать ли файл, если таковой существует
                                  FExcel.DisplayAlerts := false;
                                  // Сохраняем книгу в файл "123.xls" на диск D:
                                  FWorkbook.Close(true, 'D:123.xls');


                                  Установка параметров страницы, предварительный просмотр и печать


                                  FExcel.Workbooks[1].WorkSheets[1] .Name := ‘Отчёт’;


                                  Присваиваем первому листу в первой книге имя «Отчет». Если будем работать с самим листом, то чтобы не писать много кода мы можем просто объявить новую переменную, например,

                                  FSheet

                                  типа

                                  Variant

                                  :

                                   procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                    FExcel, FSheet: Variant;
                                  begin
                                    try
                                      ... // Тут ваш код
                                    finally
                                      ...
                                        // Обязательно! нужно все созданные Variant-переменные 
                                        // очищать перед выходом
                                        FSheet := Unassigned;
                                        FExcel := Unassigned;
                                      ...
                                    end;
                                  end;



                                  Примечание

                                  : в принципе Delphi сама следит за корректным удалением переменных, но я считаю будем правильным сделать это вручную. Не стоит полагаться на систему.

                                  И присвоим ей ссылку на наш Лист1 первой книги:

                                  FSheet := FExcel.Workbooks[1].WorkSheets[1];
                                  FSheet.Name := 'Отчёт';

                                  Вот так вот будет проще. Теперь мы будет обращаться уже к переменной

                                  FSheet

                                  , а не к

                                  FExcel

                                  .


                                  FSheet.PageSetup.Orientation := 2;


                                  Ориентация страницы (1 – книжная, 2 – альбомная).


                                  FSheet.PageSetup.LeftMargin := X;


                                  Отступ от левого края страницы


                                  FSheet.PageSetup.RightMargin := X;


                                  Отступ от правого края страницы


                                  FSheet.PageSetup.TopMargin := X;


                                  Отступ от верхнего края страницы.


                                  FSheet.PageSetup.BottomMargin := X;


                                  Отступ от нижнего края страницы.


                                  FSheet.PageSetup.HeaderMargin := X;


                                  Высота верхнего колонтитула страницы.


                                  FSheet.PageSetup.FooterMargin := X;


                                  Высота нижнего колонтитула страницы.

                                  Где X — это отступ в пикселях. Можно в принципе воспользоваться функцией перевода из, например, сантиметров в пиксели. Делается это так:


                                  FSheet.PageSetup.BottomMargin := FExcel.Application.CentimetersToPoints(1.5);


                                  Это будет полтора сантиметра, а как там переводится в пиксели это не наша забота.


                                  FSheet.PageSetup.Zoom := false (или значение в процентах Z);


                                  Масштаб. Принимает следующие значения:


                                  Z

                                  — «Установить Z% от натуральной величины», где X – это количество процентов. Т.е. если вы решите включить масштабирование, то вам необходимо вместо

                                  FALSE

                                  подставить число, например: FSheet.PageSetup.Zoom := 100; (что означает 100%).


                                  FALSE

                                  — «Разместить не более чем на: X стр. в ширину и Y стр. в высоту, где:


                                  FSheet.PageSetup.FitToPagesWide := 1;


                                  Количество страниц в ширину (X).


                                  FSheet.PageSetup.FitToPagesTall := 100;


                                  Количество страниц в высоту (Y).


                                  FSheet.PageSetup.CenterFooter := ‘Стр. &С из &К’

                                  ;

                                  Центральный нижний колонтитул. В нем будет информации о номере страницы из всего страниц. Данные переменные (&C, &K и т.п.) описаны в справочнике самого Excel. Аналогично:


                                  FSheet.PageSetup.LeftFooter:=’Левый нижний колонтитул’;

                                  FSheet.PageSetup.RightFooter:=’Правый нижний колонтитул’;

                                  FSheet.PageSetup.LeftHeader:=’Левый верхний колонтитул’;

                                  FSheet.PageSetup.CenterHeader:=’Центральный верхний колонтитул’;

                                  FSheet.PageSetup.RightHeader:=’&7Правый верхний колонтитул’;

                                  *



                                  Примечание:

                                  *для изменения размера шрифта добавьте к колонтитулу управляющий символ «&» и размер шрифта, в нашем случае 7


                                  // const xlAutomatic = $FFFFEFF7 (или -4105)



                                  FSheet.PageSetup.FirstPageNumber := xlAutomatic;


                                  Номер первой страницы. В данном случае «Авто».


                                  FSheet.PageSetup.Order := 1;


                                  Последовательность вывода страниц на печать (1 — вниз, затем вправо; 2 — вправо, затем вниз).


                                  FSheet.PrintPreview;


                                  Предварительный просмотр страницы. Если вы не продолжите печать, а нажмете «Отмена», то будет вызвано исключение.



                                  Примечание

                                  : Excel, перед выполнением этой команды, обязательно должен быть видимым (FExcel.Visible := true;).


                                  FSheet.PrintOut;


                                  Вывод страницы на печать. Функция PrintOut описана так:

                                  function PrintOut(
                                    From: Variant; 
                                    To: Variant; 
                                    Copies: Variant;
                                    Preview: Variant;
                                    ActivePrinter: Variant;
                                    PrintToFile: Variant;
                                    Collate: Variant
                                  ): Workbook;


                                  From

                                  — необязательный параметр. Задает страницу, с которой начинается печать. Если этот аргумент отсутствует, то печать начинается с первой страницы.


                                  To

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


                                  Copies

                                  — необязательный параметр. Задает количество печатаемых копий.


                                  Preview

                                  — необязательный параметр, принимающий одно из двух значений:


                                  TRUE

                                  — приводит к выводу перед печатью окна предварительного просмотра;


                                  FALSE

                                  (значение по умолчанию) — печать производится без предварительного просмотра.


                                  ActivePrinter

                                  — необязательный параметр. Задает имя активного принтера.


                                  PrintToFile

                                  — необязательный параметр. Если данный параметр имеет значение True, то производится печать в файл. При этом пользователю выдается запрос на ввод имени файла.


                                  Collate

                                  — необязательный параметр. Если ему задать значение True, то копии будут объединены.

                                  Пример:

                                  FExcel.Application.EnableEvents := true;
                                  FExcel.DisplayAlerts := true;
                                  FExcel.Visible := true;
                                  FSheet.PrintOut(1, 2, 1, False, PrintToFile := True)

                                  Печатаем с 1 по 2 страницы, одну копию, без предварительного просмотра в файл. Заметьте, что мы пропустили параметр ActivePrinter. Мы просто объявили PrintToFile := True.

                                  ***



                                  Статья не окончена. Продолжение следует…

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

                                  1)

                                  www.taurion.ru/excel

                                  2)

                                  www.superadm.net/index.php?name=pages&op=cat&id=19

                                  3)

                                  www.afalinasoft.com/rus/tips/

                                  4)

                                  www.codenet.ru/progr/delphi/stat/Excel-Export.php

                                  Так же не обошлось без составления макросов в редакторе Visual Basic и последующим переводом кода из VBA в среду разработки Delphi 2010.

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