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

API, COM et SDKs Delphi Discussion :

Pilotage OLE d'Excel


Sujet :

API, COM et SDKs Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 36
    Points
    36
    Par défaut Pilotage OLE d'Excel
    j'ai récupété un code qui pilote Excel via OLE.
    Après sélection du fichier excel et création d'une instance Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    OpenDialog1.InitialDir := path;
      OpenDialog1.Filter := '*.xls|*.xls';
      IF OpenDialog1.Execute THEN
      BEGIN
        TRY
          vMSExcel := GetActiveOleObject('Excel.Application');
        EXCEPT
          vMSExcel := CreateOleObject('Excel.Application');
        END;
        vMSExcel.Visible := false;          //EMO true
        vXLWorkbooks := vMSExcel.Workbooks;
        NomFichierLong := OpenDialog1.Filename;
        vXLWorkbook := vXLWorkbooks.Open(OpenDialog1.Filename);
    le fichier est lu celulle par celulle à partir d'une certaine ligne (premiereLigne =12) par la routine ci-joint :
    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
       IndexL := PremiereLigne;
        CelluleTemps := vMSExcel.Cells[IndexL, ColonneTemps];
        TempsZero := StrToFloat(CelluleTemps);
        nbColonnesTotal := 0;
        WHILE CelluleTemps <> '' DO
        BEGIN
          Temps := (StrToFloat(CelluleTemps) - TempsZero) / 60;
          FOR IndexC := ColonneTemps + 1 TO NombreDeColonnes DO
          BEGIN
            Cellule := vMSExcel.Cells[IndexL, IndexC];
            IF Cellule <> '' THEN
            BEGIN
              Valeur := StrToFloat(Cellule);
              LesSeriesSelect1[IndexC].AddXY(Temps, Valeur)
              XRange := Temps;
            END;
          END;
          StatusBar1.SimpleText := 'Excel file is been read -  '+ IntToStr(IndexL)+ ' traitée';;
          inc(nbColonnesTotal);  
          Application.ProcessMessages;
          inc(IndexL);
          CelluleTemps := vMSExcel.Cells[IndexL, ColonneTemps];
        END;
    Le problème est que point de vue performance, c'est catastrophique. Il y a au total 94 colonnes et 534 valeurs ce qui représente 50196 cellules à lire.
    (en pièce jointe, un exemple de fichier excel)

    Je pense que la meilleure méthode est de récupérer le nombre de colonnes de données et le nombre de valeurs par données.(ce code est fait).

    Ensuite, j'aimerai lire toutes les celulles d'un seul coup mais je ne sais pas comment faire? à moins que quelqu'un est une meilleure idée

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 36
    Points
    36
    Par défaut
    J'ai légèrement avancé.

    Ci-joint le code :

    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
    ExcelApplication1.Connect;
    ExcelApplication1.ReferenceStyle[xlR1C1];
    MonClasseur := ExcelApplication1.Workbooks.Open('l:\classeur1.xls', False, False,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0);
     
    ExcelApplication1.Visible[0] := true;
    MaFeuille := MonClasseur.Worksheets[1] AS _worksheet;
     
    cellDebut := 'L'+ IntToStr(PremiereLigne) + 'C' + IntToStr(ColonneTemps);
    colFin := nbDataReal +ColonneTemps;
    ligneFin := PremiereLigne +nbColonnesTotal;
    cellFin := 'L'+ IntToStr(ligneFin-1) + 'C' + IntToStr(colFin);
     
    cellDebut := 'D12';
    cellFin := 'CT545';
     
    Resultat := MaFeuille.Range[cellDebut, cellFin].Value;
    FOR comptLig := 1 TO VarArrayHighBound(Resultat, 1) DO
      FOR comptCol := 1 TO VarArrayHighBound(Resultat, 2) DO
      begin
        mesValeurs[comptlig,comptcol] := Resultat[comptlig, comptcol];
        Resultat[comptlig, comptcol] := Resultat[comptlig, comptcol] * 3 + 2;  end;
    MaFeuille.Range[cellDebut, cellFin].Value := Resultat;
     ExcelApplication1.disConnect;
    J'arrive à lire toutes les cellules si je passe CellDebut = D12 et CellFin = CT545
    Si je passe en mode L12C4 à L545C98, Resultat est vide.

    Comment indiquer que je veux utiliser le nommage LiCi au lieu de Ai?

    merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Effectivement, chaque accès est relativement long et relativement incompressible quelque soit le type de tâche (récupération ou écriture d'une cellule).

    Le plus rapide (selon mon experience) pour récupérer un groupe ou la totalité des valeurs de cellules est de passer par le presse-papier.

    1. dans excel (via ole) tu sélectionnes la zone à récupérer
    2. dans excel (toujorus via ole), tu copies dans le presse-papier
    3. dans delphi tu récupères les données du presse papier (unité clipbrd)
    -> les données sont sous forme tabulaires.

    Avec cette méthode, récupérer une grille prend à peine plus de temps que de récupérer une cellule...
    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 ;-)

Discussions similaires

  1. PB Pilotage OLE d'Excel sous BDS2006
    Par GameOver dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/09/2006, 10h49
  2. Pilotage OLE d'Excel à partir de Delphi
    Par patrickbruneau dans le forum Delphi
    Réponses: 1
    Dernier message: 29/08/2006, 14h51
  3. Pilotage OLE d'excel : Excel ne reste pas ouvert
    Par ero-sennin dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/07/2006, 16h49
  4. Pilotage ole d'excel sous bcb6 -> AutoFilter
    Par GameOver dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/04/2005, 11h56
  5. Pb avec le pilotage OLE d'Excel
    Par psau dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/01/2005, 17h19

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