Delphi как выгрузить в excel

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

0x436f72647265's user avatar

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 Seifert's user avatar

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's user avatar

Alexander

4,3617 gold badges26 silver badges40 bronze badges

answered Mar 26, 2018 at 11:16

user9552247's user avatar

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.

Понравилась статья? Поделить с друзьями:
  • Delphi если файл excel не открыт
  • Delphi если excel открыт то закрыть
  • Delphi если excel не установлен
  • Delphi добавить строку в excel
  • Delphi фильтр как в excel