Во время работы нам часто нужно вывести данные в Excel, в виде отчетов. Пусть у нас имеется некоторая таблица, которую нужно экспортировать в Excel. Создадим в Access БД с именем Склад. В этой БД создадим таблицу – Товары, следующей структуры (заполните таблицу данными 5-6 записей):
Выполним подключение таблицы в Delphi, с помощью компонентов ТADOConnection, ТADOTable, ТDataSource, ТDBGrid. На форме расположим кнопку ТButton, и компоненты для работы с Excel со страницы Servers: TExcelApplication,TExcelOLEObject, TExcelWorkbook.
В модуле запишите следующий код и разберите его:
unitUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, ComObj, DB, ADODB,
ExcelXP, OleServer;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
DBNavigator1: TDBNavigator;
Button1: TButton;
ExcelApplication1: TExcelApplication;
ExcelOLEObject1: TExcelOLEObject;
ExcelWorkbook1: TExcelWorkbook;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
XL, Cell1, Cell2, ArrayData, Sheet: Variant;
RowCount, sum: Integer;
BeginCol, BeginRow, i, ColCount: byte;
begin
// Координаты левого верхнего угла, куда будем выводить данные
BeginCol:= 1;
BeginRow:=3;
RowCount:=Form1.ADOTable1.RecordCount; //Кол-во записей в таблице, которую будем передавать в Excel
//ShowMessage(IntToStr(RowCount));
ColCount:=3; // Кол-востолбцов
XL:=CreateOleObject('Excel.Application'); // создание Excel
XL.Visible:=true;
XL.Application.EnableEvents:=false; //Отключаемреакцию Excel на события (позволяет ускорить вывод информации)
XL.WorkBooks.Add(-4167);// Добавляем книгу
XL.WorkBooks[1].WorkSheets[1].Name:='Îò÷åò';// имя листа
Sheet:=XL.WorkBooks[1].WorkSheets[1];
Sheet.Cells[1,1]:='Ассортимент товаров';
Sheet.Cells.HorizontalAlignment:=XLCenter;// выравнивание по центру
Sheet.Range['A1:C1'].Mergecells:=True;// объединениеячеек
Sheet.Range['A1:C1'].Interior.ColorIndex:=4;// заливка
XL.Rows.Rows[1].Font.Bold:=true;// Делаемжирныйшрифт в 1 строке
XL.Rows.Rows[2].Font.Size:=10; // Устанавливаем размер шрифта
XL.Rows.Rows[2].WrapText:=True; // Включаем перенос текста в ячейках
XL.Rows.Rows[2].HorizontalAlignment:=XLCenter; // Устанавливаем гориз-е выравнивание по центру
XL.Rows.Rows[2].VerticalAlignment:=2;// Устанавливаем верт-е выравнивание по центру
XL.Cells[2,1]:='Кодтовара';
XL.Cells[2,2]:='Наименование';
XL.Cells[2,3]:='Цена';
XL.Columns.Columns[1].ColumnWidth:=10;// Устанавливаем ширину столбцов
XL.Columns.Columns[2].ColumnWidth:=30;
XL.Columns.Columns[3].ColumnWidth:=20;
ArrayData:=VarArrayCreate([1,RowCount,1,ColCount],varVariant); // Задаем
// вариантный массив, который будем заполнять данными из ADOTable1
ADOTable1.First; // Заполняем массив значениями из ADOTable1
for i:=1 to RowCount do
begin
ArrayData[i,1]:= ADOTable1['КодТовара'];
ArrayData[i,2]:= ADOTable1['Название'];
ArrayData[i,2]:= ADOTable1['Цена'];
ADOTable1.Next;
end;
Cell1:=XL.Cells[BeginRow-1,BeginCol];// Верхняя левая ячейка области, в которую будем выводить данные
Cell2:=XL.Cells[BeginRow+RowCount-1,BeginCol+ColCount-1];//Правая нижняя ячейка области, в которую будем выводить данные
//XL.Range[XL.Cells[BeginRow,BeginCol],Cell2].Value:=ArrayData;// заполняем книгу нашими данными
XL.Range[Cell1,Cell2].Borders.LineStyle:=1; // границы
ADOTable1.First;
i:=0; sum:=0;
while not ADOTable1.Eof do //заполняемданными
begin
sheet.Cells(i+3,1):=ADOTable1.Fields[0].AsString;
sheet.Cells(i+3,2):=ADOTable1.Fields[1].AsString;
sheet.Cells(i+3,3):=ADOTable1.Fields[2].AsString; sum:=sum+StrToInt(ADOTable1.Fields[2].AsString);
inc(i);
ADOTable1.Next;
end;
sheet.Cells(i+3,2):='Èòîãî';
sheet.Cells(i+3,3):=sum;
//XL.WorkBooks[1].WorkSheets[1].Cells[2,6].formula:='=sum(c3:c5);
XL.Visible:=true;//делаем Excel видимым
end;
end.
В итоге у вас должен получится следующий отчет:
Самостоятельная работа.
Выполните подключение с помощью TADOQuery, подсчет итоговой суммы выполните с помощью запроса.