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 :

Ouvrir un fichier Excel existant


Sujet :

Delphi

  1. #1
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut Ouvrir un fichier Excel existant
    Bonjour a tous,
    pour ouvrir un fichier Excel existant , j'utilise ce bout de programme :

    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
    var Tab: _workbook;
        Feuil: _worksheet;
        i,j:Integer;
        S:shortstring;
          StrSaveFile: string;
          IntFileType: integer;
          SaveDialog: TSaveDialog;
     
    begin
       try
                SaveDialog := TSaveDialog.Create(nil);
                SaveDialog.Filter := 'Excel files |*.XLSX';
                SaveDialog.Execute;
                IntFileType := SaveDialog.FilterIndex;
                StrSaveFile := SaveDialog.FileName;
                if Length(StrSaveFile) = 0 then
                  Exit
                else
                  StrSaveFile := Trim(SaveDialog.FileName);
     
        ExcelApplication1.Connect;
        ExcelApplication1.Visible[0]:=False;
     
                Tab:=ExcelApplication1.Workbooks.Open(StrSaveFile,False,False,
                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
     
     
              feuil:=Tab.Worksheets[1] as _worksheet;

    chez moi , j'ai office 2013 installé , donc pas de problème.
    mais , chez un de mais client qui a office 2007 installé , je ne peut pas ouvrir le fichier excel.

    y a t il une modification a reporter sur mon code ?
    est comment trouvé les bon paramaitre pour l'ouverture excel , avec cette instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tab:=ExcelApplication1.Workbooks.Open(StrSaveFile,False,False,
                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);

    Merci a tous.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut
    en utilisant directement OLE plutôt que le composant Delphi qui est lié à une version Excel.
    L'avantage d'OLE est qu'il s'adapte automatiquement à la version Excel installée sur le poste si je ne me trompe pas.

  3. #3
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    en utilisant directement OLE plutôt que le composant Delphi qui est lié à une version Excel.
    L'avantage d'OLE est qu'il s'adapte automatiquement à la version Excel installée sur le poste si je ne me trompe pas.
    Merci pour le réponse.
    y a t il un exemple pour l'ouverture d'un fichier excel , et écrire des données?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527

  5. #5
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    Voila un exemple pour ouvrir un fichier Excel

    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
     uses comobj;
     
    procedure TForm2.Button1Click(Sender: TObject);
    var
     ExelFile,Dir:string;
     xlApp,xlSheet,xlFile:Variant;
    begin
      Dir:=ExtractFilePath(ParamStr(0));
      if not PromptForFilename(ExelFile,'Excel|*.xlsx','','', Dir) then
        Exit;
      xlApp:= CreateOleObject('Excel.Application');
      try
        xlApp.Visible := False;
        xlApp.DisplayAlerts := False;
        xlFile := xlApp.Workbooks.Open(ExelFile);
        xlSheet:=xlFile.Sheets['Feuil1'];
        ...
     
     
      finally
         xlApp.Quit;
      end;
     
    end;

  6. #6
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Citation Envoyé par wheel Voir le message
    Voila un exemple pour ouvrir un fichier Excel

    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
     uses comobj;
     
    procedure TForm2.Button1Click(Sender: TObject);
    var
     ExelFile,Dir:string;
     xlApp,xlSheet,xlFile:Variant;
    begin
      Dir:=ExtractFilePath(ParamStr(0));
      if not PromptForFilename(ExelFile,'Excel|*.xlsx','','', Dir) then
        Exit;
      xlApp:= CreateOleObject('Excel.Application');
      try
        xlApp.Visible := False;
        xlApp.DisplayAlerts := False;
        xlFile := xlApp.Workbooks.Open(ExelFile);
        xlSheet:=xlFile.Sheets['Feuil1'];
        ...
     
     
      finally
         xlApp.Quit;
      end;
     
    end;

    merci pour le réponse ,
    mais comment faire pour remplir les cellules de la feuille ?

  7. #7
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    Si comme en VBA, ce sont les mêmes fonctions et opérations il faut veiller que les instructions soient écrites correctement en Delphi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        xlSheet.Cells[1, 1] := 'Cellule';
        xlSheet.Range['A2'] := 'Range A2';

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 113
    Par défaut
    Bonjour
    pour un usage pro, j'utilise ce composant payant:

    http://www.kluug.net/xlsx-ods-delphi.php

    Très fiable, aucun retour clientèle depuis des années, Excel installé ou pas, et SAV efficace.

    Je manipule comme je veux le fichier Excel, en mémoire, puis le sauve...

    Cordialement
    Pascal

  9. #9
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Merci a vous tous,
    j'ai trouvé cette procédure dans ce post

    exportation des données

    c'est excellente fonction,
    seulement je cherche a modifier la fonction , pour ouvrir un fichier excel , ne pas remplir l’entête des colonne , et le début des ligne est paramétrable , c'est a dire a partir d'une ligne (exemple 8 mais pas 1).

  10. #10
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    et pour 10890 ligne , l'exportation est très très lourde ....

  11. #11
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    J'ai fait quelques tests et modifications dans le code ça prend environs 16 secondes pour exporter 10000 enregistrements avec 17 champs vers le fichier Excel et 20 secondes pour le tout incluant l'enregistrement ce qui raisonnable.


    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     function ExportToExcelFile(Query: TDataSet; const AFilename:string) : Boolean;
    var
        Index       :   Integer;
        XLApp, Sheet, Data, xlFile: OLEVariant;
        _Col         :   Integer;
        _Row         :   Integer;
        RecNo       :   Integer;
        function RangeRef(ACol, ARow, ACols, ARows:integer):string;
        begin
           ACol := Ord('A') + ACol - 1;
           Result := Format('%s%d:%s%d',[
                     Chr(ACol),
                     ARow,
                     Chr(ACol + ACols - 1),
                     ARow + ARows - 1]);
        end;
    var
        Records:integer;
        VisCols: integer;
    begin
        Screen.Cursor:=crHourGlass;
        Result:=False;
        // On envoi l'entête dans la feuille
        try
            XLApp := CreateOleObject('Excel.Application');
            XLApp.Visible := True;
            xlFile := xlApp.Workbooks.Open(AFilename);
            Sheet:= xlFile.Sheets['Feuil1'];
     
        except on E:Exception do
            begin
                Data:=Unassigned;
                MessageDlg('Impossible de trouver une instance de Microsoft Excel !',mtError,[mbOk],0);
                Screen.Cursor:=crDefault;
                Exit
            end;
        end;
        Query.DisableControls;
      //  Query.FetchAll;
        Query.First;
        Records  := Query.RecordCount;
        VisCols := 0;
        for Index:= 0 to Pred(Query.FieldCount) do
        begin
            if Query.Fields.Fields[Index].Visible then
               Inc(VisCols);
        end;
     
        Data := VarArrayCreate([1, Records, 1, VisCols], varVariant);
        for _Row := 1 to Records do
        begin
            _Col:=1;
            for Index:=0 to Pred(Query.FieldCount) do
            with Query.Fields.Fields[Index] do
            if Visible then
            begin
     
                if (DataType = ftDate) or (DataType = ftDateTime) then
                begin
                    if IsNull or (AsDateTime = 0) then
                       Data[_Row,_Col] := ''
                    else
                       Data[_Row,_Col] := AsDateTime;
                end else
                       Data[_Row,_Col] := DisplayText;
                Inc(_Col);
            end;
            Query.Next;
        end;
     
        try
            Sheet.Range[RangeRef(1, 8, VisCols, Records)].Value := Data;
            xlFile.Save
        finally
            Data:=Unassigned;
        end;
     
        Screen.Cursor:=crDefault;
        if not VarIsEmpty(XLApp) then
        begin
            XLAPP := Unassigned;
            Sheet := Unassigned;
            xlFile := Unassigned;
        end;
     
        Query.EnableControls;
        Result:=True;
    end;

  12. #12
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Bravo, wheel ,Merci beaucoup .
    c'est vraiment super rapide .
    seulement j'ai un petit problème dans le formatage des champs.
    si le code Client = '0000152536' (par exemple) le transfert élimine les zéro et ça devient : 152536 .
    peutons réglé ce problème?

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 920
    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 920
    Par défaut
    Deux solutions.
    Soit modifier le type de la cellule pour lui dire que c'est du texte.
    Soit rajouter une quotte au début de la chaine : '0000152536

  14. #14
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    c'est bon,
    j'ai trouvé la solution :
    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
     
                //----------------
                    if DataType  in [ftCurrency,ftBCD] then
                    begin
                       Data[_Row,_Col]   := AsCurrency;
                    end
                    else
                        if DataType  in [ftDate,ftDateTime]then
                        begin
                              if IsNull or (AsDateTime = 0) then
                                 Data[_Row,_Col] := ''
                              else
                                 Data[_Row,_Col] := AsDateTime;
                        end
                        else
                          begin
                             Data[_Row,_Col] := '''' + DisplayText;
                          end ;
     
                //-----------------
    Merci a vous tous.

  15. #15
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Mais toujours , ça marche plus avec office 2007.

  16. #16
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    En effet, j'ai fait mes tests sur office 2010 et ça marche sans problèmes
    Essaie de vérifier l'actuel syntaxe à l'ancien proposé dans le lien.
    remplacer Sheets par Worksheets

    Pour vérifier si l'Excel est installé correctement dans le registre faites ce test pour ouvrir le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      var
     XLApp : OLEVariant;
    begin
       XLApp := CreateOleObject('Excel.Application');
       XLApp.Visible := True;
       XLApp.Workbooks.Open('C:\Users\pc2020\Desktop\Classeur1.xlsx')
    end;
    Si l’opération se déroule comme prévu il faut vérifier alors si le classeur contient la feuille :' Feuil1'

  17. #17
    Membre éclairé

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Par défaut
    Merci beaucoup wheel,
    effectivement la solution et simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            //Sheet := xlFile.Sheets[1]; // si office > 2007
            Sheet := xlFile.Worksheets[1]; // si office 2007

  18. #18
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    Utiliser un entier avec Worksheets ou Sheets veut dire qu'on cherche la feuille par indice et pas par nom, cela explique que la Feuil1 n'existe pas mais la recherche par nom est contraignante pour une solution générale.

    Pour maintenir l'affichage des zéros coté gauche il est possible de définir le format d'affichage de la colonne en question avant la copie des données dans l'Excel, seulement préciser l'indice de la colonne,
    c'est mieux qu'envoyer le texte entre les quotes et qui seront visibles coté Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Sheet.Range[RangeRef(indice de la colonne, 8, 1, Records)].NumberFormat := '0000000000'; // ou '@' pour format texte
          /// juste avant cette ligne 
            Sheet.Range[RangeRef(1, 8, VisCols, Records)].Value := Data;

  19. #19
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Par défaut
    Bonjour,

    J'ai récemment débuté l'écriture d'une lib pour Microsoft Office en débutant par Excel.
    Elle a été écrite en partie avec ChatGPT pour aller plus vite et modifier selon mes besoins.
    Je la partage si vous voulez vous en inspirez

    Lib_office.zip

  20. #20
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 180
    Par défaut
    Citation Envoyé par lave_01 Voir le message
    Bonjour,

    J'ai récemment débuté l'écriture d'une lib pour Microsoft Office en débutant par Excel.
    Elle a été écrite en partie avec ChatGPT pour aller plus vite et modifier selon mes besoins.
    Je la partage si vous voulez vous en inspirez

    Lib_office.zip
    C'est sympa mais y'a rien du tout dans ta lib à part un squelette de base que n'importe qui aurait pu pondre en 3 minutes

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [OLE] Ouvrir un fichier excel existant avec borland C++Builder
    Par dkjauspin dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/03/2013, 00h22
  2. [LV 8.6.1] ouvrir un fichier excel existant
    Par Quent' dans le forum LabVIEW
    Réponses: 3
    Dernier message: 23/02/2010, 14h48
  3. Ouvrir un fichier excel existant
    Par Renardo dans le forum Access
    Réponses: 1
    Dernier message: 09/02/2007, 20h07
  4. Ouvrir un fichier excel déja existant
    Par lynal dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2006, 00h03
  5. Ouvrir un fichier Excel existant
    Par Yanmeunier dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/11/2005, 11h17

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