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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    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 493
    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 493
    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 éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    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.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 17
    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 493
    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 493
    Par défaut
    salut

    ExcelApp correspond a ton xla

    @+ Phil

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 17
    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 ?

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