Re: [fr-users] Macro, Writer, et tableaux irréguliers.

2017-04-23 Par sujet Jean-Francois Nifenecker

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.

2017-04-23 Par sujet Jaccomard

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.

2017-04-22 Par sujet Jean-Francois Nifenecker

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.

2017-04-18 Par sujet jaccomard
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.

2017-04-18 Par sujet Jean-Francois Nifenecker

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.

2017-04-18 Par sujet Jaccomard

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