Calc - styles chargés par macro erronés

Bonjour,

Je copie des styles de cellule d’un classeur vers un autre grâce à la
procédure suivante :

aArgs(0).Name = "LoadCellStyles"

aArgs(0).Value = true

aArgs(1).Name = "OverwriteStyles"

aArgs(1).Value = True

syntheseSF.StyleFamilies.LoadStylesFromURL(thisComponent.Location, aArgs())

A priori ça se passe bien, car mes styles sont bien copiés mais :

si certains styles sont corrects, d’autres ont perdu leur définition en
route !

tout ce qui est relatif à la police, effet de caractères, alignement semble
correct

par contre des formats de nombre ou date me posent problème :

correct :

0 pas de décimale ni de séparateur

# ##0,00 2 décimales et séparateur

JJ/MM/AAAA HH:MM:SS

erroné (la copie revient à Standard) :

# ##0,000

JJ/MM/AAAA HH:MM

J’ai cherché mais n’ai pas trouvé de bug correspondant.

LibO 4.4.2.2 Vista-32b

Merci

Michel

Bonjour Michel

Michel Rudelle wrote

Je copie des styles de cellule d’un classeur vers un autre grâce à la
procédure suivante :
...
si certains styles sont corrects, d’autres ont perdu leur définition en
route !
...
J’ai cherché mais n’ai pas trouvé de bug correspondant.

Ben... c'est parce que ce n'est pas un bug me semble-t-il.

Tu récupères les styles mais les styles utilisent des formats qui en
l'occurrence sont personnalisés, donc, propres au classeur source.
La solution est de récupérer aussi ces formats.

