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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    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
    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 éclairé 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
    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
    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
    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 émérite
    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
    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 émérite
    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
    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
    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

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, 09h58
  2. Réponses: 6
    Dernier message: 20/02/2007, 10h42
  3. Comment enregistrer valeurs d'une DataSet sous Excel?
    Par alfadev dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/08/2006, 14h33
  4. Masquage de cellule sous Excel
    Par Igloobel dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/01/2006, 15h29
  5. Réponses: 5
    Dernier message: 07/01/2006, 16h55

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