Вывод отчета на страницу книги 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.
Популярное:
- A.16.15.5. Экран состояния модулей удаленного ввода-вывода (RIOM)
- IV Обсуждение результатов и некоторые выводы
- Microsoft FoxРrо и Visual FoxРrо
- Newsweek стремился учесть целый ряд факторов, в том числе историческое и культурное значение книги,
- Автор специального исследования по этому вопросу Середонин пришел к выводу, что в конце XVI в. было не более 23–25 тыс. детей боярских и дворян, числившихся в разрядных списках.
- В выводе должно прозвучать, что была определена «нужда» потребителя в данной услуге.
- В случае, если обучающийся не защитил отчет по практике, по неуважительной причине или получил на защите отчета неудовлетворительную оценку, он не допускается к квалификационному экзамену.
- В соответствующих главах этой книги.
- Ввод и вывод данных. Форматы вывода.
- Ввод – вывод и файловая система
- ВЕДЕНИЕ ПРОДАВЦОМ КНИГИ ПРОДАЖ
- Великие события, описанные в Священном Писании, никогда не происходили. Об этом сообщается в газете La Repubblica. К такому выводу пришли израильские археологи на основании многолетних раскопок