Delphi если excel не установлен

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

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

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

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

Подготовительные работы[]

Для работы с Excel в модуль Delphi подключаем следующие модули:

uses ComObj, ActiveX, Variants;

И объявляем переменную, которая будет являться ссылкой на Excel.

Запуск и остановка программы[]

Перед запуском Excel необходимо проверить, а установлен ли он:

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

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

Проверка на наличие запущенного Excel[]

function CheckExcelRun: boolean;
begin
  try
    MyExcel:=GetActiveOleObject('Excel.Application');
    Result:=True;
  except
    Result:=false;
  end;
end;

Запуск приложения[]

Excel запускается командой:

MyExcel:=CreateOleObject('Excel.Application');

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

MyExcel.Application.EnableEvents:=False; //Скрываем сообщения
MyExcel.Visible:=False; //Скрываем окно приложения

Функция для запуска приложения:

function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
begin
  try
{проверяем установлен ли Excel}
    if CheckExcelInstall then
      begin
        MyExcel:=CreateOleObject('Excel.Application');
//показывать/не показывать системные сообщения 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;

Информация взята с сайта webdelphi.ru

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

Недавно возникла мысль написать прогу генерирующую файлы формата Excel по готовому шаблону, при чём создание нового файла будет идти даже если приложение MS Excel не установлено!
Где то читал, что можно посредством sql запроса (подставляя из какой-нибудь БД в шаблон данные) делать подобное подключившись к книге Excel как к БД через драйвер MS Jet ole и динамически генерировать новую таблицу, может у кого есть примерчик? Если непонятно что я хочу, то вот краткое пояснение что должно получится:

Меня в основном интересует 3 пункт, но если есть полный готовый пример или написать его не составляет труда, то буду благодарен так как хочу научится данному приёму. :-)

1) есть готовый шаблон xls формата
2) приложение которое подключается к какой-нибудь БД с данными и выводит записи в DBGrid
3) При выделении какой-либо записи или нескольких записей в списке и нажатию кнопки формировать — создаётся новая таблица формата xls на основе шаблона (не изменяя его самого!) с подставленными данными.

Добавлено через 20 часов 16 минут
никто не подскажет?

Суперфункции EXCEL.
Суперфункции EXCEL.
Многие программисты и пользователи очень часто предпочитают вместо Word использовать Excel, потому что он особенно удобен для формирования сложных табличных отчетов. Если вы работаете с правовыми информационными системами, то обратили внимание, что все шаблоны, особенно всевозможные налоговые декларации, выполнены в формате Excel. В этой статье начинаем создавать отчеты в Excel из приложений, разрабатываемых в Delphi.
При решении широкого круга задач Excel обладает преимуществами по отношению к Word. Основным является возможность работы с таблицами, базами данных, большее удобство и гибкость в отображении информации. Возможно поэтому все большее количество сложных документов выполняются в формате Excel. Если вы используете Excel для печати отчетов, то ваши программы приобретут свойства, которые выгодно будут отличать их от аналогов.
Обратимся к постановке задачи. Нам необходимо сформировать документ из прикладной программы на языке Delphi. Как это сделать? Табличный редактор Excel представляет собой COM-сервер и может получать и обрабатывать запросы от внешних программ. Все это позволяет организовать процесс управления и создания документа из внешних программ. Используя этот механизм, можно создать документ программно — так же, как это делается вручную (посредством меню, кнопок и клавиатуры), но гораздо быстрей и эффектней.
Основными объектами, к которым можно обращаться из внешних программ, являются Excel.Application и Excel.Sheet.8. Используя их, можно получить доступ к объектам документа, например, к ячейкам, рисункам, автофигурам и к свойствам самого Excel. Используя основные объекты, можно создать и обращаться к объектам, созданными внешними серверами OLE. Общая объектная модель Excel представляет древовидную структуру и имеет следующий общий вид:
clip0071
Корневым объектом является Excel.Application. Коллекция Workbooks обеспечивает создание и доступ к любой книге, которая открыта в приложении. Объект Workbook, в свою очередь, содержит коллекцию Sheets, посредством которой можно создавать, удалять и получить доступ к листам документа. И конечный объект Range обеспечивает запись информации в ячейку. Кроме перечисленных, есть и другие объекты, которые будут рассмотрены в следующих частях статьи.
С чего можно начать программирование? Для начала создадим библиотеку, файл с расширением MyExcel.pas, и все функции для удобства будем размещать в ней. Определимся с набором необходимых функций. Самыми простыми и необходимыми являются следующие: активизация Excel, создание новой книги, открытие ранее созданной книги, отображение книги (книг) и приложения Excel, запись информации в ячейку, запись книги на диск и выход (закрытие книги и приложения). Для создания объекта Excel.Application используем переменную E типа variant и библиотеку ComObj.
Рассмотрим следующий фрагмент кода:

