https://www.acsysteme.com/wp-content/uploads/2021/08/saga2021-SLt-9-ExempleComplet-750x424.gif

S01E08 : Utiliser le presse papier pour transférer des tableaux par Stéphanie LESCARRET

Les Uitable permettent de facilement rendre compte et éditer des données comme dans un tableur. On les utilise beaucoup dans les applications pour visualiser nos données sous forme de tableau. Et comme beaucoup, j’ai toujours le fol espoir de réussir à transférer des données de mon application vers Excel, ou d’Excel vers mon application avec un simple copier/coller. Malheureusement, cela n’est pas possible nativement mais on peut rapidement développer quelque chose qui répond à ce besoin.

Pour réaliser cette opération, nous aurons besoin de :

  • un menu contextuel, associé à la table et de 2 actions copier/coller (facile à mettre en œuvre depuis l’App Designer, depuis la version R2020a),
  • une fonction qui peut transférer de l’information vers et depuis le presse-papier (une bonne vieille fonction qui existe depuis 2006 : clipboard)

D’abord, le design

La première étape consiste à créer une nouvelle App, et y ajouter une table :

Vous utilisez la fonction startupFcn pour remplir la table :

https://www.acsysteme.com/wp-content/uploads/2021/08/saga2021-SLt-2-Fcn.png
La seconde étape consiste à créer un menu contextuel, et y ajouter 2 commandes Copier et Coller.

Ensuite le code

La fonction clipboard permet de transférer une chaîne de caractères entre Matlab et le presse-papier. Un tableau sous Excel est copié dans une chaîne dont les colonnes sont séparées par des tabulations et les lignes par un retour à la ligne. Il va donc falloir créer des fonctions pour transformer notre table en une chaîne au bon format.

Copier : dans la jungle des fonctions de manipulation de chaînes de caractères, j’ai choisi la fonction sprintf pour transformer une ligne de la table. Cette fonction de bas niveau permet de gérer tout type de données et d’insérer facilement les tabulations. Traduire une ligne : Prénom (=chaine) / Min (=numérique) / Moyenne (=numérique) / Max (=numérique) se fait avec une instruction du style :

str = sprintf(‘%s\t%f\t%f\t%f’, prenom, min, moyenne, max);

Puis, pour concaténer les lignes entre elles, j’utilise la fonction de haut niveau strjoin en utilisant le retour à la ligne comme séparateur. Finalement, on obtient le code suivant pour copier la table dans le presse-papier :

https://www.acsysteme.com/wp-content/uploads/2021/08/saga2021-SLt-4-copierLaTable-750×263.png

Coller : pour interpréter la chaine de caractère issue d’Excel, j’utilise la fonction textscan, qui comme sprintf permet de choisir le format de décodage de la chaine de caractères. Mais attention, comme pour toute action de l’utilisateur, il faut vérifier qu’il essaie bien de coller quelque chose de compatible avec la table de données.

Si j’identifie un problème dans les données interprétées, j’alerte l’utilisateur avec un message :

https://www.acsysteme.com/wp-content/uploads/2021/08/saga2021-SLt-6-collerUneTable-750×355.png

On obtient alors :

Pour aller plus loin, on peut étoffer le code et faire en sorte de copier/coller une ligne ou une colonne pour obtenir ce type de fonctionnement :

Partager cet article :