Re: [fr-users] Macro, Writer, et tableaux irréguliers.
Bonjour, oui, c'est un peu tordu à gérer... ;-) Entretemps, je me suis aperçu qu'il y a un bug dans la fonction GetColumnWidths(). Telle quelle, les tableaux d'une seule colonne provoquent une erreur. En effet, dans la boucle For i = 0 To l_ColCount - 1, le test If (i = 0) Then est dans ce cas prématuré car l-Seps(0) est probablement non initialisé [pas vérifié mais je préfère assurer...]. Pour blinder le truc, je suggère d'inverser les deux tests If et ElseIf, ce qui donne les tests : If (i = l_ColCount - 1) Then 'last column 'note: if there's only 1 column, this will get its width l_ColWidth = l_Width - l_Total ElseIf (i = 0) Then 'first column (case of multi-column tables) l_ColWidth = l_Seps(i).Position / l_RelWidth * l_Width Else 'other columns l_ColWidth = (l_Seps(i).Position - l_Seps(i-1).Position) / l_RelWidth * l_Width End If Très heureux d'avoir pu éclairer ton chemin. Bon dimanche, -- Jean-Francois Nifenecker, Bordeaux -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
Re: [fr-users] Macro, Writer, et tableaux irréguliers.
Tout d'abord, chapeau bas, l'artiste ! Je planche sur ce trucs depuis trois semaines, et je n'étais pas arrivé à ta cheville ! Vraiment, bravo. Et ça va m'aider. Pour info et ceux que ça intéressent, j'explique ce que j'ai besoin de faire : Dans le cadre d'un petit programme qui aléatoirise des documents (Doc Alea, cf ici :http://scolamath.free.fr/pedagogie/OutilLibreOffice/), je dois transformer un document writer et tout ce qu'il contient en code texte brut. C'est beaucoup plus facile, ensuite, de traiter des commandes spécifiques créées par soi-même (genre /t{a;b;c} pour tirer au hasard entre a, b ou c, par exemple). Ensuite, si le texte qui traduit la structure du tableau est bien codé, il ne reste plus qu'à reconstruire le tableau à partir de ce codage, après avoir traité entre temps les instructions d'aléatoirisation ou de calcul. J'y arrive pour les cadres, les tableaux réguliers, les formules de math, même les images (je sauvegarde l'image). Mais j'étais tombé sur un os avec les tableaux irréguliers : c'est vraiment tordu. Par exemple, en se déplaçant dans le tableau ci-dessous de gauche à droite, ligne par ligne, on peut avoir A1,B1,C1,D1,E1, puis A2,B2,C2,D2,E2,F2,G2,H2, puis A3,F2!,G2!,D3!,E3!, puis A4,B4,C4,D4,G2!,F4,G4. Le tout, sans savoir où c'est fusionné ! Je voudrais donc transformer ce codage en A1,A1,C1,C1,C1,F1,F1,H1,I1 A2,B2,C2,D2,E2,F2,G2,H2,H2 A3,A3,A3,A3,A3,F2,G2,H3,I3 A4,B4,B4,B4,E4,F4,G2,H4,I4 Ce qui, me semble-t-il, est plus logique et permet de reconstruire le tableau d'origine avec les fusions adéquates. Comme tu peux le voir, ton programme permet de s'y retrouver un peu sur cet exemple (même si il coince à cause du nombre de lignes qui varie, en raison de fusions verticales, mais c'est pas grave : ton code me donne le principe). Donc, merci encore. Cordialement, O.J. Le 22/04/2017 à 22:42, Jean-Francois Nifenecker a écrit : Désolé pour la réponse tardive... le temps de rechercher et tester :) Le 19/04/2017 à 07:49, jaccom...@free.fr a écrit : Merci pour votre aide, tout d’abord. L idée est bonne. En revanche, il me semble que ceci ne fonctionne que sous calc. Je cherche à faire la même chose sous Writer. Oooouuups ! Pourtant c'est écrit là-haut : Writer... pfff... /o\ Tout d'abord, on remarque que le comportement d'un tableau Writer diffère sensiblement de celui d'une feuille Calc :( Mon joli speech précédent tombe donc à l'eau. En particulier, lorsque des cellules sont fusionnées, elles sont renumérotées (voir la barre d'état) : en fusionnant A1 et B1, la fusion est identifiée A1 et la cellule autrefois identifiée B1 devient C1... Bigre. Maintenant, pour ce qui est de mesurer la largeur des colonnes (ta question)... Ça se corse comme on dit à Ajaccio. La manière de mémoriser les largeurs des colonnes d'un tableau Writer est un peu particulière : l'objet TableColumnSeparators définit ces largeurs (entre autres choses) mais relativement aux précédentes... D'où une gymnastique spécifique pour retrouver la largeur de chaque colonne. Glaçage sur le gâteau, les largeurs ne sont pas exprimées dans une grandeur connue mais relativement les unes aux autres et à la largeur totale (qui peut d'ailleurs être soit absolue soit relative !). Il faut donc ensuite appliquer les règles de trois qui vont bien. Cerise sur le glaçage, les tableaux irréguliers (ton cas) nécessitent de s'intéresser aux lignes prises individuellement et non plus au tableau dans sa globalité (TableColumnSeparators différents). Bref, cette histoire n'est pas pour les chauves (qui ne peuvent pas/plus s'arracher de cheveux). Ouf. J'ai déposé une démo ici : https://framadrop.org/r/uXWeHVzLIW#iNQgVE7MBFEfTjOGSc4FK2RhX6TVrJVQEZ+QQD6kEJ0= En espérant que ça aidera, --- L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast. https://www.avast.com/antivirus -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
Re: [fr-users] Macro, Writer, et tableaux irréguliers.
Désolé pour la réponse tardive... le temps de rechercher et tester :) Le 19/04/2017 à 07:49, jaccom...@free.fr a écrit : Merci pour votre aide, tout d’abord. L idée est bonne. En revanche, il me semble que ceci ne fonctionne que sous calc. Je cherche à faire la même chose sous Writer. Oooouuups ! Pourtant c'est écrit là-haut : Writer... pfff... /o\ Tout d'abord, on remarque que le comportement d'un tableau Writer diffère sensiblement de celui d'une feuille Calc :( Mon joli speech précédent tombe donc à l'eau. En particulier, lorsque des cellules sont fusionnées, elles sont renumérotées (voir la barre d'état) : en fusionnant A1 et B1, la fusion est identifiée A1 et la cellule autrefois identifiée B1 devient C1... Bigre. Maintenant, pour ce qui est de mesurer la largeur des colonnes (ta question)... Ça se corse comme on dit à Ajaccio. La manière de mémoriser les largeurs des colonnes d'un tableau Writer est un peu particulière : l'objet TableColumnSeparators définit ces largeurs (entre autres choses) mais relativement aux précédentes... D'où une gymnastique spécifique pour retrouver la largeur de chaque colonne. Glaçage sur le gâteau, les largeurs ne sont pas exprimées dans une grandeur connue mais relativement les unes aux autres et à la largeur totale (qui peut d'ailleurs être soit absolue soit relative !). Il faut donc ensuite appliquer les règles de trois qui vont bien. Cerise sur le glaçage, les tableaux irréguliers (ton cas) nécessitent de s'intéresser aux lignes prises individuellement et non plus au tableau dans sa globalité (TableColumnSeparators différents). Bref, cette histoire n'est pas pour les chauves (qui ne peuvent pas/plus s'arracher de cheveux). Ouf. J'ai déposé une démo ici : https://framadrop.org/r/uXWeHVzLIW#iNQgVE7MBFEfTjOGSc4FK2RhX6TVrJVQEZ+QQD6kEJ0= En espérant que ça aidera, -- Jean-Francois Nifenecker, Bordeaux -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
RE: [fr-users] Macro, Writer, et tableaux irréguliers.
Merci pour votre aide, tout d’abord. L idée est bonne. En revanche, il me semble que ceci ne fonctionne que sous calc. Je cherche à faire la même chose sous Writer. Cordialement. O.Jaccomard De : Jean-Francois Nifenecker Envoyé le :mardi 18 avril 2017 18:21 À : Jaccomard; users@fr.libreoffice.org Objet :Re: [fr-users] Macro, Writer, et tableaux irréguliers. Bonjour, Le 18/04/2017 à 14:45, Jaccomard a écrit : > > est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une > cellule dans un tableau irrégulier (i.e. possédant des cellules > fusionnées) ? > De tête... Lors d'une fusion de cellules, les cellules faisant partie de la fusion (la plage fusionnée) existent toujours et peuvent être référencées. Il est donc possible de tester si la cellule sélectionnée est une cellule unique ou résulte d'une fusion (donc une plage). Plage (s'applique aux plages uniques) : Function IsSingleRange(ByRef pRange As Object) As Boolean 'returns True if the range is a single range IsSingleRange = pRange.supportsService(SERV_CELLRANGE) End Function 'IsSingleRange Cellule unique : Function IsSingleCell(ByRef pRange As Object) As Boolean 'returns True if the range is a cell IsSingleCell = pRange.supportsService(SERV_CELL) End Function 'IsSingleCell Avec : Const SERV_CELLRANGE = "com.sun.star.table.CellRange" Const SERV_CELL = "com.sun.star.table.Cell" Attention à tester la cellule unique *avant* la plage car une cellule unique est aussi une plage (d'une seule cellule). Bien cordialement, -- Jean-Francois Nifenecker, Bordeaux -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
Re: [fr-users] Macro, Writer, et tableaux irréguliers.
Bonjour, Le 18/04/2017 à 14:45, Jaccomard a écrit : est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une cellule dans un tableau irrégulier (i.e. possédant des cellules fusionnées) ? De tête... Lors d'une fusion de cellules, les cellules faisant partie de la fusion (la plage fusionnée) existent toujours et peuvent être référencées. Il est donc possible de tester si la cellule sélectionnée est une cellule unique ou résulte d'une fusion (donc une plage). Plage (s'applique aux plages uniques) : Function IsSingleRange(ByRef pRange As Object) As Boolean 'returns True if the range is a single range IsSingleRange = pRange.supportsService(SERV_CELLRANGE) End Function 'IsSingleRange Cellule unique : Function IsSingleCell(ByRef pRange As Object) As Boolean 'returns True if the range is a cell IsSingleCell = pRange.supportsService(SERV_CELL) End Function 'IsSingleCell Avec : Const SERV_CELLRANGE = "com.sun.star.table.CellRange" Const SERV_CELL = "com.sun.star.table.Cell" Attention à tester la cellule unique *avant* la plage car une cellule unique est aussi une plage (d'une seule cellule). Bien cordialement, -- Jean-Francois Nifenecker, Bordeaux -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
[fr-users] Macro, Writer, et tableaux irréguliers.
Bonjour à tous, est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une cellule dans un tableau irrégulier (i.e. possédant des cellules fusionnées) ? Cordialement, O.J. --- L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast. https://www.avast.com/antivirus -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour savoir comment vous désinscrire Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés