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

MATLAB Discussion :

Remplir un tableau XLS


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut Remplir un tableau XLS
    Je débute dans l'apprentissage des interfaces avec Matlab (3 jours...), donc peut-être que ma question est simple ...
    Ce que j'ai fait pour le moment, c'est une interface toute simple avec des champs à remplir. Une fois ceux-ci remplis, j'ai un bouton "Save" (et j'utilise la fonction xlswrite), qui me permet de sauver les données dans mon fichier excel. Jusque là tout va bien.
    Le problème est quand je lance une deuxième fois l'application, et que je rentre de nouvelles données. Elles remplacent alors les données rentrées précédemment.
    Ce que je voudrais, c'est que quand je sauvegarde mes données, ça passe automatiquement à la ligne suivante dans mon fichier excel (qui est un tableau bien sûr).

    J'utilise donc :
    s = xlswrite('Results.xls', d,'Data', 'A10'); où d est une matrice de mes éléments

    Le problème vient donc du 'A10'. J'avais pensé à une boucle, mais je n'arrive pas à voir comment faire, ça se trouve c'est pas possible ...

    Donc si quelqu'un a une idée .... merci par avance !!!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 956
    Points
    52 956
    Par défaut
    Si le nombre de ligne a exporter vers Excel est constant à chaque fois, il te suffit d'incrémenter la valeur du range :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for n = 1:10
       range = sprintf('A%d',n)
    end
    Sinon, pour une solution plus flexible : [actxserver][Excel] Je veux connaitre la dernière cellule de ma feuille excel

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    Alors j'ai testé le code, mais ça fait bugger mon programme ... (mon application excel tournait en continu, bon après j'avais mis n de 1 à 1000 ... donc je pense qu'à 1000 ça se serait arrêté ; et j'avais donc le message "Un fichier nommé 'Results.xls existe déjà à cet emplacement. Voulez-vous le remplacer ?" qui apparaissait toute les seconde ... pourtant mon fichier excel n'était pas ouvert, et en l'ouvrant j'avais l'impression qu'il remplissait toutes les lignes à partir de A0, de la même information sauvegardée )
    Je me suis donc peut-être mal expliquée ... En fait à chaque fois que je sauve des données, je n'ai qu'une seule ligne à enregistrer. Donc quand j'appuie sur le bouton ''save'', j'ai une seule ligne de données.
    Donc moi je voudrais qu'à chaque fois que j'appuie sur "save", la nouvelle ligne de données soit sauvegardée à la suite de la précédente.

    s = xlswrite('Results.xls', d,'Data', 'A10');

    D'autre part je me suis rendue compte d'un autre problème, c'est qu'il faudrait que j'incrémente de 3 en 3, car j'ai fusionné des cellules dans mon tableau excel.

    Sinon j'ai regardé l'autre solution plus flexible, mais j'avoue que j'y ai pas compris grand chose ...
    Je vois pas comment je pourrais utiliser le code proposé :
    str=DataRange.Address
    [minCol,minLigne,maxCol,maxLigne]=strread(str(2:end),'%s%d:%s%d','delimiter','$')

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 956
    Points
    52 956
    Par défaut
    Voici une fonction qui retourne la plage de cellules utilisées dans la feuille courante d'un fichier xls :

    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
    function [minCol,minLigne,maxCol,maxLigne]=getcellsrange(xls)
     
    if exist(xls,'file')~=2
        error('Can''t read xls file');
    end
     
    Excel = actxserver( 'Excel.Application' );
     
    invoke(Excel.Workbooks, 'open', xls);
     
    DataRange = Excel.ActiveSheet.UsedRange;
    DataRange.Address
    [minCol,minLigne,maxCol,maxLigne]=strread(DataRange.Address(2:end),'%s%d:%s%d','delimiter','$')
     
    invoke(Excel,'quit');
    delete(Excel);
    A utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    xls = 'C:\...\...\...\test.xls';
    [minCol,minLigne,maxCol,maxLigne] = getcellsrange(xls);
    Le nom du fichier doit être le nom complet avec tout le chemin.

    Dans ton cas, il te suffit ensuite de récupérer les variables minCol et max Ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    xls = 'C:\...\...\...\Results.xls';
    [minCol,minLigne,maxCol,maxLigne] = getcellsrange(xls);
     
    range = sprintf('%s%d',minCol,maxLigne+1);
    s = xlswrite('Results.xls', d,'Data', range);
    En tout cas, c'est l'idée...

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    Alors l'idée est bonne effectivement !! Mais j'ai encore quelques soucis.

    La fonction détermine bien donc la plage de cellules utilisées sur ma feuille, le problème est que je n'utilise qu'une seule partie de mon tableau. La cellule min est A1, la max Z69, et moi la partie que j'ai besoin est A10 / E10 (sachant que les cellules A10 A11 A12 sont fusionnées, de même pour B10 B11 B12 etc).
    Y aurait-il moyen de restreindre la plage de cellules soit disant utilisées ? Je ne sais pas trop, mais par exemple en donnant des min et des max à la fonction ...

    D'autre part, j'ai cette erreur qui apparaît dans l'utilisation de la fonction sprintf :
    ??? Error using ==> sprintf
    Function is not defined for 'cell' inputs.
    Et je ne vois pas où est le problème dans l'utilisation de la fonction, car l'écriture correspond à ce qui est indiqué dans l'aide ....

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 956
    Points
    52 956
    Par défaut
    Tu pourrais attacher un exemple de fichier xls ?

    Et peut être nous montrer ton code si ce n'est pas trop long...

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    Alors voici une partie de 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
    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
     
    function name_edit_Callback(hObject, eventdata, handles)
    % hObject    handle to name_edit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of name_edit as text
    %        str2double(get(hObject,'String')) returns contents of name_edit as a double
    handles.metricdata.name_edit = get(hObject,'String');
    nom =get(hObject,'String');
    setappdata(0,'lenom',nom);
     
    % --- Executes during object creation, after setting all properties.
    function name_edit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to name_edit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
    % ---Fonction qui retourne la plage de cellules utilisées dans la feuille courante d'un fichier xls--------------
    function [minCol,minLigne,maxCol,maxLigne]=getcellsrange(xls)
     
    if exist(xls,'file')~=2
        error('Can''t read xls file');
    end
     
    Excel = actxserver( 'Excel.Application' );
     
    invoke(Excel.Workbooks, 'open', xls);
     
    DataRange = Excel.ActiveSheet.UsedRange;
    DataRange.Address
    [minCol,minLigne,maxCol,maxLigne]=strread(DataRange.Address(2:end),'%s%d:%s%d','delimiter','$')
     
    invoke(Excel,'quit');
    delete(Excel);
     
    % --------------------------------------------------------------------
    function Save_Menu_Callback(hObject, eventdata, handles)
     
    h = questdlg(['Do you want to save the data ? '],...
               ['Save Data ' ],...
               'Yes','No','Yes');
     
    xls = 'C:\Documents and Settings\POSTE\Mes documents\MATLAB\Results.xls';
    [minCol,minLigne,maxCol,maxLigne] = getcellsrange(xls);
    tab= [minCol maxLigne+1];
    range = sprintf('%s%d',tab);
     
    if strcmp(h,'No')
        return;
    else
    %     max =str2double(get(handles.text11,'String'))
    %     for i=1:max
    % stringA='A'
    % stringB=10+(3*(i-1))
    % string= strcat(stringA,int2str(stringB));
        nom= getappdata(0,'lenom') ;
        prenom= getappdata(0,'leprenom');
        age= getappdata(0,'sonage');
        duration= getappdata(0,'theduration');
        sex= getappdata(0,'thesex');
        d = {nom , prenom ,sex, age, duration};
    %     if i == 1
    %         c = d;
    %     else
    %         c = cat(1,c,d);
    %     end
    %      
    %     end
    %     s = xlswrite('Results.xls', c,'Data', string);
    %     max = max+1;
    %     set(handles.text11,'String',num2str(max));
    s = xlswrite('Results.xls', d,'Data', range);
     
    end
    Il s'agit de la fonction qui me permet de sauver les donner. J'ai tenté également un autre solution qui apparait dans le code, dans cette autre solution, le problème est que la valeur du "text11" reviens automatiquement à 1 lorsqu'on ferme l'application, mais tant qu'on la laisse ouverte et qu'on sauve les données, ça se fait bien une ligne à la suite de l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    % --- Executes during object creation, after setting all properties.
    function text11_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to text11 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    Je n'ai pas mis toutes les fonctions, je pense que ce n'est pas nécessaire ( du style firstname etc qui sont identiques à celle pour le nom) J'ai renommé également le fichier excel donc le nom n'est pas tout à fait le même.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    La solution partielle est la suivante:

    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
    function Save_Menu_Callback(hObject, eventdata, handles)
     
    h = questdlg(['Do you want to save the data ? '],...
               ['Save Data ' ],...
               'Yes','No','Yes');
     
    if strcmp(h,'No')
        return;
    else
         max =str2double(get(handles.text11,'String'))
         for i=1:max
         stringA='A'
         stringB=10+(3*(i-1))
         string= strcat(stringA,int2str(stringB));
            nom= getappdata(0,'lenom') ;
            prenom= getappdata(0,'leprenom');
            age= getappdata(0,'sonage');
            duration= getappdata(0,'theduration');
            sex= getappdata(0,'thesex');
            d = {nom , prenom ,sex, age, duration};
            if i == 1
               c = d;
            else
               c = cat(1,c,d);
            end
     
         end
         s = xlswrite('Results.xls', c,'Data', string);
         max = max+1;
         set(handles.text11,'String',num2str(max));
         s = xlswrite('Results.xls', d,'Data', range);
     
    end
    Le code marche tant que le programme est lancé, mais dès qu'on le ferme et qu'on le relance, la valeur max revient à 1. Y aurait-il un moyen que la valeur max garde en mémoire sa dernière valeur lors de la fermeture du programme, et ainsi lors des réouvertures suivantes du programmes, continuer à remplir le tableau excel avec les nouvelles données, A LA SUITE des précédentes ?

    J'ai trouvé une solution paliative, en faisant "évoluer" les valeurs dans excel, ça donne le code suivant:

    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
    function start_button_Callback(hObject, eventdata, handles)
     
    h = questdlg(['Do you want to save the data and begin the examination ? '],...
               ['Examination ' ],...
               'Yes','No','Yes');
     
    if strcmp(h,'No')
        return;
    else
        num = xlsread('Results.xls', 'Data', 'B3')
     
    stringA='A';
    stringB= num;
    string= strcat(stringA,int2str(stringB));
     
     
        nom= getappdata(0,'lenom') ;
        prenom= getappdata(0,'leprenom');
        age= getappdata(0,'sonage');
        duration= getappdata(0,'theduration');
        sex= getappdata(0,'thesex');
        d = {nom , prenom ,sex, age, duration};
     
        xlswrite('Results.xls', d,'Data', string);
        xlswrite('Results.xls',num+3,'Data','B3');
    end
    Dans la cellule B3, il y a la valeur 10 que j'incrémente donc de 3 en 3 à chaque fois qu'une ligne d'information est sauvée. Le programme est cependant très lent lors de la sauvegarde des données...et je suis obligée de "passer par excel" pour incrémenter une valeur, ce qui n'est pas très rigoureux ...

    Au final, je voudrais éviter d'incrémenter ma valeur par excel, et faire la programmation uniquement dans matlab. Ou trouver une toute autre solution bien sûr.
    J'espère m'être mieux expliquée. Merci !

  9. #9
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Déjà un conseil n'appelle pas ta variable max c'est une fonction de MATLAB.
    Ensuite et bien utilise set/getappdata sur cette variable comme tu l'as déjà fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if isappdata(0,'maximum')%on vérifie si elle a déjà été initialisée
       maximum=getappdata(0,'maximum');
    else
       maximum=<à toii de déterminer>;
    end
    Et à la fin de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setappdata(0,'maximum',maximum);

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    Je suis revenue sur cette partie de programme. J'avais bien sûr essayé la solution qui marche ... mais je me suis aperçue d'un problème. Tant que l'application matlab est ouverte, tout va bien, la valeur est bien incrémentée correctement. Le souci est quand je ferme et réouvre l'application (je peux fermer et réouvrir le programme sans problème), la valeur "maximum" revient à 1.
    Je ne vois pas comment faire sauvegarder la valeur "maximum" ...
    Je finis par croire que ce n'est pas possible avec Matlab

  11. #11
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Si tu parles de garder la valeur entre 2 sessions MATLAB effectivement ce n'est pas possible avec set/getappdata.
    Dans ce cas une solution serait d'enregistrer cette valeur dans un fichier MAT-File.

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut
    Oui voilà c'est ça que je voulais savoir, et que je cherche depuis un bout de temps !
    Merci beaucoup de ta réponse, parce que là je commençais vraiment à désespérer !!!!!!
    Du coup je vais utiliser la solution alternative que j'avais trouvé (je stocke la valeur dans excel )

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 956
    Points
    52 956
    Par défaut
    Il est alors possible d'utiliser SETPREF/GETPREF à la place de SETAPDATA/GETAPPDATA

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 20
    Points
    20
    Par défaut

    ouaaaaahh fantastique ça maaaaarche !!!!! Merciiii !!
    Encore qq ptits réglages à faire mais globalement ça marche très bien, j'ai testé !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/12/2005, 17h39
  2. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 13h43
  3. Remplir un tableau associatif
    Par photorelief dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2005, 19h20
  4. Lire et remplir un tableau
    Par harris_macken dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 26/09/2005, 02h10
  5. [PHP-JS] Remplir un tableau javascript selon un tableau php
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2005, 15h02

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