IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Problème lors d'exportation des données vers un fichier Excel


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut Problème lors d'exportation des données vers un fichier Excel
    Bonsoir à tous,
    pour l'exportation de mon Dataset vers un fichier Excel , j'utilise cette procédure :

    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
    procedure TFMonEtat.Button3Click(Sender: TObject);
    var Tab: _workbook;
        Feuil: _worksheet;
        i,j:Integer;
        S:shortstring;
    begin
       try
        ExcelApplication1.Connect;
        ExcelApplication1.Visible[0]:=False;
        Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
        //ExcelApplication1.Visible[0]:=true;
        feuil:=Tab.Worksheets[1] as _worksheet;
              For i:=0 to DBGrid1.Columns.Count-1 do
              begin
                with Feuil.Range[MonTableau[i+1]+'1',MonTableau[i+1]+'1'] do
                begin
                  Value[xlRangeValueDefault]:= DBGrid1.Columns.Items[i].Title.Caption;
                  Font.Name:='times new roman';
                  Font.Size:=10;
                  Font.Bold:=True;
                 With Interior do
                 begin
                      ColorIndex := 15;
                      Pattern := xlSolid;
                      PatternColorIndex := xlAutomatic;
                 End;
                 With Borders do
                 begin
                      LineStyle := xlContinuous;
                      Weight := xlThin;
                      ColorIndex := xlAutomatic;
                 End;
                end;
              end;
              j:=2;
              xQuery1.First;
              While not xQuery1.Eof do
              begin
                 For i:= 1 To  DBGrid1.Columns.Count Do
                 begin
                    s := MonTableau[i]+inttostr(j);
                   Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
                 end;
                 xQuery1.Next;
                 j:=j+1;
              end;
     
     
       finally
     
            SUIMsgDlg(' Exportation des données Terminée . ','MyApp',mtInformation,[mbOK],suiMessageDialog1.UIStyle);
            ExcelApplication1.Visible[0]:=true;
            ExcelApplication1.Cells.Select;
            ExcelApplication1.Columns.AutoFit;
            ExcelApplication1.Range['A1','A1'].Select;
            ExcelApplication1.Disconnect;
       end;
     
    end;
    avec MonTableau est déclaré comme une variable globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Var   MonTableau : array [1..26]of string[1]=('A','B','C','D','E','F','G','H','I','J','K','L',
                           'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

    L’exportation s’exécute bien , mais pour des champs de type texte qui ont des valeurs numériques , ils sont considérés comme des champs de type numérique.
    même pour la date, elle est inversée ,
    c'est-à-dire au lieu du '18/02/2018' j’obtiens '02/18/2018'

    Nom : DbGridToExcel.png
Affichages : 540
Taille : 15,7 Ko

    Avez-vous une idée SVP ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 092
    Points : 41 067
    Points
    41 067
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je ne suis pas un spécialiste de l'export vers Excel, plutôt vers OpenOffice mais en gros je dirais que c'est votre faute puisque vous passez toutes vos valeurs comme des strings.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 717
    Points : 5 358
    Points
    5 358
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    je ne suis pas un spécialiste de l'export vers Excel, plutôt vers OpenOffice mais en gros je dirais que c'est votre faute puisque vous passez toutes vos valeurs comme des strings.
    Je dirais même que c'est la ligne suivante qui pose problème :
    Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;

  4. #4
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Bonjour.
    Merci pour vos réponses,
    Mais comment régler ce problème?

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 092
    Points : 41 067
    Points
    41 067
    Billets dans le blog
    62
    Par défaut
    si j'en crois la FAQ
    en utilisant value.
    C'est d'ailleurs ce que je fait pour OpenOffice des SetValue

    Donc quelque chose comme Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].value; serait déjà mieux AMHA, reste que pour les dates, j'ai un doute
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    J ai déjà utilisé value au lieu de string,
    Et j ai eu le même problème.

  7. #7
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Bonjour a tous,
    une solution dont j'ai trouvée ,
    j'ai ajouté cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].NumberFormat  := 'Text';
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    Feuil.Range[s,s].NumberFormat  := 'Text';
                    Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
    puis je modifie les propriétés des colonnes directement dans le fichier excel généré .

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Tu peux directement mettre en forme l'affichage de données chiffrées sans passer par le format "Text".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].NumberFormat  := '#,##0.00';
    Ainsi, tes valeurs seront affichées correctement. Le code complet est donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Feuil.Range[s,s].NumberFormat  := '#,##0.00';
    Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
    J'utilise cette méthode régulière dans une application où les résultats doivent être affichés obligatoirement dans un tableau Excel.

    Bon courage

  9. #9
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par seabs Voir le message
    Bonjour,

    Tu peux directement mettre en forme l'affichage de données chiffrées sans passer par le format "Text".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].NumberFormat  := '#,##0.00';
    Merci seabs pour la réponse , j'ai déjà utilisé ce format mais ca na pas donnée de bonne résultat .

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 092
    Points : 41 067
    Points
    41 067
    Billets dans le blog
    62
    Par défaut
    Cela pourrait fonctionner à condition de changer les FormatSettings pour avoir le format US (aussi bien pour les dates que pour les nombres) et, bien évidemment , indiquer les format des colonnes.

    N'ayant Excel sur aucun de mes postes j'en reste là !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 140
    Points
    3 140
    Par défaut
    Bonjour,

    essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].Value[xlRangeValueDefault] := '''' + DBGrid1.Fields[i-1].AsString;
    Chez moi cela fonctionne depuis un StringGrid vers Excel :

    A+
    Charly

  12. #12
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].Value[xlRangeValueDefault] := '''' + DBGrid1.Fields[i-1].AsString;
    Chez moi cela fonctionne depuis un StringGrid vers Excel :

    A+
    Charly
    Merci Charly910 pour la réponse ,
    ça marche très bien , mais j'ai perdu le format monétaire pour les rubrique monétaire.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    @SergioMaster
    Cela pourrait fonctionner à condition de changer les FormatSettings pour avoir le format US (aussi bien pour les dates que pour les nombres) et, bien évidemment , indiquer les format des colonnes.
    Si nous sommes en format français, il faut simplement inverser la ponctuation. Mettre une virgule comme ponctuation décimale et un point pour le séparateur des milliers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil.Range[s,s].NumberFormat  := '#.##0,00';
    Pour examiner ce qui est possible, il convient de faire des essais avec une macro VBA dans Excel, puis d'appliquer dans son application Delphi.
    C'est juste mon avis.

  14. #14
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Bonjour a tous,
    enfin , j'ai trouvé la solution
    il faut testé le type du champs dans le Dbgrid , puis affecter le format qui lui convient.

    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
                    if DBGrid1.Fields[i-1].DataType  = ftCurrency then
                    begin
                       //Feuil.Range[s,s].NumberFormat  := '#,##0.00';
                       Feuil.Range[s,s].Value[xlRangeValueDefault] := DBGrid1.Fields[i-1].AsCurrency;
                    end
                    else
                        if DBGrid1.Fields[i-1].DataType  in [ftDate,ftDateTime] then
                        begin
                           Feuil.Range[s,s].NumberFormat  := 'jj/mm/aaaa'; 
                           Feuil.Range[s,s].Value[xlRangeValueDefault] := DBGrid1.Fields[i-1].AsDateTime;
                        end
                        else
                          begin
                             Feuil.Range[s,s].NumberFormat  := 'Text';
                             Feuil.Range[s,s].Value[xlRangeValueDefault] := '''' + DBGrid1.Fields[i-1].AsString;
                          end ;
    peut être sa va être utile pour quelqu'un d'autre .
    Merci a vous tous.
    amicalement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/01/2016, 12h44
  2. Exporter des données vers un fichier Excel
    Par providence dans le forum Import/Export
    Réponses: 5
    Dernier message: 13/08/2010, 18h36
  3. Réponses: 1
    Dernier message: 14/05/2007, 14h52
  4. [DELPHI6] Comment exporter des données vers un fichier XML ?
    Par zoaax dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/10/2006, 15h58
  5. exporter des données vers un fichier text
    Par JauB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/07/2006, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo