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 :

importer des données excel dans une application delphi


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut importer des données excel dans une application delphi
    Bonjour,

    J'ai un fichier Excel qui se compose de trois lignes et cinquante colonnes, j'ai créé un code avec Delphi 6 pour l'ouvrir et copier le contenu dans un memo, jusqu'au la tout va bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    XLApp := CreateOleObject('Excel.Application'); 
    XLApp.Visible := True; 
    WorkBook:=XLApp.Workbooks.Open('C:\Program Files\Borland\MABASE DE DONNE .xls'); 
    Sheets := XLApp.Workbooks[1].Worksheets['Feuil1']; 
    Sheets := XLApp.Sheets; 
    Sheets.Item['Feuil1'].Activate; 
    Sheets.Item['Feuil1'].UsedRange.copy; 
    Memo1.PasteFromClipboard;
    Ce que je veux faire par la suite c'est de faire un offset dans la lecture du fichier Excel à partir de la dixième colonne.
    c-à-d le code cité en haut doit lire à partir de la dixième colonne et copie les colonnes jusqu'à 50 colonnes du (10 au 50 COLONNE) dans le memo verticalement avec un offset avec cette commande cité ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Seek File(FileHandle, 0,0)

    Dans le cas ou c'est faisable est ce que avec un seul bouton click je peux remplir trois memo,

    Memo1 reçoit la ligne 1 avec un offset de lecture dans un fichier Excel à partir de la dixième colonne, et affiche les données de la collone 10 jusqu'à 50 dans memo1 verticalement (1)

    Memo2 reçoit la ligne 2 avec le même principe que (1).

    Memo3 reçoit la ligne 3 avec le même principe que (1).


    Comment faire mes frères, j'attends votre aide.


    2/ après deux jours j'ai trouvé ce qui suit :

    J'ai trouvé un code qui cache les colonnes sélectionés , veuillez touver ci-dessous le nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XLApp := CreateOleObject('Excel.Application'); 
    XLApp.Visible := True; 
    WorkBook:=XLApp.Workbooks.Open('C:\Program Files\Borland\doc .xls'); 
    Sheets := XLApp.Workbooks[1].Worksheets['Feuil1']; 
    Sheets := XLApp.Sheets; 
    Sheets.Item['Feuil1'].Activate; 
    Sheets.Item['Feuil1'].Range['A1','J1'].EntireColumn.Hidden:=True; 
    Sheets.Item['Feuil1'].UsedRange.copy; 
    Memo1.PasteFromClipboard;
    Et ça marche bien , seulment sur la première ligne qui a 50 colonne .

    Comment faire pour la deuxième et la troisième ligne ?

    Je veux que memo2 recoit la ligne2 et memo3 recoit la ligne3 avec un seul bouton clic , s'il y a d'autre suggéstion veuillez m'aider

    2/ Est ce que l'utilisation d'un stringgrid est souhaitable, si ces le cas merci de m'éclaircir le chemin à suivre

    NB: le fichier joint donne plus d'information .


    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Utilise donc TMS FlexCell est la TAdvStringGrid, c'est des composants certes payants mais qui encapsule les fichiers Excel avec merveille !
    Tu perdras moins de temps et tu pourras passer au fonctionnel plus rapidement

    FlexCell permet de lire un fichier Excel sans qu'il soit installé !

    Sinon Excel doit pouvoir être utilisé via ADO (Driver ODBC) et une TDBGrid, à vérifier !

    Quel est ton besoin réel ?
    Au début tu veux lire des données puis ensuite tu veux les cacher !
    Ta demande n'est pas très clair !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets := XLApp.Workbooks[1].Worksheets['Feuil1']; 
    Sheets := XLApp.Sheets;
    Très Etrange, tu affecte deux fois la variable ???

    Pour lire des cellules en boucle inspiré des Tutoriels
    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
     
    var
        vMSExcel : variant;
        vXLWorkbooks, vXLWorkbook : variant;
        aFileName : AnsiString;
        aSheetName : AnsiString;
        vWorksheet : variant;					
        aRange : AnsiString;
        vCell : variant;
        aValue : AnsiString;
     
        Memo: TMemo;
    begin
        vMSExcel := GetActiveOleObject('Excel.Application');
     
        aFileName := 'C:\Program Files\Borland\MABASE DE DONNE .xls';
        vXLWorkbooks := vMSExcel.Workbooks;
        vXLWorkbook := vXLWorkbooks.Open(vFileName);
     
        aSheetName := 'Feuil2';
        vWorksheet := vXLWorkbook.WorkSheets[aSheetName];
     
        // je te laisse trouver le ColCount et RowCount 
        for y := 1 to 3 do
        begin
          Memo := FindComponent(Memo+IntToStr(y)); 
     
          for x := 1 to 50 do
          begin 
            aRange := GetExcelCoord(x, y);
            vCell := vWorksheet.Range[aRange];
            aValue := vCell.Value;
            Memo.Lines.Add(aValue);
          end;
        end;
    end;
     
    function GetLetter(Value: Integer): string;
    const
       MAX_LETTER_TITLE = 26;
    var
       LetterOffSet, LetterValue: Integer;
    begin
       if Value <= MAX_LETTER_TITLE then
       begin
          Result := Chr(Ord('A') + Value - 1);
       end else
       begin
          SetLength(Result, 2);
     
          LetterOffSet := (Value - 1) div MAX_LETTER_TITLE;
          Result[1] := Chr(Ord('A') + LetterOffSet - 1);
     
          LetterValue := Value mod MAX_LETTER_TITLE;
          if not LongBool(LetterValue) then
             LetterValue := MAX_LETTER_TITLE;
          Result[2] := Chr(Ord('A') + LetterValue - 1);
       end;
    end;
     
    function GetExcelCoord(x, y: Integer): string;
    begin
      // X entre 1 et 255
      // Y entre 1 et 65535 
      Result := GetLetter(x) + IntToStr(y);
    end;
    J'ai trouvé GetLetter dans un vieux code à moi, j'espère qu'il fonctionne
    En TMS FlexCell la lecture en cellule est nettement plus pratique !
    Perso, j'ai énormément utilisé les Zones nommées pour avoir des fichiers Excel assez ouvert tant que les Zones Nommées ont la bonne taille, elles peuvent être placé n'importe où !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut importer des données excel dans une application delphi
    Bonjour,

    Merci pour votre réponse.

    Je vais essayer d'utiliser votre suggestion et tu seras informé le plutôt possible.

    J'ai trouvé un code qui affiche le contenu de mon fichier joint, en utilisant seulement un button clic et un stringgrid.

    Ci-dessous 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
    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
    function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
    const
      xlCellTypeLastCell = $0000000B;
    var
      XLApp, Sheet: OLEVariant;
      RangeMatrix: Variant;
      x, y, k, r: Integer;
    begin
      Result := False;
      // Create Excel-OLE Object
      XLApp := CreateOleObject('Excel.Application');
      try
        // Hide Excel
        XLApp.Visible := False;
     
        // Open the Workbook
        XLApp.Workbooks.Open(AXLSFile);
     
        // Sheet := XLApp.Workbooks[1].WorkSheets[1];
        Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
     
        // In order to know the dimension of the WorkSheet, i.e the number of rows
        // and the number of columns, we activate the last non-empty cell of it
     
        Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
        // Get the value of the last row
        x := XLApp.ActiveCell.Row;
        // Get the value of the last column
        y := XLApp.ActiveCell.Column;
     
        // Set Stringgrid's row &col dimensions.
     
        AGrid.RowCount := x;
        AGrid.ColCount := y;
     
        // Assign the Variant associated with the WorkSheet to the Delphi Variant
     
        RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
        //  Define the loop for filling in the TStringGrid
        k := 1;
        repeat
          for r := 1 to y do
            AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
          Inc(k, 1);
          AGrid.RowCount := k + 1;
        until k > x;
        // Unassign the Delphi Variant Matrix
        RangeMatrix := Unassigned;
     
      finally
        // Quit Excel
        if not VarIsEmpty(XLApp) then
        begin
          // XLApp.DisplayAlerts := False;
          XLApp.Quit;
          XLAPP := Unassigned;
          Sheet := Unassigned;
          Result := True;
        end;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if Xls_To_StringGrid(StringGrid1, 'C:\Program Files\Borland\MABASE DE DONNE.xls') then
        ShowMessage('importation réussie!');
    end;
    end.
    Le code copie bien le contenu de ma base de donné dans stringgrid.

    Le problème maintenant c’est je veux utiliser le contenu du stringgrid dans une application (utilisation avec script).

    Si je vais utiliser un memo voir l’exemple ci-dessous :

    memo1.lines.Add (‘ALVI’ +':'+'PO'+'=' + 'NRVP' + (contenu de chaque colonne de la ligne 1 qui va de la première colonne à la dernière colonne de ma base de donnés) + ';’);


    memo1.lines.Add (‘ALVI’ +':'+'PO'+'=' + 'NRVP' + (contenu de chaque colonne de la ligne 2 qui va de la première colonne à la dernière colonne de ma base de donnés) + ';’);


    memo1.lines.Add (‘ALVI’ +':'+'PO'+'=' + 'NRVP' + (contenu de chaque colonne de la ligne 3 qui va de la première colonne à la dernière colonne de ma base de donnés) + ';’);

    S’il c’est juste le code va copier les données de contenu de chaque colonne de la ligne 1 qui va de la première colonne à la dernière colonne de ma base de donnés
    Et la même chose pour la ligne deux et trois, ce qui implique l’affichage dans le memo sera comme suit :


    50 lignes dans memo1 qui affiche le contenu de la ligne 1 (de la colonne1 à colonne 50)
    Et la même chose pour la ligne deux et trois.


    Est-ce que c’est faisable, et s’il y a une autre astuce merci pour d’avance pour votre aide .

    NB: Est ce que chaque colonne dans stringrid est consideré comme ( edit1.text)


    Salutation

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut

    Je ne comprends pas bien ton histoire de Memo, tu veux juste afficher l'ensemble des données d'une ligne, reprend le code pour le TStringGrid et transforme le pour qu'il renvoie une liste de chaine (TStringList) chaque ligne contenant une concaténation Cell1;Cell2;...

    le code Xls_To_StringGrid te montre en plus comment récupérer l'ensemble de la feuille dans un tableau Variant (la variable locale RangeMatrix), tu n'as qu'à modifier la boucle pour copier des cellules dans une chaine, quel est le problème technique ? Quelle est la difficulté ? Tu veux que l'on fasse ton travail à ta place ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut importer des données excel dans une application delphi
    Bonjour,

    Merci pour votre réponse rapide.

    Juste pour clarifier les choses, je suis débutant dans la programmation, et pour cette raison j'ai sollicité votre aide.

    Est que la dernière suggestion tu peux la mettre dans un code dephi ?

    NB : je connais que le composant memo ou je peux afficher l’exécution d’un script long de 30 lignes ou plus

    Salutation

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Comme dirait les Sages: "c’est en forgeant que l’on devient forgeron"
    Ou comme dirait Conficius : "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson"

    tu as déjà plein de code à ta disposition, propose nous un code
    pour remplir tes memos
    Memo1, Memo2, Memo3, c'est bien trois zones de texte multigne différent, ce n'est pas un raccourci pour dire Memo.Lines[1], Memo.Lines[2] et Memo.Lines[3] ?

    indice, tu n'as qu'une ligne de code pour afficher dans Memo1, je te laisse trouver le bon endroit !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Memo1.Lines.Text := Memo1.Lines.Text + ';' + RangeMatrix[K, R];
    C'est quoi ton histoire de Script ???
    Tu as des formules que tu veux interpreter et utiliser comme paramètre pour savoir quoi lire dans ton fichier Excel ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [AC-2010] Importer des données excel dans une table access
    Par docjo dans le forum VBA Access
    Réponses: 0
    Dernier message: 06/06/2014, 20h33
  2. Importer des données Excel dans une table Access
    Par Flaguette dans le forum Modélisation
    Réponses: 3
    Dernier message: 25/09/2008, 21h50
  3. importer des données Excel dans une BD Access
    Par lemerite dans le forum VBA Access
    Réponses: 3
    Dernier message: 19/02/2008, 13h34
  4. Insérer des données Excel dans une table ACCESS
    Par anikeh dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 22h42
  5. Insérer des données Excel dans une base Access ?
    Par MaTHieU_ dans le forum Access
    Réponses: 3
    Dernier message: 22/06/2005, 15h11

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