- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Вывод отчета на страницу книги Microsoft Excel



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

Положите на форму кнопку и дайте ее свойству Caption значение Вывод отчета в Excel. Ниже положите 3 метки Label и дайте им имена TitleFont, HeaderFont, DataFont. Первый из них потребуется для задания шрифта заголовка отчета, второй - шрифта наименований колонок, третий - шрифта данных таблицы. Установите в них желаемые параметры свойстваFont.

Рядом с ними положите два компонента CheckBox (закладка Standard) и дайте им имена Framed и OutDataTime, соответственно. Если в первом из них установлена галочка(свойство Checked), то в отчете данные будут окаймлены рамками. Если во втором будет установлена галочка, то после вывода данных будет указано время создания отчета.

Новый вид формы показан на рис. 13.

Рис. 13. Форма с элементами создания отчета в Microsoft Excel

Необходимый программный код для работы в Delphi с программой Excel находится в файле KdnExcel.pas, который лежит в папке KdnLib (код разработан автором этого методического материала). Включите KdnExcel в список uses, который содержится в верхней части текста модуля QueryRep. Теперь разрабатываемая программа будет видеть код файла KdnExcel.pas.

Нам потребуется из этого файла одна процедура. Она имеет имя OutReportToExcel (вывести отчет в Excel). Ее заголовок имеет следующий вид

procedure OutReportToExcel(Title: String;
DataSet: TDataSet;
TitleFont,
HeaderFont,DataFont: TFont;
Framed,OutDataTime: boolean);

Здесь

Title - строка заголовка отчета,
DataSet - множество данных для вывода в отчет,
TitleFont - шрифт заголовка отчета,
HeaderFont - шрифт заголовков колонок,
DataFont - шрифт данных,
Framed - следует ли заключать данные в рамки,
OutDataTime: - следует ли выводить время создания отчета.

Создайте для новой кнопки событие OnClick и вставьте в него оператор запуска процедуры вывода отчета в Excel

procedure TfQueryRep.bOutToExcelClick(Sender: TObject);
begin
// если Excel открыт, то закрываем, иначе открываем его и выводим отчет
if ExApp <> Nil then ExcelClose(0) else
// вывод таблицы в Excel
OutReportToExcel('Пример отчета по запросу',
QuRep, // таблица для вывода в Excel
TitleFont.Font, // шрифт заголовка
HeaderFont.Font, // шрифт заголовков стобцов
DataFont.Font, // шрифт данных
Framed.Checked, // заключать данные в рамки
OutDataTime.Checked // выводить время создания отчета
);
end;

При щелчке на кнопке код работает следующим образом: если окно Excel активно, то оно будет закрыто. Если же оно закрыто, то произойдет вызов процедуры OutReportToExcelс указанными параметрами (назначение каждого параметра содержится в соответствующем комментарии).

Запустите программу, создайте запрос, затем щелкните на новой кнопке. Программа вызовет Excel и выведет туда отчет. Примеры таких отчетов приведены на рис. 14. и 15.

Рис. 14. Фрагмент окно Microsoft Excel после вывода в него отчета по запросу Рис. 15. Фрагмент окна Microsoft Excel

 

unit QueryRep;

Interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, QRCtrls, QuickRpt, ExtCtrls, DB, DBTables, StdCtrls, Grids,
DBGrids, KdnExcel, KdnServ;

type
TfQueryRep = class(TForm)

QR: TQuickRep;
HeaderBand: TQRBand;
DetailBand: TQRBand;
TitleBand1: TQRBand;
QRLabel3: TQRLabel;
PageFooterBand1: TQRBand;
QRSysData1: TQRSysData;
QRSysData2: TQRSysData;
bDoQuery: TButton;
MemoSQL: TMemo;
QuRep: TQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
bDoReport: TButton;
bDestroyDynamicComponents: TButton;
bCreateDynamicComponents: TButton;
Label1: TLabel;
Label2: TLabel;
bDoDiynamicReport: TButton;
bOutToExcel: TButton;
TitleFont: TLabel;
DataFont: TLabel;
HeaderFont: TLabel;
Framed: TCheckBox;
OutDataTime: TCheckBox;

procedure bDoQueryClick(Sender: TObject);
procedure bCreateDynamicComponentsClick(Sender: TObject);
procedure bDestroyDynamicComponentsClick(Sender: TObject);
procedure bDoReportClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bDoDiynamicReportClick(Sender: TObject);
procedure bOutToExcelClick(Sender: TObject);
private

