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

Langage Delphi Discussion :

Export Delphi vers Excel très lent


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut Export Delphi vers Excel très lent
    Bonjour,

    J'utilise la méthode Ole pour exporter mon StringAlignGrid vers un classeur excel.

    Seul probleme, ca met plus d'une minute pour exporter 380 lignes et 25 colonnes.
    Sachant que j'ai des tableaux bien plus gros, je voulais savoir si il existe un autre moyen, beaucoup plus rapide pour exporter des données vers Excel?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Sandara Voir le message
    J'utilise la méthode Ole pour exporter mon StringAlignGrid vers un classeur excel.
    C'est-à-dire ?
    Tu ouvres Excel, et tu rempli case par case ?

    Moi, je génère un fichier texte, avec séparateur (le point-virgule par exemple), et je demande à Excel de l'importer (par OLE).
    C'est BEAUCOUP plus rapide.

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Oui j'utilise Ole pour remplir case par case mon fichier Excel.

    Donc passer par un fichier texte est le plus rapide ou existe il un autre moyen?
    Je préfere me renseigner et savoir s'il en existe une meilleure avant de me lancer dans cette méthode.

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Peux tu m'eclairer sur la démarche à suivre pour faire l'import d'un fichier texte en Ole ?

    Merci

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    moi je te recommande les composants XLSReadWriteII qui sont excellents et ne nécessitent pas Excel sur le poste ... c'est très intéressant notamment quand tu as une politique de migration à OpenOffice
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Si tu veux un truc pas trop complexe gratos et sans besoin d'Excel tu peux interpréter ce bout de code (trouvé sur Torry je crois) :
    Pour voir un exemple d'utilisation tu peux en récupérer un ici (https://sourceforge.net/projects/axbase/)

    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
    function SaveAsExcelFile(ADataSet: TDataSet; 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;
      ICol, iRow: Integer;
     
        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;
    begin
      Result := False;
      FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
      try
        CXlsBof[4] := 0;
        FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
        ADataSet.DisableControls;
        ADataSet.first;iRow := 0;
         while not ADataSet.EOF do
         begin
            iRow := iRow+1;
            for ICol := 0 to ADataSet.FieldCount - 1 do
              XlsWriteCellLabel(FStream, ICol+1, iRow,ADataSet.Fields[ICol].AsString);
            ADataSet.Next;
         end;
         ADataSet.DisableControls;
     
     
        FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
        Result := True;
      finally
        FStream.Free;
      end;
    end;

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    j'ai un peu la même chose en un peu plus évolué sur mon site

    mais XLStream ne génère que des documents Excel 2.1; j'avais commencé à travailler sur le format Excel 97 quand je suis tombé sur XLSReadWriteII qui représente un travail colossal et qui est super bien fait
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    il y a aussi les composants Flexcel (anciennement gratuits, ils sont maintenant distribués par TMS). Je les utilisent régulièrement, ils sont très performants et permette de faire des tableaux avancés (par exemple des croisés dynamiques) sans avoir Excel, ils tournent même sous Kylix (pour ceux qui connaissent encore).

    @++
    Dany

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Je viens de tester ton code philnext, je dois dire que la rapidité d'execution est parfaite!

    Cependant j'ai tout de meme un petit soucis.

    Les données que j'exporte vers excel sont des tableaux de chiffres et il doit etre possible par la suite de faire des calculs sur ces derniers. Le problème est que je ne peux pas choisir le type des données (numérique, monétaire, date, texte...), ce qui compliquent les choses!

    Y a t'il un moyen d'affecter un type aux données ?

    Merci d'avance.

    PS : Merci beaucoup pour toutes vos réponses.

  10. #10
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Ben alors je te conseille de regarder le site de Paul : http://www.zoo-logique.org/tothpaul/...p?dprdoc.biff8

    Si j'ai le temps j'essayerais d'intégrer ses sources à mon exemple mais pas à court terme.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    oups

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Je viens de trouver ce code pour le format numérique en cherchant sur des sites étrangers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word; const AValue: Double);
    const
      CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
    begin
      CXlsNumber[2] := ARow;
      CXlsNumber[3] := ACol;
      XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
      XlsStream.WriteBuffer(AValue, 8);
    end;

    Ca a l'air de bien marcher, apres ce qui est plus embettant c'est qu'il faut savoir à l'avance quelles cellules sont numériques et lesquelles sont des chaines, il n'y a pas moyen de le faire dynamiquement si l'on exporte directement d'une TStringAlignGrid

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Maintenant que j'ai reussi a mettre en place l'export de mon tableau, j'aurais voulu le formater afin qu'il soit mieux présenté. ( Mettre des bordures et diminué la taille )

    J'ai recherché dans des doc. en anglais et c'est incompréhensible !

    Quelqu'un pourrait-il m'éclaircir la dessus, ou alors peut-etre existe il des documents en francais plus clairs.

    Je vous joint le fichier pdf de documentation sachant que les points interessants d'apres moi sont les 2.7 , 2.9 , 5.1.

    Merci d'avance pour votre aide.

    excelfileformat.rar

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Personne ne saurait m'aider ?

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    XLSReadWriteII gère les formats, les formules, les graphiques, enfin bref, quasiment tout ce qu'il est possible de gérer

    il me semble que tu génères du BIFF5, soit du Excel 2.1, le formatage est assez limité...mais mon programme demo dans XLStream montre quelques possibilités de mise en page.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. export access vers excel en asp
    Par oniric dans le forum ASP
    Réponses: 9
    Dernier message: 24/03/2006, 14h21
  2. [VB6] Problème Export mshflexgrid vers Excel
    Par dubidon dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/02/2006, 13h28
  3. Réponses: 1
    Dernier message: 01/11/2005, 12h04
  4. Export requete vers excel et mise en forme
    Par ston dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2005, 16h55
  5. Export ASP vers excel
    Par steph04 dans le forum ASP
    Réponses: 4
    Dernier message: 04/05/2005, 01h22

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