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

Delphi Discussion :

Ecrire des plages de données dans Excel


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut Ecrire des plages de données dans Excel
    Bon-soir...

    Je souhaite ecrire des données ( rassemblées dans un tableau dynamique de string ), d'une part dans un TStringGrid, ce qui ne pose pas de problème, et d'autre part dans une feuille Excel.
    J'ai utilisé le pilotage OLE de Excel ( http://lfe.developpez.com/PasExcel/ ) en "remplissant" chaque cellule par 2 boucles for:
    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
     
    type
      TTab_data = array of array of string;
    ...
    var
        xla, xlws, xlw  : variant;
    ...
    begin
         vFileName := 'c:\temp\bil_mens.xlt' ;
         try
           xla := GetActiveOleObject('Excel.Application');
         except
           xla := CreateOleObject('Excel.Application');
         end;
         xla.Visible := False;
         xlws := xla.Workbooks;
         xlw := xlws.Open(vFileName);
         for colonne := 1 to c_max do
           for rangee := 1 to r_max do
             xla.Cells[rangee,colonne] := tab_data[colonne,rangee]
    Le problème vient de la lenteur de l'écriture ( plus de 2 mn pour 70 lignes de 14 colonnes !!! )

    J'ai pensé que je pourrais accélérer en écrivant directement le tableau dans une plage de cellules... mais n'ai pas trouvé la solution ( si elle existe ? )

    Je me suis rabattu ( pour la premiére fois ) sur le composant TExcelApplication pour mettre en oeuvre cette solution, mais je n'arrive pas à y remplir la moindre cellule ( et a fortiori une plage ! )

    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
     
    procedure TfTest.FormActivate(Sender: TObject);
    var
      monclasseur : _workbook;
      mafeuille : _worksheet;
      rMaPlage  : ExcelRange;
    begin
       ExcelApplication1.connect;
       MonClasseur:=ExcelApplication1.Workbooks.Open('C:\Temp\bil_mens.xlt',False,False,
          EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
          EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
       ExcelApplication1.Visible[0] := True;
       MaFeuille:=MonClasseur.Worksheets[1] as _worksheet;
       MaFeuille.Range['E1','E3'].Value:= 12;
    end;
    m'envoie une erreur de compilation:
    Erreur .... : '[' attendu(e) mais ':=' trouvé(e)
    pour la ligne : MaFeuille.Range['E1','E3'].Value:= 12;

    Par ailleurs 'ExcelApplication1.Workbooks.Open' m'a réclamé 2 paramétres de plus que dans l'exemple de bidou (http://delphi.developpez.com/faq/?page=exceldelphi)

    J'utilise Delphi 7, Excel 2003, le paquet dclofficexp70 pour TExcelApplication, le tout sous Windows XP Pro.

    Quelques suggestions ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 436
    Points : 5 851
    Points
    5 851
    Par défaut
    salut

    utilise plutot le copier coller dans ce cas


    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
        Buffer := 'TEST'+ #9;
        Buffer := Buffer + GEtChamps(1)+ #9;
        Buffer := Buffer + GEtChamps(2)+ #9;
        Buffer := Buffer + GEtChamps(3)+ #9;
        Buffer := Buffer + GEtChamps(4)+ #9;
        Buffer := Buffer + GEtChamps(5)+ #9;
        Buffer := Buffer + GEtChamps(6)+ #9;
        Buffer := Buffer + GEtChamps(7)+ #9;
        Buffer := Buffer + GEtChamps(8)+ #9;
        Buffer := Buffer + GEtChamps(9)+ #9;
        Buffer := Buffer + GEtChamps(10)+ #9;
        Buffer := Buffer + GEtChamps(11)+ #9;
        Buffer := Buffer + GEtChamps(12)+ #9;
        Buffer := Buffer + #13;
     
       if (Length(Buffer) > 0) then
        begin
          Clipboard.Clear;
          Clipboard.AsText := Buffer;
          Buffer := '';
          BaseCell.Offset[k,0].Select;
          ExcelApp.ActiveSheet.Paste;
          Inc(k);
        end;
    @+ Phil

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Salut

    +1
    Comme le dit Anapurna

    Avec Excel, il vaut mieux copier le max. de données dans le buffer du presse-papier et tout coller ensuite. Quitte à faire de la mise en forme, au maximum par lot, après.

    Sinon, la lenteur d'accès à chaque action vers Excel devient très lourd.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Salut

    je cherchais justement à optimiser mon code pour exporter vers excel mais delphi me refuse le .Paste
    Ta variable ExcelApp est bien de type TExcelApplication ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          BaseCell.Offset[k,0].Select;
          ExcelApp.ActiveSheet.Paste;
    merci pour l'aide

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 436
    Points : 5 851
    Points
    5 851
    Par défaut
    salut

    ExcelApp correspond a ton xla

    @+ Phil

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    j'ai avancé sur le sujet mai un truc me chagrine sur D2005
    le code suivant marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      vMSExcel := CreateOleObject('Excel.Application');
      // Traitement
      vMSExcel.Range['A1'].select;
      vMSExcel.activesheet.paste;
    mais si je pose le composant Delphi TExcelApplication
    le code .paste n'est pas accepté par le compilo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      ExcelApplication1.connect;
      MonClasseur:=ExcelApplication1.Workbooks.Open('...')
      ExcelApplication1.activesheet.paste;
    A croire que le composant n'intègre pas toutes les fonctionnalités ?

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 436
    Points : 5 851
    Points
    5 851
    Par défaut
    salut

    si tu regarde dans le code source de ton composant tu t'aperçois que le activesheet fait appelle a une interface
    (il ont redefini le activsheet) et pas a un objet ole

    @+ Phil

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 129
    Points : 95
    Points
    95
    Par défaut
    Toute facon je comprends pas bien l'utilite du TExcelApplication vu qu'il depend de la version d'excel installee sur le systeme. Le passage par ole a pas cet inconvenient...

    Personne a pense a developper un composant generique qui marche quelque soit la version ? Ca serait plus pratique !

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par b.grellee
    A croire que le composant n'intègre pas toutes les fonctionnalités ?
    Tout à fait, au vue de
    Citation Envoyé par Papino
    J'utilise Delphi 7, Excel 2003, le paquet dclofficexp70 pour TExcelApplication, le tout sous Windows XP Pro.
    essaie avec la TLB d'Excel 2003, le code sera en phase avec l'objet Automation utilisé.
    En revanche il te faudra recréer le paquet contenant les objets Office.

    Citation Envoyé par okparanoid
    Toute facon je comprends pas bien l'utilite du TExcelApplication
    Tu n'a pas besoin de coder la gestion des événements.
    Citation Envoyé par okparanoid
    Personne a pense à developper un composant génèrique qui marche quelque soit la version ?
    Yapluska

  10. #10
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 129
    Points : 95
    Points
    95
    Par défaut
    C'est bien pour ca que je disais que ce serait plus pratique en passant par un composant :p, mais tant que c'est pas generique bof bof...

    Ca prendrait beaucoup de temps a faire ? Reecrire les methodes en appelant selon les cas celles du composant correspondant a celui installé sur le systeme en adaptant pour avoir les parametres qui vont bien ?

    Les gars de la JCL ils seraient pas chaud pour le faire ?

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par okparanoid
    Ca prendrait beaucoup de temps a faire ? Reecrire les methodes en appelant selon les cas celles du composant correspondant a celui installé sur le systeme en adaptant pour avoir les parametres qui vont bien ?
    Cela dépend si tu souhaites avoir l'ensemble des méthodes ou pas, et si tu utilises les nouveaux paramètres ou pas.

    Une autre approche
    http://delphi.developpez.com/faq/?pa...gupositionnels
    Cela peut être un peu plus lent mais c'est comme tout compromis, faut faire des choix.

    Le plus lourd c'est d'avoir une plateforme de test avec 2-3 versions.
    Je ne suis pas certain que tu puisses toutes les installer sur un même poste.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/07/2013, 09h36
  2. Réponses: 2
    Dernier message: 06/02/2007, 15h05
  3. Importer des données dans Excel
    Par denis finch dans le forum Excel
    Réponses: 2
    Dernier message: 28/09/2006, 18h27
  4. PB d'utilisation des formulaires de données dans EXCEL
    Par adil155 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/11/2005, 16h09
  5. Récupérer des données dans excel
    Par alexia2 dans le forum MFC
    Réponses: 1
    Dernier message: 19/05/2005, 15h34

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