{ Private declarations }
public
{ Public declarations }
end;

var
fQueryRep: TfQueryRep;
L: array of TQRLabel; // массив надписей на колонках полей
T: array of TQRDBText; // массив значения по по полям таблицы

Implementation

{$R *.dfm}

procedure DoRepSQL;
// процедура выполнения запроса
begin
With fQueryRep do
begin
QuRep.Close;
QuRep.Prepare;
QuRep.SQL.Assign(MemoSQL.Lines);
QuRep.ExecSQL;
QuRep.Open;
end;
end;

procedure TfQueryRep.bDoQueryClick(Sender: TObject);
begin
// процесс выполнения отчета
DoRepSQL;
end;

procedure DestroyReportComponents;
// уничтожение динамических массивов
// для компонентов отчета
var n,i: Integer;
begin
n:= Length(L);
if n > 0 then
for i:= 0 to n-1 do
begin
L[i].Free;
T[i].Free;
end;
L:=Nil; T:= Nil;
end;

procedure CreateReportComponents;
// создание динамических компонентов отчета
var n, i: Integer;
begin
With fQueryRep do
if QuRep.Active then // если таблица по выполненному запросу открыта, то
begin
n:= QuRep.FieldCount; // число полей в полученном запросе QuRep
SetLength(L,n); // выделим память в массиве заголовков под столько же элементов
SetLength(T,n); // выделим память в массиве данных под столько же элементов
for i:= 0 to n-1 do // проход по каждому полю
begin
L[i]:= TQRLabel.Create(HeaderBand); // создаем элемент заголовка конкретного поля с номером i
L[i].Parent:= HeaderBand; // назначаем ему родителя составную часть заголовков HeaderBand
L[i].Left:= 12+i*140; // первый заголовок будет с отступом 12 пикселов, остальные через 140 от соседнего
L[i].Caption:= QuRep.Fields[i].FieldName; // надпись на заголовке будет совпадать с именем поля

T[i]:= TQRDBText.Create(DetailBand); // создаем элемент данных конкретного поля с номером i
T[i].Parent:= DetailBand; // его родителем будет составная часть данных DetailBand
T[i].Left:= L[i].Left; // отступы также, как для заголовков
T[i].DataSet:= QR.DataSet; // данные те же, что и для компонента отчета QR
T[i].DataField:= QuRep.Fields[i].FieldName; // данные по колонке брать из соответствующего поля таблицы
end;
end;
end;

procedure TfQueryRep.bCreateDynamicComponentsClick(Sender: TObject);
begin
CreateReportComponents;
end;

procedure TfQueryRep.bDoReportClick(Sender: TObject);
begin
QR.Preview;
end;

procedure TfQueryRep.bDestroyDynamicComponentsClick(Sender: TObject);
begin
DestroyReportComponents;
end;

procedure TfQueryRep.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DestroyReportComponents;
end;

procedure TfQueryRep.bDoDiynamicReportClick(Sender: TObject);
begin
DoRepSQL;
if QuRep.Active then
begin
DestroyReportComponents;
CreateReportComponents;
QR.Preview;
DestroyReportComponents;
end;
end;

procedure TfQueryRep.bOutToExcelClick(Sender: TObject);
begin
// если Excel открыт, то закрываем, иначе открываем его и выводим отчет
if ExApp <> Nil then ExcelClose(0) else
// вывод таблицы в Excel
OutReportToExcel('Пример отчета по запросу',
QuRep, // таблица для вывода в Excel
TitleFont.Font, // шрифт заголовка
HeaderFont.Font, // шрифт заголовков стобцов
DataFont.Font, // шрифт данных
Framed.Checked, // заключать данные в рамки
OutDataTime.Checked // выводить время создания отчета
);
end;

end.

 

unit QueryRep;

Interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, QRCtrls, QuickRpt, ExtCtrls, DB, DBTables, StdCtrls, Grids,
DBGrids, KdnExcel, KdnServ;

type
TfQueryRep = class(TForm)

QR: TQuickRep;
HeaderBand: TQRBand;
DetailBand: TQRBand;
TitleBand1: TQRBand;
QRLabel3: TQRLabel;
PageFooterBand1: TQRBand;
QRSysData1: TQRSysData;
QRSysData2: TQRSysData;
bDoQuery: TButton;
MemoSQL: TMemo;
QuRep: TQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
bDoReport: TButton;
bDestroyDynamicComponents: TButton;
bCreateDynamicComponents: TButton;
Label1: TLabel;
Label2: TLabel;
bDoDiynamicReport: TButton;
bOutToExcel: TButton;
TitleFont: TLabel;
DataFont: TLabel;
HeaderFont: TLabel;
Framed: TCheckBox;
OutDataTime: TCheckBox;