uses ComObj, Classes;
var E:variant;
Function CreateExcel:boolean;
begin
 CreateExcel:=true;
 try
 E:=CreateOleObject(‘Excel.Application’);
 except
 CreateExcel:=false;
 end;
end;
End;

Доступ к объекту Excel.Application в нашей функции CreateExcel получаем, используя процедуру CreateOleObject (‘Excel.Application’) стандартной библиотеки ComObj. Если редактор Excel не установлен в системе, то будет сгенерирована ошибка, и мы получим значение функции = false; если Excel установлен и объект будет создан, то получим значение функции = true. Эта функция создает объект E, свойства и методы которого мы будем использовать в дальнейшем. Если выполнить нашу функцию CreateExcel, то Excel будет запущен, но не будет отображен, потому что по умолчанию он запускается в фоновом режиме. Чтобы его активизировать (сделать видимым) или деактивировать (сделать невидимым), используем свойство visible объекта E. Оформим это в виде функции VisibleExcel. Скобки try except везде используются для обработки исключительных ситуаций.

Function VisibleExcel(visible:boolean): boolean;
begin
 VisibleExcel:=true;
 try
 E.visible:=visible;
 except
 VisibleExcel:=false;
 end;
End;

Используя эту функцию, мы можем показывать или скрывать Excel с документами.
Следующим шагом будет создание рабочей книги. Для этого используем метод Add, коллекции Workbooks объекта E. См. нижеописанный оператор, с помощью которого мы не только создаем новую книгу, но и получаем на нее ссылку: book_:=E. Workbooks.Add.

Function AddWorkBook:boolean;
begin
 AddWorkBook:=true;
 try
 E.Workbooks.Add;
 except
 AddWorkBook:=false;
 end;
End;

Чтобы открыть ранее созданную рабочую книгу, используем ту же коллекцию Workbooks объекта E и метод Open. Смотрите нижеописанный оператор, с помощью которого мы открываем рабочую книгу и получаем на нее ссылку: book_:= Workbooks. Open(file_). Функция OpenWorkBook открывает книгу и возвращает True в случае успешного выполнения.

Function OpenWorkBook(file_: string):boolean;
begin
 OpenWorkBook:=true;
 try
 E.Workbooks.Open(file_);
 except
 OpenWorkBook:=false;
 end;
End;

Работая с книгой, мы должны иметь возможность добавлять или удалять в ней листы и присваивать им имена. Для работы с листами книги используется коллекция Sheets. Добавить новый лист можно, используя метод Add этой коллекции. Функция AddSheet реализует эту возможность и присваивает новому листу выбранное пользователем имя.

Function AddSheet(newsheet:string):boolean;

begin

 AddSheet:=true;

 try

 E.Sheets.Add;

 E.ActiveSheet.Name:=newsheet;

 except

 AddSheet:=false;

 end;

End;

Создавая новые листы, мы должны иметь возможность и удалять их. Метод Delete, коллекции Sheets дает такую возможность. При удалении возможно появление диалогового окна Excel, которое потребует подтверждения операции. Чтобы отключить диалоговое окно Excel, необходимо использовать оператор E.DisplayAlerts:=False.

Function DeleteSheet(sheet:variant):boolean;

begin

 DeleteSheet:=true;

 try

 E.DisplayAlerts:=False;

 E.Sheets[sheet].Delete;

 E.DisplayAlerts:=True;

 except

 DeleteSheet:=false;

 end;

End;

Обычно книга Excel содержит более одного листа. Их количество содержится в свойстве Count коллекции Sheets. Для того, чтобы в Visual Basic получить имена листов текущей книги, используйте следующий оператор:
For a_ = 1 To Sheets.Count
MsgBox (Sheets.Item(a_).Name)
a_
Для активации любого листа книги необходимо использовать процедуру Select. Смотрите пример:
Sheets.Item(a_).Select
Все описанные выше возможности можно легко реализовать в Delphi как набор отдельных функций. Смотрите примеры:

Function CountSheets:integer; // получаем количество листов книги

begin

try

CountSheets:=E.ActiveWorkbook.Sheets.Count;

except

CountSheets:=-1;

end;

End;

Function GetSheets(value:TStrings):boolean;

// записываем листы книги в value

var a_:integer;

begin

GetSheets:=true;

value.Clear;

try

for a_:=1 to E.ActiveWorkbook.Sheets.Count do

value.Add(E.ActiveWorkbook.Sheets.Item[a_].Name);

except

GetSheets:=false;

value.Clear;

end;

End;

Function SelectSheet (sheet:variant):boolean;

// выбираем лист

begin

SelectSheet:=true;

try

E.ActiveWorkbook.Sheets.Item[sheet].Select;

except

SelectSheet:=false;

end;

End;

После внесения изменений необходимо сохранить рабочую книгу. Для этого используем метод SaveAs коллекции Workbooks или объекта ActiveWorkbook. Функция SaveWorkBookAs реализует эту возможность на Delphi. Используем E.DisplayAlerts:=False(True) для отключения (включения) диалогового окна подтверждения записи.

Function SaveWorkBookAs(file_:string): boolean;

begin

SaveWorkBookAs:=true;

try

E.DisplayAlerts:=False;

E.ActiveWorkbook.SaveAs(file_);

E.DisplayAlerts:=True;

except

SaveWorkBookAs:=false;

end;

End;

Одновременно может быть открыто несколько книг, в которые вносится или из которых получается информация. Их количество содержится в свойстве Count коллекции WorkBooks. Используя следующий оператор на Visual Basic, можем получить их имена.
For a_ = 1 To Application.Workbooks.Count
MsgBox (Application.Workbooks.Item(a_).Name)
a_
Для активации любой книги из списка используем процедуру Activate. Смотрите пример:
Windows(«Книга1»).Activate
Эти возможности можно реализовать в Delphi как набор отдельных функций.
Для закрытия книги используется метод Close коллекции Workbooks или объекта ActiveWorkbook. Функция CloseWorkBook закрывает активный документ.

Function CloseWorkBook:boolean;

begin

 CloseWorkBook:=true;

 try

 E.ActiveWorkbook.Close;

 except

 CloseWorkBook:=false;

 end;

End;

Excel закрывается методом Quit объекта Application.

Function CloseExcel:boolean;

begin

 CloseExcel:=true;

 try

 E.Quit;

 except

 CloseExcel:=false;

 end;

End;

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

procedure TForm1.Button1Click (Sender: TObject);

 var a_:integer;

begin

 if not CreateExcel then exit;

 messagebox(handle,»,‘Запускаем Excel.’,0);

 VisibleExcel(true);

 messagebox(handle,»,‘Отобразили Excel на экране.’,0);

 if AddWorkBook then begin

 messagebox(handle,»,‘Создали новую книгу.’,0);

 AddSheet(‘Новый лист’);

 messagebox(handle,»,‘Добавили новый лист.’,0);

 DeleteSheet(2);

 messagebox(handle,»,‘Удалили лист №2.’,0);

 GetSheets(ListBox1.Items);

 messagebox(handle,»,‘Получили список листов!’,0);

 for a_:=1 to CountSheets do begin

  ListBox1.ItemIndex:=a_-1;

  SelectSheet(ListBox1. Items.Strings[a_-1]);

  messagebox(handle,»,

  pchar(‘Выбираем лист ‘+ListBox1.Items.Strings[a_-1]+‘!’),0);

 end;

 SaveWorkBookAs(‘c:1.xls’);

 messagebox(handle,»,‘Сохранили книгу как «c:1.xls».’,0);

 CloseWorkBook;

 messagebox(handle,»,‘Закрыли книгу «c:1.xls».’,0);

 end;

 CloseExcel;

end;

Мы рассмотрели общий вид объектной модели Excel и примеры нескольких функций работы с книгами и листами. Далее изучим вопросы записи (чтения) информации в ячейки и программирование их свойств. По всем вопросам Вы можете обратиться к автору по адресу _kvn@mail.ru или www.kornjakov.ru.
Василий КОРНЯКОВ
Литература: Н. Елманова, С. Трепалин, А.Тенцер, «Delphi 6 и технология COM», «Питер», 2002.

Для начала необходимо использовать следующие модули:

uses
  Variants, Registry,
 ComObj, Excel2000,
 ActiveX;

Теперь простенькая функция определения установлен ли соответствующий
объект в системе или нет. С её помощью можно искать Excel, Word и т.д…Для начала необходимо использовать следующие модули:

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

Например:

 IsOLEObjectInstalled('Excel.Application.8')

Так мы можем определить установлены ли объекты соответствующей версии Excel или нет.

Теперь попробуем запустить Excel.
Определим переменные:

var
  cls_ExcelObject: string;
  WorkSheet: Variant;
  Excel: Variant;
  RegData: TRegistry;

Для того, что бы избавится от локальных названий класса для каждой верcии Office Excel необходимо выбрать ветку реестра с текущей весией, и если эта ветка существует сменить название.

 begin
    // Это для того, чтобы не применять локальные
// для каждой версии
    // названия "Excel.Application.8", "Excel.Application.9".
    // Ко всему прочему приведенный пример
    // не работает с Excel95.
    cls_ExcelObject := 'Excel.Application';
    RegData := TRegistry.Create;
    RegData.RootKey := HKEY_CLASSES_ROOT;
    try
      if RegData.OpenKey('Excel.ApplicationCurVer', False) then
      begin
        cls_ExcelObject := regData.ReadString('');
        RegData.CloseKey;
      end
    finally
      regData.Free;
    end;

Определим установлен Excel на данный компьютер или нет.

    if not IsOLEObjectInstalled(cls_ExcelObject) then
    begin
      ShowMessage('Excel не установлен.');
      exit;
    end;

    // Вот теперь откроем Excel
    Excel := CreateOleObject(cls_ExcelObject);

Вот теперь самые интересные параметры работы с Excel. Мы отключает все события, интерактивную реакцию, в том числе и перерисовку, отображение в строке состояния, отображение границ листа и пересчет формул (если конечно не нужно пересчитывать формулы автоматически. А еще делаем процесс работы приложения невидимым.

  // Отключаем реакцию Excel на события,
    // чтобы ускорить обработку информации информации
    Excel.Application.ScreenUpdating := False
    Excel.Application.Calculation := xlCalculationManual;
    Excel.Application.EnableEvents := false;
    Excel.Application.Interactive := False;
    Excel.Application.DisplayAlerts := False;
    Excel.ActiveSheet.DisplayPageBreaks := False;
    Excel.Application.DisplayStatusBar := False;
    Excel.Visible := false;

А теперь создадим таблицу или откроем указанный файл:

    //  Создадим новую таблицу
   Excel.Workbooks.Add;
   // -------- или ---------
    //    Откроем существующую таблицу
    Excel.Workbooks.Open('FileName.xls');

Получим дополнительную информацию. Количество листов в книге, получим имена всех листов.

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

 // Количество значащих строк
 Rows := WorkSheet.UsedRange.Rows.Count;
// Количество значащих колонок
Columns := WorkSheet.UsedRange.Columns.Count;
// Первая строка диапазона
First := WorkSheet.UsedRange.Row;

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

// Количество листов в таблице
    SheetsCount := Excel.Sheets.Count;
// Получим имена всех листов в первой открытой книге
    for i := 1 to SheetsCount do
    begin
      WorkSheetsNames.Items.Add(Excel.Workbooks[1].WorkSheets[i].Name);
    end;

// Выберем первый лист первой книги
    WorkSheet := Excel.Workbooks[1].WorkSheets[1];
    Rows := WorkSheet.UsedRange.Rows.Count;
 // Количество значащих строк
    Columns := WorkSheet.UsedRange.Columns.Count;
 // Количество значащих колонок
    // Первая строка диапазона
    FirstString := WorkSheet.UsedRange.Row;

Дальше уже можно работать с таблицей. Обработка и парсинг Excel книги мы рассмотрим в следующей статье.

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

 
Excel.Application.EnableEvents := true;
Excel.Application.Interactive := true;
Excel.Application.DisplayAlerts := true;
Excel.ActiveWorkbook.SaveCopyAs('FileName.xls');
Excel.ActiveWorkbook.Close(0); // xlDontSaveChanges
Excel.Quit;
Excel := Unassigned;

Дополнительные ссылки:
Особенности работы с «Русским» Excel’ем


Tech Daily — Щоденні новини технологій




Подготовка

Откроем нашу среду разработки 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