Ci-dessous un code à tester (il y a peut-être plus performant mais
là tout de suite j'ai fait avec ce que je savais sans rechercher plus avant
dans l'Api).

Explications :

J'utilise loadStylesFromDocument puisque tu récupères les styles de
thiscomponent. Pas besoin de passer par un chargement "url".

Quand les styles sont chargés...
Pour chaque style de cellule de la source (thiscomponent)...
À partir de la clé on récupère son format...
Si c'est un format "utilisateur"...
On recherche ce format dans la cible (formats de syntheseSF)...
Si on ne trouve pas ce format on l'ajoute ce qui donne une nouvelle clé...
Que l'on attribue au style de même nom dans la cible (syntheseSF)

PS: je fais l'hypothèse que la locale était la même entre les classeurs...

J'espère que c'est (relativement) clair... :slight_smile:

Cordialement
Pierre-Yves

Bonjour Pierre-Yves,

-----Message d'origine-----
De : pierre-yves samyn [mailto:pierre-yves.samyn@laposte.net]
Envoyé : dimanche 5 juillet 2015 12:54
À : users@fr.libreoffice.org
Objet : [fr-users] Re: Calc - styles chargés par macro erronés

Bonjour Michel

Michel Rudelle wrote
> Je copie des styles de cellule d’un classeur vers un autre grâce à la
> procédure suivante :
> ...
> si certains styles sont corrects, d’autres ont perdu leur définition en
> route !
> ...
> J’ai cherché mais n’ai pas trouvé de bug correspondant.

Ben... c'est parce que ce n'est pas un bug me semble-t-il.

Tu récupères les styles mais les styles utilisent des formats qui en
l'occurrence sont personnalisés, donc, propres au classeur source.
La solution est de récupérer aussi ces formats.

Ci-dessous un code à tester (il y a peut-être plus performant mais
là tout de suite j'ai fait avec ce que je savais sans rechercher plus
avant
dans l'Api).

Explications :

J'utilise loadStylesFromDocument puisque tu récupères les styles de
thiscomponent. Pas besoin de passer par un chargement "url".

Quand les styles sont chargés...
Pour chaque style de cellule de la source (thiscomponent)...
À partir de la clé on récupère son format...
Si c'est un format "utilisateur"...
On recherche ce format dans la cible (formats de syntheseSF)...
Si on ne trouve pas ce format on l'ajoute ce qui donne une nouvelle clé...
Que l'on attribue au style de même nom dans la cible (syntheseSF)

PS: je fais l'hypothèse que la locale était la même entre les classeurs...

J'espère que c'est (relativement) clair... :slight_smile:

Cordialement
Pierre-Yves

Ce qui est clair c'est que j'ai confondu style et format. J'avais bien
suspecté que le problème venait des formats personnalisés.
Je vois le principe, je vais me pencher là-dessus et revenir ici je pense
dans qq jours.

Merci beaucoup,
Michel

Bonsoir Pierre-Yves,

-----Message d'origine-----
De : pierre-yves samyn [mailto:pierre-yves.samyn@laposte.net]
Envoyé : dimanche 5 juillet 2015 12:54
À : users@fr.libreoffice.org
Objet : [fr-users] Re: Calc - styles chargés par macro erronés

Bonjour Michel

Michel Rudelle wrote
> Je copie des styles de cellule d’un classeur vers un autre grâce à la
> procédure suivante :
> ...
> si certains styles sont corrects, d’autres ont perdu leur définition en
> route !
> ...
> J’ai cherché mais n’ai pas trouvé de bug correspondant.

Ben... c'est parce que ce n'est pas un bug me semble-t-il.

Tu récupères les styles mais les styles utilisent des formats qui en
l'occurrence sont personnalisés, donc, propres au classeur source.
La solution est de récupérer aussi ces formats.

Ci-dessous un code à tester (il y a peut-être plus performant mais
là tout de suite j'ai fait avec ce que je savais sans rechercher plus
avant
dans l'Api).

Explications :

J'utilise loadStylesFromDocument puisque tu récupères les styles de
thiscomponent. Pas besoin de passer par un chargement "url".

Quand les styles sont chargés...
Pour chaque style de cellule de la source (thiscomponent)...
À partir de la clé on récupère son format...
Si c'est un format "utilisateur"...
On recherche ce format dans la cible (formats de syntheseSF)...
Si on ne trouve pas ce format on l'ajoute ce qui donne une nouvelle clé...
Que l'on attribue au style de même nom dans la cible (syntheseSF)

PS: je fais l'hypothèse que la locale était la même entre les classeurs...

J'espère que c'est (relativement) clair... :slight_smile:

Euréka, ça marche du tonnerre !

J'ai ramé un peu, j'ai suivi l'idée et je me suis aidé de la bible et de
Xray.
Mais il reste un mystère: Pourquoi la clé du même format de nombre est-elle
différente dans les deux documents ???

Encore merci,
Michel

PS: Voici le petit bout de Procédure que j'ai fait pour ça:

Sub copieFormatNombre(docOrigine As Object, docCible As Object, nomDuStyle
As String)

' docOrigine et docCible sont deux documents ouverts
' nomDuStyle est le nom du style dans les deux documents

'retour avec le style mis correctement à jour dans le document cible

Dim maLangue As New com.sun.star.lang.Locale
Dim cleDoc1 As Long, cleDoc2 As Long, x As Long
Dim unFormat As Object, nomDuFormat As String

'1/ dans le document d'origine, recherche du format de nombre personnalisé
utilisé dans le style copié

'récupérer le NumberFormat correspondant (la clé)
cleDoc1 =
docOrigine.StyleFamilies.getByName("CellStyles").getByName(nomDuStyle).Numbe
rFormat
'récupérer l'objet format correspondant à ce NumberFormat pour en obtenir le
nom (en fait ce que l'on voit dans "Description du Format")
unFormat = docOrigine.NumberFormats.getByKey(cleDoc1)
nomDuFormat = unFormat.FormatString

'2/ recherche de l'existence de ce format dans le document cible et ajout
dans le style s'il n'existe pas

maLangue.Language = "fr"
maLangue.Country = "FR"
x = docCible.NumberFormats.queryKey(nomDuFormat, maLangue, False)
'renvoie le NumberFormat si le format est présent, sinon négatif
If x < 0 Then
  cleDoc2 = docCible.NumberFormats.addNew(nomDuFormat, maLangue)
  
docCible.StyleFamilies.getByName("CellStyles").getByName(nomDuStyle).NumberF
ormat = cleDoc2
End If

End Sub

Bonjour Michel

Michel Rudelle wrote

Euréka, ça marche du tonnerre !
J'ai ramé un peu, j'ai suivi l'idée et je me suis aidé de la bible et de
Xray.

J'aurais dû expliquer mieux ? Au final je ne vois pas de différence d'avec
le code que je t'avais donné....

Hormis le fait de tester sur <0 au lieu de -1 le retour de queryKey.

Pour ce cas particulier il y a peu de chances que l'api évolue mais de
manière générale cette modification ne me semble pas une bonne idée:

*Pour le moment* la fonction renvoie -1 (donc qq chose de négatif)
mais si un développeur rajoute des conditions et codes... Il vaut
mieux prendre strictement la valeur indiquée.

Voir API
<http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1util_1_1XNumberFormats.html#ac5022a94174fe108615eeaccd7a0e59c>

Michel Rudelle wrote

Pourquoi la clé du même format de nombre est-elle différente dans les deux
documents ???

Je n'ai pas regardé le mécanisme de création de la clé mais je doute qu'il
soit
fondé sur le texte du format, plus vraisemblablement sur l'ordre de
création.

Cordialement
Pierre-Yves

Bonjour Pierre-Yves,

Euh, non tu n'aurais pas pu expliquer mieux, la preuve j'y suis arrivé,
mais:

Je viens de découvrir que le code que tu m'avais transmis n'est visible QUE
sur Nabble mais n'est pas dans ma messagerie. Je n'étais pas allé sur Nable
et faute de voir le code dont tu parlais, je suis parti à la découverte avec
seulement le fil conducteur qui était dans le corps du message. C'est très
formateur !

Et un mystère de plus, pourquoi ce code n'est pas dans ma messagerie ?

Cordialement
Michel

Suite...

Michel Rudelle wrote

Je viens de découvrir que le code que tu m'avais transmis n'est visible
QUE
sur Nabble mais n'est pas dans ma messagerie. Je n'étais pas allé sur
Nable
et faute de voir le code dont tu parlais, je suis parti à la découverte
avec
seulement le fil conducteur qui était dans le corps du message. C'est très
formateur !

Oui mais je me sens un peu bête quand même parce que...

Michel Rudelle wrote

Et un mystère de plus, pourquoi ce code n'est pas dans ma messagerie ?

...c'est sans doute parce que je l'ai "balisé" avec la mise en forme Nabble
(raw text). Le mieux est quand même parfois l'ennemi du bien.

Désolé pour cette erreur... et bravo pour la recherche en profondeur
dans l'Api :slight_smile:

Cordialement
Pierre-Yves