Exporter une grille TRxDBGridSort en format xls [Résolu]

Messages postés
20
Date d'inscription
dimanche 9 novembre 2008
Statut
Membre
Dernière intervention
26 août 2009
- - Dernière réponse : cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
- 26 août 2009 à 19:12
Bonjour !

Voila, tout est dans le titre, j'affiche des informations de ma base de donnée dans une grille de type TRxDBGridSort et j'aimerai que l'utilisateur puisse exporter cette grille en format xls pour l'enregistrer sur son bureau ou n'importe... Je sais pas quoi dire de plus je pense que c'est clair mais au cas ou ça ne le serait pas, n'hésitez pas.
Merci d'avance
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
20
Date d'inscription
dimanche 9 novembre 2008
Statut
Membre
Dernière intervention
26 août 2009
3
Merci
Merci pour ta réponse, j'avais trouvé un bout de code sur ce forum et je l'ai adapté a mes besoins, je le poste au cas ou ça intéresserai quelqu'un même si j'ai pas tellement modifié l'original :

Il faut donc appeler la fonction SaveAsExcelFile qui renvoie vraie si l'export a bien eu lieu et faux sinon.
Elle prend deux paramètres, la grille que l'on veut exporter, et le chemin ou on souhaite exporter cette grille finit par le nom.
Donc par exemple je veux exporter ma grille "tableau" et l'enregistrer dans programme files en la nommant "essai" bien j'aurai :

if (SaveAsExcelFile(tableau, 'C:\Program Files\essai.xls')) then
showmessage('l''export a bien été fait')
else
showmessage('l''export n''a pu se faire');

function SaveAsExcelFile(AGrid: TRxDBGridSort; AFileName: string) : Boolean ;
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
CXlsEof: array[0..1] of Word = ($0A, 00);
var
FStream: TFileStream;
I, J, k: Integer;
Memo : String;
begin
Result:=false;
//Cré le fichier xls dans lequel on va enregistrer la dbgrid
FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
j:=0;
try
//On se place sur la première ligne de la dbgrid
AGrid.datasource.dataset.First;
while not(AGrid.datasource.dataset.Eof) do
begin
CXlsBof[4] := 0;
FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
for i :=0 to AGrid.ColCount - 2 do
begin
//On vérifie que la colonne ne représente pas une image puisque ca ne peut pas s'enregistrer dans un fichier xls
if (not((AGrid.datasource.DataSet.FieldByName(AGrid.columns[i].FieldName)).Datatype=ftBlob)) then
//Si ce n'est pas un mémo on enregistre tel quel dans le fichier
if (not((AGrid.datasource.DataSet.FieldByName(AGrid.columns[i].FieldName)).Datatype=ftMemo)) then
XlsWriteCellLabel(FStream, I, J, AGrid.columns[i].Field.AsString)
//Si c'est un mémo on remplace les sauts de ligne par un espace
else
begin
Memo:=AGrid.columns[i].Field.AsString;
Memo := StringReplace(Memo, char(10),' ', [rfreplaceAll]);
Memo := StringReplace(Memo, char(13),' ', [rfreplaceAll]);
XlsWriteCellLabel(FStream, I, J, Memo);
end;
end;
j:=j+1;
AGrid.datasource.dataset.Next;
end;
FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
Result:=true;
finally
FStream.Free;
end;
end;

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
const
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jenniguigui
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
3
Merci
oui, mais il semble qu'en fait cette fonction crée un fichier tout à fait exploitable mais pas du format .XLS

autre chose au lieu de passer en paramètre le grid tu peux aussi mettre un seul TPopup sur l'ensemble de tes grids.

et de ce fait, le grid à exporter devient celui qui détient le sender..

et sur une commande du menu Popup tu exportes celui sélectionné..

cantador

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Bonjour,

je ne connais pas le TRxDBGridSort mais c'est un dbgrid apparemment...
donc chercher :
- s'il possède des méthodes d'exportation toutes prêtes.
- voir aussi les autres compos de la palette
- soit utiliser des méthodes basées sur les datasets


cantador
Commenter la réponse de cs_cantador
Messages postés
20
Date d'inscription
dimanche 9 novembre 2008
Statut
Membre
Dernière intervention
26 août 2009
0
Merci
en fait, "Exporter en xls" est contenu dans un popupmenu qui est générer dans une fiche unit1 et comme tous mes fiches héritent de unit1 bien sur je ne répète pas la fonction pour chaque grille.
Je pense que ca rejoint ce que tu voulais dire ?

De plus, le fichier a bien une extension xls et affiche bien les informations nécessaires présentent dans les grilles de mon progiciel alors cela suffit amplement.

Bonne journée ! Et je ne le dirais jamais assez, merci
Commenter la réponse de jenniguigui
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Je pense que ca rejoint ce que tu voulais dire ?

oui tout à fait

le fichier a bien une extension xls

Ce n'est pas une condition suffisante pour former un .XLS !
mais du moment que cela convient dans ton programme..


cantador
Commenter la réponse de cs_cantador