An example of exporting sql database table ( in this case sqlite table ) to MS Excel.
Link to full source : Source code
Here we use previous example which we upgrade with new function used for exporting data.
As always , here is video tutorial to watch, following with full source of this example.
(code style formatted by http://hilite.me/ )
unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZAbstractConnection, ZConnection, ComObj, ExcelXP, ComCtrls; type TfrmMain = class(TForm) ZConn: TZConnection; ZQuery1: TZQuery; ZQuery2: TZQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; Button1: TButton; Button2: TButton; ComboBox1: TComboBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Label4: TLabel; Edit2: TEdit; Button3: TButton; Label5: TLabel; Edit3: TEdit; Label6: TLabel; Edit4: TEdit; Button4: TButton; Button5: TButton; Label7: TLabel; Label8: TLabel; Button6: TButton; ProgressBar1: TProgressBar; SaveDialog1: TSaveDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure ExportTableToExcel(Tablex:TZQuery;sFile:string); procedure FormCreate(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.ExportTableToExcel(Tablex:TZQuery;sFile:string); var //Declarations ExcelApplication : variant; Sheet : variant; column, row ,rowsno: integer; FormatFloatY:WideString; ValXX:WideString; begin Cursor:=crHourGlass; try //Try to create Excel application begin ExcelApplication := CreateOleObject('Excel.Application'); ExcelApplication.Visible := true; //let's make visible end; except //If failed then show warning Showmessage('Cannot create an Excel file,' +'make sure that MS Excel is installed on your system'); Application.Terminate; end; rowsno:=Tablex.RecordCount; //records number in a table Tablex.RecNo:=1; //set table to first record ExcelApplication.WorkBooks.Add(-4167); //Add excel workbook ExcelApplication.WorkBooks[1].WorkSheets[1].Name := 'my data'; Sheet := ExcelApplication.WorkBooks[1].WorkSheets['my data']; //Format cells in excel sheet Sheet.Range['A1:C'+IntToStr(rowsno+1)].Borders.LineStyle := 7; Sheet.Range['A1:C'+IntToStr(rowsno+1)].Borders.color := clblue; Sheet.Range['B2:B'+IntToStr(rowsno+1)].HorizontalAlignment :=xlLeft; //colors of cells in first line Sheet.Cells[1,1].Interior.Color := clMoneyGreen; Sheet.Cells[1,2].Interior.Color := clMoneyGreen; Sheet.Cells[1,3].Interior.Color := clMoneyGreen; //widths of columns Sheet.Columns[1].ColumnWidth := 30; Sheet.Columns[2].ColumnWidth := 30; Sheet.Columns[3].ColumnWidth := 30; //captions/text of cells Sheet.Cells[1,1] := 'ID'; Sheet.Cells[1,2] := 'NAME'; Sheet.Cells[1,3] := 'SURNAME'; //set progressbar max value = teble records count ProgressBar1.max:=Tablex.RecordCount; ProgressBar1.position:=0; //set position to 0=start //now copy from table to excel cells for row := 1 to Tablex.RecordCount do begin Sheet.Cells[row+1,1] := Tablex.Fields[0].AsString; //row+1 = move to the next line //in column one Sheet.Cells[row+1,2] :=Tablex.Fields[1].AsString; //row+1 = move to the next line //in column two Sheet.Cells[row+1,3] := Tablex.Fields[2].AsString; //row+1 = move to the next line //in column three ProgressBar1.position:=row;//set progress bar position Tablex.Next; //go to the next record in a table end; Screen.Cursor:=crDefault; //set default cursor ProgressBar1.position:=0; //it is done , set PB to the begining DeleteFile(sFile); // Sheet.SaveAs(sFile); //Save excel file { ExcelApplication.Quit; //Quit excel ExcelApplication := Unassigned; //to be sure that no hidden excel in memory Sheet := Unassigned; } //let's close manually Screen.Cursor:=crDefault; //set default cursor //let's test //a bit slow while screen capturing end; procedure TfrmMain.FormCreate(Sender: TObject); begin SaveDialog1.InitialDir:=ExtractFilePath(Application.ExeName); end; procedure TfrmMain.Button1Click(Sender: TObject); begin ZConn.Protocol:='sqlite-3'; ZConn.LibraryLocation:=ExtractFilePath(Application.ExeName)+'sqlite3.dll'; if not FileExists(ZConn.LibraryLocation) then Exit; ZConn.Database:=ExtractFilePath(Application.ExeName)+'testdb.s3db'; //if not FileExists(ZConn.Database) then Exit; ZConn.Connect; Label2.Caption:='testdb.s3db'; ComboBox1.Items.Clear; ZConn.GetTableNames('',ComboBox1.Items); ComboBox1.ItemIndex:=0; ComboBox1.OnChange(Self); end; procedure TfrmMain.Button2Click(Sender: TObject); begin ZQuery1.Close; ZQuery1.SQL.Clear; ZQuery1.SQL.Add('CREATE TABLE if not exists testtbl(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' +'name VARCHAR(255),surname VARCHAR(255), UNIQUE(id))') ; ZQuery1.ExecSQL; ComboBox1.Items.Clear; ZConn.GetTableNames('',ComboBox1.Items); ComboBox1.ItemIndex:=0; ComboBox1.OnChange(Self); end; procedure TfrmMain.Button3Click(Sender: TObject); begin if Edit1.Text<>'' then begin ZQuery1.SQL.Clear; ZQuery1.SQL.Add('Insert into testtbl(name,surname) values('+QuotedStr(Edit1.Text)+','+QuotedStr(Edit2.Text)+')'); ZQuery1.ExecSQL; ComboBox1.OnChange(Self); end; end; procedure TfrmMain.Button4Click(Sender: TObject); begin ZQuery1.SQL.Clear; ZQuery1.SQL.Add('Update testtbl set name='+QuotedStr(Edit3.Text)+',surname='+QuotedStr(Edit4.Text) +' where id='+QuotedStr(Label8.Caption)); ZQuery1.ExecSQL; ComboBox1.OnChange(Self); end; procedure TfrmMain.Button5Click(Sender: TObject); begin ZQuery2.Delete; end; procedure TfrmMain.Button6Click(Sender: TObject); begin if SaveDialog1.Execute() then begin ExportTableToExcel(ZQuery2,SaveDialog1.FileName); end; end; procedure TfrmMain.ComboBox1Change(Sender: TObject); var i :Integer; begin ZQuery2.Close; ZQuery2.SQL.Clear; ZQuery2.SQL.Add('Select * from '+ComboBox1.Text); ZQuery2.Open; for I := 0 to DBGrid1.Columns.Count-1 do begin DBGrid1.Columns[i].Width:=100; end; end; procedure TfrmMain.DBGrid1CellClick(Column: TColumn); begin Edit3.Text:=ZQuery2.FieldByName('name').AsString; Edit4.Text:=ZQuery2.FieldByName('surname').AsString; label8.Caption:=ZQuery2.FieldByName('id').AsString; end; end.
Эта статья первая из цикла статей посвященных экспорту документов в MS Excel. В ней мы рассмотрим подключение к Excel, заполнению ячеек и простейшее оформление документа.
Я не буду углубляться в теорию, рассказывать о том как работает OLE механизм, начнем с самого главного.
Подключение.
Для подключения к Excel и работы с ним нам понадобится переменная типа Variant:
Excel:Variant;
Далее создаем OLE объект:
Excel:=CreateOleObject('Excel.Application');
Добавляем новую книгу:
Excel.Workbooks.Add;
Показываем Excel:
Excel.Visible:=true;
Так же нам понадобятся константы:
const xlContinuous=1; xlThin=2; xlTop = -4160; xlCenter = -4108;
Текст ячеек.
Теперь до любой ячейки мы можем добраться следующим образом:
Excel.ActiveWorkBook.WorkSheets[1].Cells[1, 2]:='Текст ячейки (1,2)';
Объект Range, выделение диапазона, объединение ячеек, выравнивание.
Представьте такую ситуацию: необходимо объединить несколько ячеек и выровнять текст в них по центру.
Выделяем:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1:G1'].Select;
Объединяем:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1:G1'].Merge;
И выравниваем:
Excel.Selection.HorizontalAlignment:=xlCenter;
Границы и перенос по словам.
Для начала выделяем нужный диапазон а затем…
Показываем границы:
Excel.Selection.Borders.LineStyle:=xlContinuous; Excel.Selection.Borders.Weight:=xlThin;
И включаем перенос по словам:
Excel.Selection.WrapText:=true;
Пример.
Пример можно скачать здесь
Параметры страницы.
Начнем с полей страницы. Во первых для того чтобы добраться до параметров страницы у листа Excel имеется свойство объект PageSetup его мы и будем использовать. Для установки размеров полей необходимо изменить соответствующие свойства PageSetup, вот эти свойства:
- LeftMargin — Левое поле
- RightMargin — Правое поле
- TopMargin — Верхнее поле
- BottomMargin — Нижнее поле
Значение размеров полей необходимо указывать в пикселях, к чему мы не очень привыкли, поэтому воспользуемся функцией InchesToPoints объекта Application, которая переводит значение в дюймах в значение в пикселях. Теперь напишем процедуру которая подключит Excel и установит поля равные 0.44 дюйма (приблизительно 1 см):
procedure Connect; var Excel:Variant; begin Excel:=CreateOleObject('Excel.Application'); Excel.Workbooks.Add; Excel.ActiveSheet.PageSetup.LeftMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.RightMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.TopMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.BottomMargin:= Excel.Application.InchesToPoints(0.44); end;
Иногда полезно уметь установить и ориентацию страницы:
Excel.ActiveSheet.PageSetup.Orientation:= 2;
Здесь значение ориентации = 2, означает альбомную, при книжной ориентации присвойте Orientation значение 1.
Вы наверное не раз встречали такой отчет в котором таблица с большим количеством строк размещается на нескольких страницах в таких случаях очень удобны сквозные строки, они печатаются на каждой странице отчета:
Excel.ActiveSheet.PageSetup.PrintTitleRows:='$2:$3';
Здесь мы указываем вторую и третью строки для печати на каждой странице.
Шрифты и цвета.
Для установки шрифта и размера текста выделите нужный диапазон и установите свойство Name объекта-свойства Font объекта Selection или свойство Size для изменения размера:
Excel.ActiveWorkBook.WorkSheets[1].Range['F1'].Select; Excel.Selection.Font.Name:='Courier New'; Excel.Selection.Font.Size:=18;
Если Вы хотите установить жирный или, например, наклонный стиль написания текста установите соответствующие свойства:
Excel.ActiveWorkBook.WorkSheets[1].Range['G1'].Select; Excel.Selection.Font.Bold:=true; // Для жирного текста Excel.Selection.Font.Italic:=true; // Для наклонного текста
Для указания цвета текста измените свойство ColorIndex все того же объекта Font:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1'].Select; Excel.Selection.Font.ColorIndex:=3;
Вот несколько индексов цветов:
- Индекс — Цвет
- 0 — Авто
- 2 — Белый
- 3 — Красный
- 5 — Синий
- 6 — Желтый
- 10 — Зеленый
Для изменения цвета фона ячейки используйте объект Interior свойства Selection:
Excel.ActiveWorkBook.WorkSheets[1].Range['H1'].Select; Excel.Selection.Interior.ColorIndex:=3; // Цвет
Колонтитулы.
Для добавления колонтитула к документу достаточно указать его содержание:
Excel.ActiveSheet.PageSetup.LeftFooter:='Левый нижний колонтитул'; Excel.ActiveSheet.PageSetup.CenterFooter:='Центральный нижний колонтитул'; Excel.ActiveSheet.PageSetup.RightFooter:='Правый нижний колонтитул'; Excel.ActiveSheet.PageSetup.LeftHeader:='Левый верхний колонтитул'; Excel.ActiveSheet.PageSetup.CenterHeader:='Центральный верхний колонтитул'; Excel.ActiveSheet.PageSetup.RightHeader:='Правый верхний колонтитул';
Для изменения размера шрифта добавьте к колонтитулу управляющий символ «&» и размер шрифта:
Excel.ActiveSheet.PageSetup.LeftFooter:='&7Левый нижний колонтитул';
На этом пока все. Пример к статье здесь
I wanted to know if anyone ones a way that I can export data from a DBGrid to Excel ? I am using Delphi 7 , Excel 2007 and ADO .
Any help will be appreciated.
asked Jun 12, 2013 at 5:57
0x436f726472650x436f72647265
4162 gold badges8 silver badges21 bronze badges
6
If you want a fast export of raw data, just export your recordset (ADODataset.recordset) with something like that:
procedure ExportRecordsetToMSExcel(DestName: string; Data: _Recordset);
var
ovExcelApp: OleVariant;
ovExcelWorkbook: OleVariant;
ovWS: OleVariant;
ovRange: OleVariant;
begin
ovExcelApp := CreateOleObject('Excel.Application'); //If Excel isnt installed will raise an exception
try
ovExcelWorkbook := ovExcelApp.WorkBooks.Add;
ovWS := ovExcelWorkbook.Worksheets.Item[1]; // go to first worksheet
ovWS.Activate;
ovWS.Select;
ovRange := ovWS.Range['A1', 'A1']; //go to first cell
ovRange.Resize[Data.RecordCount, Data.Fields.Count];
ovRange.CopyFromRecordset(Data, Data.RecordCount, Data.Fields.Count); //this copy the entire recordset to the selected range in excel
ovWS.SaveAs(DestName, 1, '', '', False, False);
finally
ovExcelWorkbook.Close(SaveChanges := False);
ovWS := Unassigned;
ovExcelWorkbook := Unassigned;
ovExcelApp := Unassigned;
end;
end;
answered Jun 12, 2013 at 14:05
Agustin SeifertAgustin Seifert
1,9281 gold badge16 silver badges29 bronze badges
2
It is working by using Tfilestream component
procedure TForm2.ExportdatatoexcelClick(Sender: TObject);
var
Stream: TFileStream;
i: Integer;
OutLine,f: string;
sTemp,s: string;
begin
Stream := TFileStream.Create('D:Yogesh Delphiemployee1.csv', fmCreate);
try
s := string(adotable1.Fields[0].FieldName);
for I := 1 to adotable1.FieldCount - 1 do
begin
s:= s+ ',' + string(adotable1.Fields[I].FieldName);
end;
s:= s+ #13#10;
stream.Write(s[1], Length(s) * SizeOf(Char));
{S := '';
for I := 0 to adotable1.FieldCount - 1 do
begin
S := (adotable1.Fields[I].FieldName);
outline := OutLine+S + ' ,';
end; }
while not adotable1.Eof do
begin
// You'll need to add your special handling here where OutLine is built
s:='';
OutLine := '';
for i := 0 to adotable1.FieldCount - 1 do
begin
sTemp := adotable1.Fields[i].AsString;
// Special handling to sTemp here
OutLine := OutLine + sTemp +',';
end;
// Remove final unnecessary ','
SetLength(OutLine, Length(OutLine) - 1);
// Write line to file
Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
// Write line ending
Stream.Write(sLineBreak, Length(sLineBreak));
adotable1.Next;
end;
finally
Stream.Free; // Saves the file
end;
showmessage('Records Successfully Exported.') ;
end;
{Yog}
Alexander
4,3617 gold badges26 silver badges40 bronze badges
answered Mar 26, 2018 at 11:16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
procedure OpenExcelSaveOrPrintFile(FileName: string; Deystvie: integer); // открытие файла, сохранение, печать var ExcelApplication: TExcelApplication; WorkBk: _WorkBook; WorkSheet: _WorkSheet; K, R, X, Y: Integer; IIndex: OleVariant; RangeMatrix: Variant; i, n: integer; FExcelFileName: WideString; // имя открываемого файла; FList: TStringList; FIndexList: integer; Mas: array of array of string; ns: integer; begin FList:=TStringList.Create; FExcelFileName:=ExtractFilePath(application.ExeName)+'Defaultspravka.xls'; if FileExists(FExcelFileName) then begin try ExcelApplication:=TExcelApplication.Create(nil); IIndex := 1; ExcelApplication.Connect; // Открываем файл Excel ExcelApplication.WorkBooks.Open(FExcelFileName, 2, false, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, EmptyParam, EmptyParam, 0); WorkBk := ExcelApplication.WorkBooks.Item[IIndex]; n:=WorkBk.Sheets.Count; // кол-во листов // заполнение FList именами листов for i:=1 to n do begin WorkSheet := WorkBk.WorkSheets.Get_Item(i) as _WorkSheet; FList.Add(WorkSheet.name); end; FIndexList:=1; WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; (WorkBk.Sheets[1] as _Worksheet).Select(True, 0); // Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество // столбцов, мы активируем его последнюю непустую ячейку WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; // Получаем значение последней строки X := ExcelApplication.ActiveCell.Row; // Получаем значение последней колонки Y := ExcelApplication.ActiveCell.Column; // Сопоставляем матрицу WorkSheet с нашей Delphi матрицей RangeMatrix := ExcelApplication.Range['A1', ExcelApplication.Cells.Item[X, Y]].Value2; //Номер справки ExcelApplication.Cells.Item[4, 13]:=form11.SpravkaNo; //Организация ExcelApplication.Cells.Item[9, 4]:=form11.ComboBox1.Text; //Заказчик ExcelApplication.Cells.Item[11, 3]:=form11.Edit1.Text; //Объект ExcelApplication.Cells.Item[13, 3]:=form11.Edit2.Text; //Машина ExcelApplication.Cells.Item[15, 3]:=form11.Edit3.Text; //Марка ExcelApplication.Cells.Item[15, 11]:=form11.Edit4.Text; //Госномер ExcelApplication.Cells.Item[17, 12]:=form11.Edit5.Text; //Машинисты ExcelApplication.Cells.Item[18, 4]:=form11.Edit6.Text; //Период работы - с ExcelApplication.Cells.Item[15, 21]:=form11.Edit7.Text; //Период работы - по ExcelApplication.Cells.Item[15, 24]:=form11.Edit8.Text; //Дата составления - число ExcelApplication.Cells.Item[8, 20]:=formatdatetime('dd', now); //Дата составления - месяц ExcelApplication.Cells.Item[8, 22]:=formatdatetime('mm', now); //Дата составления - год ExcelApplication.Cells.Item[8, 25]:=formatdatetime('yy', now); for ns:=1 to form11.StringGrid1.RowCount-1 do begin //Наименование работ ExcelApplication.Cells.Item[25+ns-1, 1]:=form11.StringGrid1.Cells[0, ns]; //Кол-во ExcelApplication.Cells.Item[25+ns-1, 14]:=form11.StringGrid1.Cells[1, ns]; //Стоимость часа работы ExcelApplication.Cells.Item[25+ns-1, 18]:=floattostrf(strtofloat(form11.StringGrid1.Cells[2, ns]), ffCurrency, 7, 2); //Стоимость работы ExcelApplication.Cells.Item[25+ns-1, 23]:=floattostrf(strtofloat(form11.StringGrid1.Cells[3, ns]), ffCurrency, 7, 2); end; //Итого - Машино-часов ExcelApplication.Cells.Item[32, 14]:=form11.StaticText2.Caption; //Итого - работы ExcelApplication.Cells.Item[32, 23]:=floattostrf(strtofloat(form11.StaticText3.Caption), ffCurrency, 7, 2); //Сумма НДС ExcelApplication.Cells.Item[35, 23]:=floattostrf(strtofloat(form11.StaticText4.Caption), ffCurrency, 7, 2); //Всего с учетом НДС ExcelApplication.Cells.Item[36, 23]:=floattostrf(strtofloat(form11.StaticText5.Caption), ffCurrency, 7, 2); //Исполнитель - расшифровка подписи ExcelApplication.Cells.Item[41, 17]:=form11.Edit11.Text; //Исполнитель - должность ExcelApplication.Cells.Item[41, 5]:=form11.Edit12.Text; //Отработано машино часов ExcelApplication.Cells.Item[37, 7]:=SumNumToFull(strtofloat(form11.StaticText2.Caption)); case Deystvie of 1: Worksheet.SaveAs(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); 2: Worksheet.PrintOut(EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, lcid); end; Mas:=nil; setlength(Mas, X, Y); // Определяем цикл для заполнения for R:=1 to Y do for K:=1 to X do Mas[K-1, R-1]:=string(RangeMatrix[K, R]); finally // закрываем без вопроса на сохранение изменений ExcelApplication.DisplayAlerts[0]:=false; ExcelApplication.WorkBooks.Close(0); // Выходим из Excel и отсоединяемся от сервера ExcelApplication.Quit; ExcelApplication.Disconnect; // Unassign the Delphi Variant Matrix RangeMatrix := Unassigned; ExcelApplication.Free; end; end else showmessage('Нет файла шаблона - '+FExcelFileName); FList.Free; end; |
unit uExportSales;
interface
type
TExport = class
procedure ExportRestSalesXLS;
procedure ExporAlltSalesXLS;
end;
implementation
uses
FireDAC.Comp.Client, //
uDBConnection, System.Win.ComObj, System.AnsiStrings, System.IOUtils, Vcl.Forms,
Vcl.Graphics, System.SysUtils, System.Variants;
procedure TExport.ExportRestSalesXLS;
function getCountAlreadyExported(): integer;
var
q: TFdquery;
begin
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := ‘SELECT value FROM salesforecast_db.servicetable where name=’‘salesXLSFileCount’‘;’;
Disconnect();
Open();
result := FieldByName(‘value’).AsInteger;
Close();
end;
finally
q.free();
end;
end;
function getCountSales(): Integer;
var
q: TFdquery;
begin
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := DBConnection_Sales.qCountSales.SQL.Text;
Disconnect();
Open();
result := FieldByName(‘countSales’).AsInteger;
Close();
end;
finally
q.free();
end;
end;
var
e: Variant;
q: TFDQuery;
countRecAlreadyExported: integer;
i: integer;
filePath: string;
countSales: int64;
begin
countRecAlreadyExported := getCountAlreadyExported();
countSales := getCountSales();
e := CreateOleObject(‘Excel.Application’);
filePath := ExtractFilePath(Application.ExeName) + ‘sales.xlsx’;
if TFile.Exists(‘sales.xlsx’) then
e.workbooks.open(filePath)
else
begin // create new
e.Workbooks.Add;
e.columns[1].columnwidth := 24.71;
e.columns[2].columnwidth := 24.71;
e.columns[3].columnwidth := 24.71;
e.columns[4].columnwidth := 24.71;
e.columns[5].columnwidth := 24.71;
e.columns[6].columnwidth := 24.71;
e.columns[7].columnwidth := 24.71;
e.columns[8].columnwidth := 24.71;
// e.ActiveWorkBook.WorkSheets[1].Cells[1, 2] := ‘Текст ячейки (1,2)’;
//
e.ActiveSheet.PageSetup.LeftMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.RightMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.TopMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.BottomMargin := e.Application.InchesToPoints(0.44);
//
e.Rows[1].font.bold := true;
e.Rows[1].font.size := 10;
e.Rows[1].font.color := clBlack;
// headers…
e.ActiveWorkBook.WorkSheets[1].cells[1, 1] := ‘Дата’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 2] := ‘Номер’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 3] := ‘Отдел’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 4] := ‘Название’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 5] := ‘Цена’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 6] := ‘Количество’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 7] := ‘Сумма’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 8] := ‘Устройство’;
//
countRecAlreadyExported := 0;
end;
// e.Visible := true;
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := DBConnection_Sales.qSales.SQL.Text + ‘limit ‘ + countRecAlreadyExported.ToString + ‘,10000’;
Disconnect();
Open();
i := countRecAlreadyExported + 1;
while not eof do
begin
e.ActiveWorkBook.WorkSheets[1].cells[i, 1] := DateTimeToStr(FieldByName(‘localDate’).AsDateTime);
e.ActiveWorkBook.WorkSheets[1].cells[i, 2] := FieldByName(‘doubleNumber’).AsString; //doubleNumber
e.ActiveWorkBook.WorkSheets[1].cells[i, 3] := FieldByName(‘depName’).AsString; // ‘Отдел’; //depName
e.ActiveWorkBook.WorkSheets[1].cells[i, 4] := FieldByName(‘goodName’).AsString; //’Название’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 5] := FormatFloat(‘0.00’, FieldByName(‘price’).AsFloat); //’Цена’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 6] := FieldByName(‘quantity’).AsInteger.ToString(); //’Количество’; //quantity
e.ActiveWorkBook.WorkSheets[1].cells[i, 7] := FormatFloat(‘0.00’, FieldByName(‘summ’).AsFloat);
e.ActiveWorkBook.WorkSheets[1].cells[i, 8] := FieldByName(‘deviceName’).AsString; //’Устройство’; //
inc(i);
Next();
end;
Close();
//test
{
i := i + 1;
e.ActiveWorkBook.WorkSheets[1].cells[i, 1] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 2] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 3] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 4] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 5] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 6] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 7] := ‘test’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 8] := ‘test’;
}
// update countExported
// UPDATE `salesforecast_db`.`servicetable` SET `value`=’10206′ WHERE `id`=’2′;
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := ‘UPDATE `salesforecast_db`.`servicetable` SET `value`=:value WHERE `name`=’‘salesXLSFileCount’»;
params.ParamValues[‘value’] := countSales;
ExecSQL;
end;
finally
q.free();
end;
//
e.DisplayAlerts := False;
e.ActiveWorkbook.SaveAs(ExtractFilePath(Application.ExeName) + ‘salesTemp.xlsx’);
e.Application.Quit;
e := Unassigned;
TFile.Delete(filePath);
TFile.Copy(ExtractFilePath(Application.ExeName) + ‘salesTemp.xlsx’, ExtractFilePath(Application.ExeName) + ‘sales.xlsx’);
TFile.Delete(ExtractFilePath(Application.ExeName) + ‘salesTemp.xlsx’);
end;
finally
q.free();
//e.DisplayAlerts := False;
//e.ActiveWorkbook.Save();
//e.DisplayAlerts := True;
end;
// export more records
end;
procedure TExport.ExporAlltSalesXLS;
var
e: Variant;
sheet: Variant;
q: TFDQuery;
i: integer;
countSales: int64;
const
xlContinuous = 1;
xlThin = 2;
xlTop = —4160;
xlCenter = —4108;
begin
e := CreateOleObject(‘Excel.Application’);
e.Workbooks.Add;
e.columns[1].columnwidth := 24.71;
e.columns[2].columnwidth := 24.71;
e.columns[3].columnwidth := 24.71;
e.columns[4].columnwidth := 24.71;
e.columns[5].columnwidth := 24.71;
e.columns[6].columnwidth := 24.71;
e.columns[7].columnwidth := 24.71;
e.columns[8].columnwidth := 24.71;
// e.ActiveWorkBook.WorkSheets[1].Cells[1, 2] := ‘Текст ячейки (1,2)’;
//
e.ActiveSheet.PageSetup.LeftMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.RightMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.TopMargin := e.Application.InchesToPoints(0.44);
e.ActiveSheet.PageSetup.BottomMargin := e.Application.InchesToPoints(0.44);
//
e.Rows[1].font.bold := true;
e.Rows[1].font.size := 10;
e.Rows[1].font.color := clBlack;
// headers…
sheet := e.workbooks[1].worksheets[1];
e.ActiveWorkBook.WorkSheets[1].cells[1, 1] := ‘Дата’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 2] := ‘Номер’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 3] := ‘Отдел’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 4] := ‘Название’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 5] := ‘Цена’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 6] := ‘Количество’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 7] := ‘Сумма’;
e.ActiveWorkBook.WorkSheets[1].cells[1, 8] := ‘Устройство’;
//
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := DBConnection_Sales.qCountSales.SQL.Text;
Disconnect();
Open();
countSales := FieldByName(‘countSales’).AsInteger;
Close();
end;
finally
q.free();
end;
//
q := TFdquery.Create(nil);
try
with q do
begin
connection := DBConnection_Sales.FDConnection;
sql.Text := DBConnection_Sales.qSales.SQL.Text;
params.ParamValues[‘limit’] := countSales;
Disconnect();
Open();
i := 2;
while not eof do
begin
e.ActiveWorkBook.WorkSheets[1].cells[i, 1] := DateTimeToStr(FieldByName(‘localDate’).AsDateTime);
e.ActiveWorkBook.WorkSheets[1].cells[i, 2] := FieldByName(‘doubleNumber’).AsString; //doubleNumber
e.ActiveWorkBook.WorkSheets[1].cells[i, 3] := FieldByName(‘depName’).AsString; // ‘Отдел’; //depName
e.ActiveWorkBook.WorkSheets[1].cells[i, 4] := FieldByName(‘goodName’).AsString; //’Название’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 5] := FormatFloat(‘0.00’, FieldByName(‘price’).AsFloat); //’Цена’;
e.ActiveWorkBook.WorkSheets[1].cells[i, 6] := FieldByName(‘quantity’).AsInteger.ToString(); //’Количество’; //quantity
e.ActiveWorkBook.WorkSheets[1].cells[i, 7] := FormatFloat(‘0.00’, FieldByName(‘summ’).AsFloat);
e.ActiveWorkBook.WorkSheets[1].cells[i, 8] := FieldByName(‘deviceName’).AsString; //’Устройство’; //
inc(i);
Next();
end;
Close();
end;
finally
q.free();
end;
e.Visible := true;
end;
end.