Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  101

•  TDictionary Custom Sort  3 298

•  Fast Watermark Sources  3 048

•  3D Designer  4 803

•  Sik Screen Capture  3 297

•  Patch Maker  3 517

•  Айболит (remote control)  3 615

•  ListBox Drag & Drop  2 973

•  Доска для игры Реверси  81 428

•  Графические эффекты  3 901

•  Рисование по маске  3 213

•  Перетаскивание изображений  2 597

•  Canvas Drawing  2 717

•  Рисование Луны  2 543

•  Поворот изображения  2 150

•  Рисование стержней  2 153

•  Paint on Shape  1 558

•  Генератор кроссвордов  2 215

•  Головоломка Paletto  1 757

•  Теорема Монжа об окружностях  2 196

 

 

Архив исходников

   
  Базы данных
  Графика & Мультимедиа
  Сети & Интернет
  Система
  Разное
   

Ссылки и Баннеры ...

 

Delphi Sources

Delphi Sources

СТАТЬИ

 

. : Экспорт данных в MS Excel - Часть 1 : .

 

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

Экспорт данных в MS Excel

Часть 1 - "Самое начало"
 

   Условимся, что все функции и процедуры связанные с работой с MS Excel будем оформлять в отдельном модуле myexcel.pas. По мере продвижения вперед данный модуль будет обрастать дополнительным функционалом и к окончанию, надеюсь , мы получим более-менее удобный модуль для передачи данных в/из MS Excel.
   Для начала создадим пустой модуль и сохраним его под именем myexcel.pas.
   Теперь в реализационной части модуля (implementation) опишем переменную, которая будет использоваться для обращения к MS Excel.
   Результат получится такой:
 


unit MyExcel;

interface

implementation

var
 Excel:OleVariant;

end.


   Теперь напишем процедуру, которая будет создавать экземпляр MS Excel. Для этого в реализационной части модуля объявим в директиве uses следующие модули: ComObj, Dialogs, Variants. Сама процедура будет выглядеть так:
 
 


procedure CreateExcel;
begin
 Case VarType(Excel) of
  varEmpty: Excel:=CreateOleObject('Excel.Application');
  varDispatch: ShowMessage('Экземпляр MS Excel уже создан!');
  else ShowMessage('Неизвестная ошибка!');
 end;
end;
  


   Функция VarType возвращает тип вариантной переменной, соответственно если переменная не определена, то создаем экземпляр MS Excel, при попытке повторного создания получим сообщение о том, что Excel уже создан. В противном случае, если переменная имеет тип отличный от varEmpty или varDispatch, сообщаем об ошибке.
Далее нам понадобится процедура отображающая MS Excel на экране, напишем ее, а также функцию сообщающую о том отображен ли Excel.
   Для начала функция сообщающая о видимости Excel’я:
 
 


function ExcelIsShowed:boolean;
begin 
 Result:=false;
 if VarType(Excel)=varDispatch then
 Result:=Excel.Visible;
end;


А теперь собственно отображение:
 


procedure ShowExcel(CanShow:boolean);
begin
 if VarType(Excel)=varDispatch then
 if ExcelIsShowed<>CanShow then
 Excel.Visible:=CanShow;
end;


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


unit MyExcel;

interface

procedure CreateExcel;
procedure ShowExcel(CanShow:boolean);
function ExcelIsShowed:boolean;

implementation

uses ComObj,Dialogs,Variants;

var
 Excel:OleVariant;


   Теперь попробуем применить это в нашей программе. Свойству Caption главной формы присвоим значение Part 1, а свойству Name – MainForm, в дальнейшем все формы в демонстрационных программах будем называть аналогично, разве что будет меняться номер части. На главной форме разместим кнопку, установим свойство Name для нее CreateExcelObject, а свойство Caption – Create Excel. Дополнительно к кнопке на форме разместим компонент CheckBox, его настройки: Name – ExcelShow, Caption – Show Excel.
Сохраним главный модуль проекта под именем main.pas, а сам проект под именем Part_1.dpr.
   В раздел uses реализационной части модуля внесем написанный нами ранее модуль MyExcel (для простоты добавления нажмите Alt+F11 и выберете MyExcel).
В обработчике события OnClick кнопки напишем следующий код:
 
 


procedure TMainForm.CreateExcelObjectClick(Sender: TObject);
begin
 CreateExcel;
end;
 


А в обработчик события OnClick CheckBox’а напишем:
 


procedure TMainForm.ExcelShowClick(Sender: TObject);
begin
 ShowExcel((Sender as TCheckBox).Checked);
end;


   Теперь можно запустить получившийся проект и попробовать понажимать на кнопку и попереключать флажок.
   Но пустым Excel’ем в наше время никого не удивишь. А раз так, то нужно создать рабочую книгу! Для этого наряду с переменной Excel объявим переменную WorkBook:OleVariant. Эта переменная у нас будет содержать ссылку на активную рабочую книгу.
   Вот процедура создающая рабочую книгу:
 
 


procedure CreateWorkBook;
begin
 if VarType(Excel)=varDispatch then
 begin
  Excel.WorkBooks.Add;
  WorkBook:=Excel.ActiveWorkBook;
 end;
end;


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

  


function GetWorkBooksCount(Buffer:TStrings):Integer;
var
 i:integer;
