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

C++Builder Discussion :

Comment lire un ensemble de cellule sous Excel


Sujet :

C++Builder

  1. #1
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut Comment lire un ensemble de cellule sous Excel
    Bonjour,
    Je voudrais savoir s'il est possible de lire un ensemble de cellule d'un fichier Excel.

    Pour le moment mon application lit les cellules une par une, et le temps d'exécution est un peu trop long à mon gout.

    J'ai essayé la fonction OLE permettant la lecture d'une cellule dans un Variant, avec un ensemble, mais la lecture me donne {????} et je ne vois pas comment récupérer les informations dans un AnsiString.

    Si quelqun à déjà rencontré le problème, ou à une idée...
    Merci

  2. #2
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    tien si sa peut t'aider :

    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
     
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      Variant vCells, vRange;
      Variant vValues;
      Variant vLines, vCols, vUsedRange;
      Variant vCell1, vCell2;
      AnsiString asTmp, asFile;
      AnsiString asRep = ExtractFilePath(Application->ExeName);
     
            iQuit = 0;
            slListNomLowerCase = new TStringList();
            slListNom = new TStringList();
            slListInterloc =  new TStringList();
            slListAdr = new TStringList();
            slLisVille = new TStringList();
            slLisTel = new TStringList();
            slLisPortable = new TStringList();
            slLisFax = new TStringList();
            slLisEmail = new TStringList();
     
            ListRecherche = new TStringList();
     
            try
            {
                    asFile =asRep + "listeclient.xls";
     
                    vMSExcel = Variant::CreateObject("Excel.Application");
                    vMSExcel.OlePropertySet("Visible", false);
                    vFileName = StringToOleStr(asFile);
                    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName);
     
                    vSheetName = "Feuil1";
                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",vSheetName);
     
                    vUsedRange = vWorksheet.OlePropertyGet("UsedRange");
                    vLines = vUsedRange.OlePropertyGet("Rows");
                    iLigne = vLines.OlePropertyGet("Count");
     
                    vCols = vUsedRange.OlePropertyGet("Columns");
                    iColonne = vCols.OlePropertyGet("Count");
     
                    vCell1 = vWorksheet.OlePropertyGet("Cells", 1, 1);
                    vCell2 = vWorksheet.OlePropertyGet("Cells", iLigne, iColonne);
     
                    vRange = vWorksheet.OlePropertyGet("Range", vCell1, vCell2);
     
                    vValues = vRange.OlePropertyGet("Value");
                    for(int i=2 ; i<=vValues.ArrayHighBound(1) ; i++)
                    {
                            asTmp = vValues.GetElement(i,1);
                            asTmp = asTmp.LowerCase();
                            slListNomLowerCase->Add(asTmp);
                            slListNom->Add(vValues.GetElement(i,1));
                            slListInterloc->Add(vValues.GetElement(i,2));
                            slListAdr->Add(vValues.GetElement(i,3));
                            slLisVille->Add(vValues.GetElement(i,4));
                            slLisTel->Add(vValues.GetElement(i,5));
                            slLisPortable->Add(vValues.GetElement(i,6));
                            slLisFax->Add(vValues.GetElement(i,7));
                            slLisEmail->Add(vValues.GetElement(i,8));
                    }
            }
            catch(...)
            {
                    ShowMessage("Un problème est survenue vérifier le fichier excel svp");
                    vMSExcel.OleFunction("Quit");
                    vMSExcel = Unassigned;
                    iQuit = 1;
            }
    }
    récupere un fichier excel et le stock dans des stringlist, javais fais sa pour faire des recherches dans un fichier excel et le modifier par une petite interface c++ builder

    Cordialement Baxter

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut bandit boy
    Que veut tu faire exactement, c'est lire une groupe de cellules par exemple A110 et le recopier ailleurs dans la feuille

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Alors je t'ai ecrit deux codes qui font la meme chose soit en utilisant les coordonnees ("A110") soit L1C1
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <utilcls.h>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "ColorBtn"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    // les Variants doiven etre declares dans le .h
    // ils ne sont place la que par comodite pour le test
    Variant vMSExcel;
    Variant vXLWorkbook, vXLWorkbooks;
    Variant vFileName;
    Variant vSaveChanges;
    Variant vValue, vRange, vCell;
    Variant vWorksheet;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Add");
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
    // on selectionne la Feuil1
    vWorksheet.OleProcedure("Select");
     
    // premier code
     
    Variant vCell1, vCell2, vCell3;
    vCell1 = "A1";
    vCell2 = "D10";
    vWorksheet.OlePropertyGet("Range", vCell1, vCell2).OleFunction("Select");
    vMSExcel.OlePropertyGet("Selection").OleFunction("Copy");
    vWorksheet.OlePropertyGet("Range", "H13").OleFunction("Select");
    vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Paste");
    vMSExcel.OlePropertySet("CutCopyMode", false);
    vWorksheet.OlePropertyGet("Range", "A1").OleFunction("Select");
     
    // ou si on a besoin des coordonnees X,Y au lieu de A1:D10
    // deuxieme code
     
    vWorksheet.OlePropertyGet("Range", vWorksheet.OlePropertyGet("Cells", 1, 1), vWorksheet.OlePropertyGet("Cells", 10, 4)).OleFunction("Select");
    vMSExcel.OlePropertyGet("Selection").OleFunction("Copy");
    vWorksheet.OlePropertyGet("Cells", 13, 8).OleFunction("Select");
    vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Paste");
    vMSExcel.OlePropertySet("CutCopyMode", false);
    vWorksheet.OlePropertyGet("Cells", 1, 1).OleFunction("Select");
    }
    Ces deux codes copient la plage A110 a partir de la coordonnee H13, si c'est ce que tu a besoin

  5. #5
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Tout d'abord merci.

    En fait, ce que je veux faire, c'est convertir les textes des cellules en AnsiString:
    +------+------+----------+-------+
    | txt1 | txt2 | .... | txt n |
    +------+------+----------+-------+
    en
    txt1 txt2 ... txt n

    Tout est sur une ligne, et aujourd'hui je lis toutes les cases intéressantes, et l'accès à Excel est un peut long. C'est pourquoi, je voulais savoir s'il existe un moyen de lire les cellules en une seule commande, et stocker le tout dans un AnsiString.
    Le travaille de l'AnsiString étant plus rapide que l'accès à Excel, cela me permettrait de gagner du temps d'exécution.

    Je ne sais pas si j'ai été clair ?

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    C'est peut être possible en utilisant des choses dans ton code Baxter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vUsedRange = vWorksheet.OlePropertyGet("UsedRange");
    vLines = vUsedRange.OlePropertyGet("Rows");
    Il y a peut être moyen de lire la ligne complète?
    En utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vValue = vLines.OlePropertyGet("Value");
    à essayer...

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Est ce qu'il ne serait pas possible d'enregistrer au format csv tes cellules et de traiter ton probleme dans un StringGrid par exemple

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je ne comprend pas ce que tu veut faire exactement, il existe une formule Excel qui permet de mettre dans une cellule par exemple "A3" et "A4" la selection des cellules "A1 a D1" pour les exemples fourni ci-dessous
    code VBE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub Macro1()
    '
    ' Macro1 Macro
    ' Macro enregistrée le 22/04/2008 par blondelle
    '
    ' premiere possibilite
        Range("A3").Select
        ActiveCell.FormulaR1C1 = "=CONCATENATE(R[-2]C,R[-2]C[1],R[-2]C[2],R[-2]C[3])"
        Range("A4").Select
    ' deuxieme possibilite
        ActiveCell.Formula = "=CONCATENATE(A1,B1,C1,D1)"
        Range("A5").Select
    End Sub
    Sinon que veut tu faire exactement sur chaque valeur de chaque cellule peut etre qu'une fonction integree d'Excel est capable de faire ce que tu veut

  9. #9
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    En fait, mon but n'est que de lire un fichier Excel pour en retirer que les données qui m'intéresses. Aujourd'hui les infos sont sur des colonnes spécifiques (1,2,3,5 et 7) par ligne, sur X lignes.

    Pour le moment, je lis les cellules une par une:
    var1.1 = Cellule(ColonneI, LigneJ)
    var1.2 = Cellule(ColonneI+1, LigneJ)
    var1.3 = Cellule(ColonneI+2, LigneJ)
    ...
    var2.1 = Cellule(ColonneI, LigneJ+1)
    ...
    varX.1 = Cellule(ColonneI, LigneJ+X)

    Enfin, de la boucle comme d'habitude .

    mes variables sont des AnsiStrings, des doubles et autres... et je stock directement les infos du fichier excel dans mes variables pour les travailler et les utiliser.
    Ce format de fichier excel est standard dans ma boite et ne peut être changer.

    Je voulais juste lire la ligne d'un coup pour n'avoir à accéder qu'une seul fois au fichier par variable, pour limiter les accès à Excel et par conséquent le temps d'exécution du code.

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Si il y a une chose qui ralenti Excel c'est le rafraichissement de l'ecran on peut le desactiver et le reactiver, sinon si tu a un traitement a faire pourquoi ne pas sauvegarder en csv recuperer dans un StringGrid faire ton traitement

  11. #11
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    En fait, je profitais de l'occasion pour me faire des fonctions de manipulation Excel
    L'idée du csv n'est pas bête, mais si je me souviens bien, faire enregistrer un fichier xls en csv par Excel comporte un risque, celui de perdre les feuilles.
    Le csv ne contient qu'une seul feuille, et si le fichier en contient plusieurs, je ne veux pas qu'un message s'affiche en lui posant les questions "êtes vous sûr?", "vraiment?" ... en fait, lire le fichier permettait d'être transparent.(j'ai fait un test directement sous excel)

    Mais si t'as un moyen de le faire sans que ça se voit, je veux bien essayer pour voir le gain de temps.

  12. #12
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 128
    Points : 63
    Points
    63
    Par défaut
    Je sais pas si sa peut t'aider, mais mois je lit les donnée excel via les composent adoconnection et adoquery, sa marche super bien pour la lecture (je rencontre actuellment un probléme à l'écriture, mais comme tu parle pas d'écrire).
    voisi un bout du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ADOConnection1->Connected = false;
    ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=donnee.xls;Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
    ADOConnection1->Connected = true;
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("SELECT * FROM [Feuil1$]");
    ADOQuery1->Open();
    Tu peut allor travailler sur ton ADOQuery comme si tu travailler en base de donnée, chaque ligne et un enregistrement. tu peut méme métre des objet comme un DBGrid pour afficher tes donnée.

  13. #13
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    fpascal, j'ai essayé le bout de code que tu m'as mis.
    Mais, j'obtiens un message d'erreur: 'Cette interface n'est pas prise en charge'.

    Et, ensuite comment tu fais pour lire une cellule, une ligne ?

  14. #14
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 128
    Points : 63
    Points
    63
    Par défaut
    Pour l'erreur je ne sais pas, je l'ai jamais u.
    Vérifie peut étre les paramétre de tes objet ADOConnection et ADOQuery

    pour lire, rien de compliquer : par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rr[j]=ADOQuery1->Fields->Fields[12]->Value;
    te permet de stoker la valeur contenue dans la 13éme collone (la premiére collone = 0 )dans la variable.
    te perme de passer à la ligne suivante.

    tu peut aussi appliquer des "filtre" de maniére à avoire que les ligne qui t'intérese, par exemple dans mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("SELECT * FROM [Feuil1$] WHERE F3 = '" + IntToStr(nannee) + "' AND F2 = '" + IntToStr(nmois) + "' AND F4 = '" + station[j] + "'");
    ADOQuery1->Open();
    me permet d'avoire que les ligne d'un mois, pour une station. (note, mes collone s'appelle F1, F2,... il prens comme nom de collone le contenu de la premiére ligne)

  15. #15
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    L'erreur se produit au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOConnection1->Connected = true;
    Et pour changer de ligne tu fais comment?

  16. #16
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 128
    Points : 63
    Points
    63
    Par défaut
    Tu n'auris pas fait une erreur dans ConnectionString (un point, une virgule,... mal mise)??

    Tu peut regarder un peut dans l'aide de L'ADOQuery, il à plaint de commande pour te déplacer dans les lignes. Celle que j'utilise le plus souvent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ADOQuery1->First(); //positione à la premiére ligne
    ADOQuery1->Last();//positione à la derniére ligne
    ADOQuery1->Next();//pase à la ligne suivant
    ...

Discussions similaires

  1. Comment protège -t-on des cellules sous EXCEL 10 ?
    Par LNNHELP dans le forum Excel
    Réponses: 5
    Dernier message: 27/06/2014, 10h58
  2. Réponses: 6
    Dernier message: 20/02/2007, 11h42
  3. Comment enregistrer valeurs d'une DataSet sous Excel?
    Par alfadev dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/08/2006, 15h33
  4. Masquage de cellule sous Excel
    Par Igloobel dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/01/2006, 16h29
  5. Réponses: 5
    Dernier message: 07/01/2006, 17h55

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