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

Bases de données Delphi Discussion :

[CData Excel] Créer un fichier/une feuille Excel : Ouroboros


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut [CData Excel] Créer un fichier/une feuille Excel : Ouroboros
    Bonjour,

    Comme j'ai eu accès aux CData avec ma version Entreprise, je me suis penché sur la connexion Firedac/Excel. Mes premiers essais, sur un tableau existant sont concluants aussi me suis-je lancé sur une question : est-il possible de créer un tableau Excel directement ?
    Selon la doc, créer une nouvelle feuille permet de créer le tableau grâce à la procédure CData.Excel.CreateWorksheet du moins est-ce le cas avec ODBC, toujours dans la doc cette fois il est possible d'utiliser FDStoredProc pour créer les feuilles
    Là où cela devient dingue c'est que pour exécuter une procédure stockée il faut se connecter à un tableau donc, je tourne en rond pour créer une nouvelle feuille dans un nouveau tableau je dois d'abord me connecter à un tableau existant c'est quand même dommage !

    en gros voilà mon 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
    26
     
    procedure TMainForm.Button1Click(Sender: TObject);
    begin
    if Opendialog1.Execute then
     begin
      Edit1.Text:=Opendialog1.FileName;
      with FDConnection1.Params as TFDPhysCDataExcelConnectionDefParams do begin
        if not FileExists(OpenDialog1.FileName)
          then ExcelFile:='D:\Common Files\test.xlsx'
          else ExcelFile:=OpenDialog1.FileName;
      end;
      try
      FDStoredProc1.ParamByName('file').asString:=OpenDialog1.FileName;
      FDStoredProc1.ParamByName('sheet').asString:='un essai';
      FDStoredProc1.ParamByName('columnnames').asString:='col1,col2,col3';
      FDStoredProc1.ExecProc;
      except
       // gestion d'erreurs (i.e. feuille déjà existante)
      end 
      FDConnection1.Connected:=False;
      with FDConnection1.Params as TFDPhysCDataExcelConnectionDefParams do
          ExcelFile:=OpenDialog1.FileName;
     end;
     FDConnection1.Connected:=True;
     // suite des opérations
    end;
    une idée pour éviter d'avoir un premier tableau "bidon mais nécessaire" ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    une idée pour éviter d'avoir un premier tableau "bidon mais nécessaire" ?
    Peut être un fichier de ressources

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Peut être un fichier de ressources
    Intéressant mais je ne crois pas que firedac (TFDConnection) puisse se connecter à un fichier dans une ressource ou un stream, je vais quand même explorer la piste.
    En y réfléchissant, effectivement, cela permettrait d'avoir un tableau vide qu'il faudrait ensuite sauvegarder dans le répertoire temporaire afin de pouvoir se connecter dessus, créer la feuille, puis supprimer le fichier temporaire. C'est jouable
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    En conclusion, après un essai plus poussé, voilà comment j'ai pu créer un tableau (à partir d'un tableau vide en ressource) et une feuille .

    En fait une sauvegarde directe de la ressource dans le nouveau fichier serait plus efficace que ce 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
    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
     
    procedure TMainForm.Button1Click(Sender: TObject);
    var xlsxModele : String;
        aStream : TResourceStream;
      I: Integer;
    begin
    if Opendialog1.Execute then
     begin
      Edit1.Text:=Opendialog1.FileName;
      with FDConnection1.Params as TFDPhysCDataExcelConnectionDefParams do begin
        if not FileExists(OpenDialog1.FileName)
          then begin
             xlsxModele:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetTempPath,'test.xlsx');
             aStream:=TResourceStream.Create(HInstance,'xlsx',RT_RCDATA);
             aStream.SaveToFile(xlsxModele);
             aStream.Free;
             ExcelFile:=xlsxModele;
          end
          else ExcelFile:=OpenDialog1.FileName;
      end;
      try
      FDStoredProc1.ParamByName('file').asString:=OpenDialog1.FileName;
      FDStoredProc1.ParamByName('sheet').asString:='un essai';
      FDStoredProc1.ParamByName('columnnames').asString:='col1,col2,col3';
      FDStoredProc1.ExecProc;
      except
         on E: EFDDBEngineException do
          ShowMessage(E.Message);
      end;
    // NOTE 3 feuilles sont créées  la première avec le nom indiqué, les autres sont nommées Sheet2,Sheet3
     
      FDConnection1.Connected:=False;
      with FDConnection1.Params as TFDPhysCDataExcelConnectionDefParams do
          ExcelFile:=OpenDialog1.FileName;
     end;
     // ajout de données
     FDQuery1.SQL.Text:='INSERT INTO "un essai" (col1,col2,col3) VALUES (:a,:b,:c)';
     for I := 2 to 10 do
       begin
        FDQuery1.ParamByName('a').DataType:=ftInteger;
        Fdquery1.ParamByName('a').asInteger:=i;
        Fdquery1.ParamByName('B').asString:=i.ToString;
        Fdquery1.ParamByName('c').asString:='Test '+i.ToString;
        FDQuery1.ExecSQL;
       end;
     FDConnection1.Connected:=False;   // pour rafraichir
     FDQuery1.SQL.Text:='SELECT * FROM "un essai"';
     FDQuery1.Active:=True;
     
    end;
    Quelques bémols, malgré le typage des paramètres les cellules créées restent considérées FDQuery1.ParamByName('a').DataType:=ftInteger; FDQuery1.ParamByName('a').asInteger:=i; comme texte dans la feuille crée (valeurs commençant par ')

    La documentation est faible sur le sujet, donc en conclusion créer une feuille/tableau de cette façon n'est pas vraiment très efficace.
    Perso je ne recommanderai l'utilisation de CDATA.EXCEL que pour des tableaux/feuilles déjà existants
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Créer des fichiers excel à partir d'une feuille et d'une liste
    Par chmouf dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2014, 20h57
  2. [XL-2003] créer et renomer une feuille
    Par fllyann dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/01/2011, 13h43
  3. Réponses: 2
    Dernier message: 15/01/2009, 03h27
  4. Créer une feuille récap de plusieurs fichiers excel
    Par babacool dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/07/2006, 19h56
  5. [VBA-E]Créer un fichier txt depuis une feuille Excel
    Par marie10 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/02/2006, 17h36

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