begin
 Buffer.Clear;
 Result:=-1;
 if VarType(Excel)=varDispatch then
 begin
  Result:=Excel.WorkBooks.Count;
  if Result>0 then
  for i:=1 to Result do
   Buffer.Append(Excel.WorkBooks[i].FullName);
 end;
end;
 


   Эта функция в случае удачи возвращает количество открытых рабочих книг и в Buffer складывает их имена, в противном случае возвращает -1. Как видно из кода, нумерация рабочих книг в MS Excel начинается с единицы.
   Опишем процедуру добавления рабочей книги и функцию получения количества книг в интерфейсной части модуля. Также в раздел uses интерфейсной части нужно добавить модуль Classes, именно там описан класс TStrings.
   Применим написанное на практике.
   На главной форме добавим кнопку:
 
 


Name:=’CreateExcelWorkBook’
Caption:=’Add WorkBook’

Обработчик OnClick:
procedure TMainForm.CreateExcelWorkBookClick(Sender: TObject);
begin
 CreateWorkBook();
end;

Добавим ListBox:
Name:=’WorkBookList’
Еще одну кнопку:
Name:=’RefreshWBList’
Caption:=’Refresh’

Обработчик OnClick:
procedure TMainForm.RefreshWBListClick(Sender: TObject);
begin
 GetWorkBooksCount(WorkBookList.Items);
end;


   Запускаем, смотрим результат :)
   Обратите внимание на то, что добавлять рабочие книги в Excel можно и не отображая его на экране. В данный момент это кажется не особо важным, но в последствии это очень понадобится.
   Теперь напишем еще пару функций для работы с рабочими книгами (хм… тавтология, но иначе и не скажешь). Одна из них возвращает индекс рабочей книги по ее имени:
function GetWorkBookIndex(WorkBookName:ANSIString):Integer;
 
 


var
 i:integer;
begin
 Result:=-1;
 if VarType(Excel)=varDispatch then
 for i:=1 to Excel.WorkBooks.Count do
 if Excel.WorkBooks[i].FullName=WorkBookName then
 begin
  Result:=i;
  Exit;
 end;
end;
 
// В случае неудачи функция возвращает -1.
// Другая функция делает активной рабочую книгу по ее индексу:
function SetActiveWorkBook(Index:Integer):Integer;
begin
 Result:=-1;
 if VarType(Excel)=varDispatch then
 begin
  if (Excel.WorkBooks.Count>=Index) and (Index>0) then
  begin
   Excel.WorkBooks[Index].Activate;
   WorkBook:=Excel.ActiveWorkBook;
   Result:=0;
  end;
 end;
end;
 
// При удачной активации книги функция возвращает 0, иначе -1.
// Теперь добавьте в обработчик события OnDblClick ListBox’а
// следующий код:
procedure TMainForm.WorkBookListDblClick(Sender: TObject);
var
 Index:Integer;
begin
 Index:=GetWorkBookIndex((Sender as TListBox).
                        Items[(Sender as TListBox).ItemIndex]);
 if Index>0 then
 SetActiveWorkBook(Index);
end;
 


   Запустите проект создайте несколько рабочих книг и двойным щелчком мыши по имени рабочей книги в списке попробуйте попереключаться между ними, правда весело?
Далее нам следует обратить свой взор на листы рабочей книги, ведь информацию мы собираемся вставлять именно в ячейки листа. Опишем переменную для текущего листа Sheet:OleVariant. Теперь везде где устанавливалась активная рабочая книга (а это процедура создания рабочей книги и функция активации рабочей книги) нужно связать "свежесозданную" переменную Sheet с активным листом книги вот таким кодом:
 
 


 Sheet:=WorkBook.ActiveSheet;
 


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


procedure AddSheet;
begin
if VarType(WorkBook)=varDispatch then
begin
WorkBook.Sheets.Add;
Sheet:=WorkBook.ActiveSheet;
end;
end; // При добавлении листа в рабочую книгу MS Excel автоматически
// делает его текущим, 
следовательно и нам нужно связать с ним
// переменную Sheet которая является 
ссылкой на текущий лист,
// что и видно из кода.
// Вторая процедура удаляет текущий лист из рабочей книги:
procedure DeleteSheet;
begin
if VarType(WorkBook)=varDispatch then
begin
WorkBook.ActiveSheet.Delete;
Sheet:=WorkBook.ActiveSheet;
end;
end;


   При удалении активного листа из рабочей книги MS Excel поступает следующим образом: если в списке листов (тот что внизу, отображен закладками) есть листы расположенные справа от удаляемого, то активным становится следующий за удаляемым лист, если листов справа в списке нет, то активным становиться предыдущий лист (хм... интересно, а как это происходит в арабских локализациях офиса, ведь арабы пишут справа-налево). Последний лист книги MS Excel удалять не позволяет.
   Применение новых функций работы с листами вы найдете в примере к первой части статьи, скачать его можно ТУТ. На этом считаю что первую часть статьи можно окончить. Пытливый читатель спросит: "А как же экспорт данных?" и, скорее всего, будет прав. Поэтому, обещаю, экспортом данных мы займемся в следующей части. Ждите продолжения…

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

Дата: 09.03.2007, Автор: Aristarh Dark.



Назад

    Скачать исходник (4 Кб)

   

 





















































































































































































































 

© 2004-2024 "DS"

Соглашение пользователя / Реклама / Карта сайта             Created by BrokenByte Software