salut tous le monde
j ai besoin d'une méthode pour exporter des informations sur DBGrid vers un fichier excel
j ai utiliser Firedac comme base de données (Datamodule form)
et DBGrid situer a une autre form (exp Form2)
salut tous le monde
j ai besoin d'une méthode pour exporter des informations sur DBGrid vers un fichier excel
j ai utiliser Firedac comme base de données (Datamodule form)
et DBGrid situer a une autre form (exp Form2)
Bonjour,
Firedac est un connecteur à des bases de données diverses et variées, pas une base de données, donc déjà ici, il y a premières interrogations de ma part,J'utilise Firedac comme base de données (Datamodule form)
- s'agit-il d'une connexion Firedac vers un fichier Excel (oui c'est possible);
- s'agit-il d'une coquille, vous vouliez dire une base de données Firebird connectée avec Firedac;
- ou encore d'autres combinaisons ?
Cela veut-il dire que vous faites des manipulations particulières sur cette grille, manipulations qui ne seront pas enregistrées dans la table de la base de données ? Sinon que vient faire la grille dans la discussion, n'utiliseriez-vous pas plutôt directement sur les données de la table (ou de la requête)Mon DBGrid située sur une autre form (exp Form2)
J'ai besoin d'une méthode pour exporter des informations sur DBGrid vers un fichier Excel
Avant d'aller plus avant avez-vous fait des recherches dans le forum ? C'est un sujet relativement fréquent. Sortez de la discussion, utilisez le bouton déroulant "rechercher dans ce forum", tapez les mots clés "export excel" et lancer la recherche, vous retrouverez nombre de discussions![]()
Sinon, je dirais pour ma part qu'il y a plusieurs choix possibles :
- L'accès direct au tableur via Ole (voir FAQs), le plus documenté dans le forum, un impératif Excel doit être installé sur le poste. A priori, si je regarde votre première discussion une tentative a été faite en ce sens.
- l'accès au tableau directement avec Firedac (il y a diverses contraintes, à ma souvenance : existence du tableau, définition de plage etc ..)
, voir cette vidéo "https://www.youtube.com/watch?v=GpV_40n3zas" (NB, c'est à dessein que j'ai mis le lien entre guillemets)
- L'utilisation composant tiers, je pense aux composants de Scalabium smExport et côté grille à sa célèbre smdbgrid , mais aussi à la suite de TMS Software TMSGridPack et ses possibilités d'export associées, côté gratuit les composants de la JVCL tjvDBGridExcelExport
- dépendant de votre version de Delphi, l'utilisation de CData Excel (on en revient à Firedac
) gratuit pour les versions entreprise et +, (quoiqu'il soit assez complexe de créer un nouveau tableau, et que cela limite aux nouveaux formats excel : xlsx (voir ici comment j'ai pu faire)
- L'export sous un format CSV plutôt que directement dans un fichier Excel (là FdBatchMove sera votre ami)
En l'attente d'éclaircissement sur votre environnement et vos choix
Ce petit code basé sur OLE Automation que j'utilise fréquemment te permettra d'exporter ton dataset
Note que cela nécessite qu'Excel soit installé sur la machine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 unit u_excel; interface uses SysUtils, Classes, Registry, Forms, Controls, Variants, Windows, ComObj, Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client ; function CheckForExcelApplication : Boolean; function ExportToExcelFile(Query : TFDQuery) : Boolean; implementation const xlWBATWorksheet = -4167; function CheckForExcelApplication : Boolean; var Registry : TRegistry; begin Result:=False; Registry:=TRegistry.Create(KEY_READ); Registry.RootKey:=HKEY_CLASSES_ROOT; if Registry.KeyExists('Excel.Application')=False then begin MessageDlg('Microsoft Excel n''est pas installé sur votre machine !',mtWarning,[mbOk],0); end else Result:=True; Registry.Free; end; function ExportToExcelFile(Query : TFDQuery) : Boolean; var Temp : string; Buffer : TStringList; Index : Integer; XLApp, Sheet, Data: OLEVariant; Col : Integer; Row : Integer; RecNo : Integer; function RefToCell(ARow, ACol: Integer): string; begin Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow); end; begin Screen.Cursor:=crHourGlass; Result:=False; RecNo:=Query.RecNo; Query.DisableControls; Query.FetchAll; Query.First; // Préparer l'entête des colonnes Col:=0; for Index:=0 to Pred(Query.FieldCount) do begin if Query.Fields.Fields[Index].Visible then Inc(Col); end; Data:=VarArrayCreate([1, 1, 1, Col], varVariant); Col:=1; for Index:=0 to Pred(Query.FieldCount) do begin if Query.Fields.Fields[Index].Visible then begin Data[1,Col]:=Query.Fields.Fields[Index].DisplayLabel; Inc(Col); end; end; // On envoi l'entête dans la feuille try XLApp := CreateOleObject('Excel.Application'); XLApp.Visible := True; XLApp.Workbooks.Add(xlWBatWorkSheet); Sheet := XLApp.Workbooks[1].WorkSheets[1]; Sheet.Name:='Essai'; // Fill up the sheet Sheet.Range[RefToCell(1, 1), RefToCell(1,Col-1)].Value := Data; except on E:Exception do begin Data:=Unassigned; MessageDlg('Impossible de trouver une instance de Microsoft Excel !',mtError,[mbOk],0); Screen.Cursor:=crDefault; Exit end; end; Data:=VarArrayCreate([1, Query.RecordCount, 1, Col-1], varVariant); for Row:=1 to Query.RecordCount do begin Col:=1; for Index:=0 to Pred(Query.FieldCount) do begin if Query.Fields.Fields[Index].Visible then begin if (Query.Fields.Fields[Index].DataType=ftDate) or (Query.Fields.Fields[Index].DataType=ftDateTime) then begin Data[Row,Col]:=Query.Fields.Fields[Index].AsDateTime; if (Query.Fields.Fields[Index].IsNull) or (Query.Fields.Fields[Index].AsDateTime=0) then Data[Row,Col]:=''; end else Data[Row,Col]:=Query.Fields.Fields[Index].DisplayText; Inc(Col); end; end; Query.Next; end; try Sheet.Range[RefToCell(2, 1), RefToCell(1+Query.RecordCount,Col-1)].Value := Data; finally Data:=Unassigned; end; Screen.Cursor:=crDefault; if not VarIsEmpty(XLApp) then begin XLAPP := Unassigned; Sheet := Unassigned; end; Query.RecNo:=RecNo; Query.EnableControls; Result:=True; end; end.
Salut mr sergio_is_back
merçi pour votre réponse
e c que tu me donnée un exemple (petit programme)
Le format CSV est reconnu par Excel.
Si cela te suffi, voici un exemple d'exportation en fichier .CSV
EDIT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TForm1.BtnExportToCSVClick(Sender: TObject); var Stream: TFileStream; i: Integer; OutLine: string; sTemp: string; begin DBGrid1.dataSource:=nil; Stream := TFileStream.Create('C:\temp\YourFile.csv', fmCreate); try while not FDTable1.Eof do begin // You'll need to add your special handling here where OutLine is built OutLine := ''; for i := 0 to FDTable1.FieldCount - 1 do begin sTemp := FDTable1.Fields[i].AsString; // Special handling to sTemp here OutLine := OutLine + sTemp + ';'; end; // Remove final unnecessary ',' SetLength(OutLine, Length(OutLine) - 1); // Write line to file WriteLnStreamText(Stream,OutLine); FDTable1.Next; end; finally Stream.Free; // Saves the file end; DBGrid1.dataSource:=dataSource1; end;
J'ai oublié de joindre ces fonctions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //------------------------------------------------------------------------------------------------------------------------------ Procedure WriteStreamText(Stream:TStream;Str:String); Begin if Str<>'' then Stream.Write(Str[1], Length(Str) * SizeOf(Str[1])); End; //------------------------------------------------------------------------------------------------------------------------------ Procedure WritelnStreamText(Stream:TStream;Str:String); Begin WriteStreamText(Stream,Str+#13#10); End; //------------------------------------------------------------------------------------------------------------------------------
Partager