procedure bDoQueryClick(Sender: TObject);
procedure bCreateDynamicComponentsClick(Sender: TObject);
procedure bDestroyDynamicComponentsClick(Sender: TObject);
procedure bDoReportClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bDoDiynamicReportClick(Sender: TObject);
procedure bOutToExcelClick(Sender: TObject);
private

{ Private declarations }
public
{ Public declarations }
end;

var
fQueryRep: TfQueryRep;
L: array of TQRLabel; // массив надписей на колонках полей
T: array of TQRDBText; // массив значения по по полям таблицы

Implementation

{$R *.dfm}

procedure DoRepSQL;
// процедура выполнения запроса
begin
With fQueryRep do
begin
QuRep.Close;
QuRep.Prepare;
QuRep.SQL.Assign(MemoSQL.Lines);
QuRep.ExecSQL;
QuRep.Open;
end;
end;

procedure TfQueryRep.bDoQueryClick(Sender: TObject);
begin
// процесс выполнения отчета
DoRepSQL;
end;

procedure DestroyReportComponents;
// уничтожение динамических массивов
// для компонентов отчета
var n,i: Integer;
begin
n:= Length(L);
if n > 0 then
for i:= 0 to n-1 do
begin
L[i].Free;
T[i].Free;
end;
L:=Nil; T:= Nil;
end;

procedure CreateReportComponents;
// создание динамических компонентов отчета
var n, i: Integer;
begin
With fQueryRep do
if QuRep.Active then // если таблица по выполненному запросу открыта, то
begin
n:= QuRep.FieldCount; // число полей в полученном запросе QuRep
SetLength(L,n); // выделим память в массиве заголовков под столько же элементов
SetLength(T,n); // выделим память в массиве данных под столько же элементов
for i:= 0 to n-1 do // проход по каждому полю
begin
L[i]:= TQRLabel.Create(HeaderBand); // создаем элемент заголовка конкретного поля с номером i
L[i].Parent:= HeaderBand; // назначаем ему родителя составную часть заголовков HeaderBand
L[i].Left:= 12+i*140; // первый заголовок будет с отступом 12 пикселов, остальные через 140 от соседнего
L[i].Caption:= QuRep.Fields[i].FieldName; // надпись на заголовке будет совпадать с именем поля

T[i]:= TQRDBText.Create(DetailBand); // создаем элемент данных конкретного поля с номером i
T[i].Parent:= DetailBand; // его родителем будет составная часть данных DetailBand
T[i].Left:= L[i].Left; // отступы также, как для заголовков
T[i].DataSet:= QR.DataSet; // данные те же, что и для компонента отчета QR
T[i].DataField:= QuRep.Fields[i].FieldName; // данные по колонке брать из соответствующего поля таблицы
end;
end;
end;

procedure TfQueryRep.bCreateDynamicComponentsClick(Sender: TObject);
begin
CreateReportComponents;
end;

procedure TfQueryRep.bDoReportClick(Sender: TObject);
begin
QR.Preview;
end;

procedure TfQueryRep.bDestroyDynamicComponentsClick(Sender: TObject);
begin
DestroyReportComponents;
end;

procedure TfQueryRep.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DestroyReportComponents;
end;

procedure TfQueryRep.bDoDiynamicReportClick(Sender: TObject);
begin
DoRepSQL;
if QuRep.Active then
begin
DestroyReportComponents;
CreateReportComponents;
QR.Preview;
DestroyReportComponents;
end;
end;

procedure TfQueryRep.bOutToExcelClick(Sender: TObject);
begin
// если Excel открыт, то закрываем, иначе открываем его и выводим отчет
if ExApp <> Nil then ExcelClose(0) else
// вывод таблицы в Excel
OutReportToExcel('Пример отчета по запросу',
QuRep, // таблица для вывода в Excel
TitleFont.Font, // шрифт заголовка
HeaderFont.Font, // шрифт заголовков стобцов
DataFont.Font, // шрифт данных
Framed.Checked, // заключать данные в рамки
OutDataTime.Checked // выводить время создания отчета
);
end;

end.