Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Вывод отчета на страницу книги 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.

 


Поделиться:



Популярное:

  1. A.16.15.5. Экран состояния модулей удаленного ввода-вывода (RIOM)
  2. IV Обсуждение результатов и некоторые выводы
  3. Microsoft FoxРrо и Visual FoxРrо
  4. Newsweek стремился учесть целый ряд факторов, в том числе историческое и культурное значение книги,
  5. Автор специального исследования по этому вопросу Середонин пришел к выводу, что в конце XVI в. было не более 23–25 тыс. детей боярских и дворян, числившихся в разрядных списках.
  6. В выводе должно прозвучать, что была определена «нужда» потребителя в данной услуге.
  7. В случае, если обучающийся не защитил отчет по практике, по неуважительной причине или получил на защите отчета неудовлетворительную оценку, он не допускается к квалификационному экзамену.
  8. В соответствующих главах этой книги.
  9. Ввод и вывод данных. Форматы вывода.
  10. Ввод – вывод и файловая система
  11. ВЕДЕНИЕ ПРОДАВЦОМ КНИГИ ПРОДАЖ
  12. Великие события, описанные в Священном Писании, никогда не происходили. Об этом сообщается в газете La Repubblica. К такому выводу пришли израильские археологи на основании многолетних раскопок


Последнее изменение этой страницы: 2016-06-04; Просмотров: 764; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.018 с.)
Главная | Случайная страница | Обратная связь