[Résolu] [Writer] Rafraîchir un champ dans un tableau

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

[Résolu] [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

Bonjour à tous les utilisateurs de OOo Writer ! :wink:

Voici le défit que je vous propose : j'ai créé un moyen personnel pour effectuer un publipostage programmé depuis une application.
le programme lit une base et pour chaque personne sélectionnée :
1) crée un fichier de fusion (ci-joint le fichier texte donnéestest.txt)
2) crée une instance d'un document writer à partir d'un modèle (ci-joint le fichier test.ott)
3) lance la macro Main en lui passant en paramètre d'entrée le chemin du fichier de fusion ( par exemple : "C:\Temp\donnéestest.txt")

Le document maitre test.ott contient des champs utilisateurs et une Text Table qui contient elle-même des champs utilisateurs.
Ainsi le document contient le nom, prénom et la date de naissance d'une personne et le tableau contient des champs pour fusionner des informations sur les membres de la famille de cette personne.

Pour les infos concernant la personne : Pas de problèmes ! les champs utilisateur sont bien valorisés par la macro Macro_Variables
mais pour les informations concernant la liste des membres de sa famille, le fichier texte contient une série de lignes du style :
$$T01R01&&NOM_DE_CHAMP1=VALEUR_DU_CHAMP1&&NOM_DE_CHAMP2=VALEUR_DU_CHAMP2 ....&&NOM_DE_CHAMPn=VALEUR_DU_CHAMPn
pour chacune de ces ligne, la macro "Macro_Tableaux" :
1) recherche le tableau N°1
2) recherche la ligne N° 1 contenant les champs utilisateurs à fusionner et la copie
3) crée une nouvelle ligne à la fin du tableau et colle la ligne copiée avec les champs
3) recherche un à un les champs et leur affecte leur valeur
4) exécute la méthode : ThisComponent.getTextFields().refresh() pour mettre à jour les champs.

le problème, vous l'avez surement déjà deviné, vient du fait que chaque ligne crée dans le tableau contient les même champs donc vont être mis à jour avec les même valeurs.

Ma question est la suivante : est-il possible d'affecter une valeur et rafraichir un champ dans une ligne bien spécifique d'un tableau indépendamment des autres champs du reste du document ? (ou bien ma solution n'est-elle pas adaptée à la mise à jours des champs utilisateurs Writer)

NB : Pour tester les macros du modèle ci-joint j'ai ajouté aux macros une macro de lancement (Start) qui lance les macros Macro_Variables et Macro_Tableaux en leur passant en entrée le chemin du fichier texte. Vous pouvez modifier le chemin qui est passé en dur.
test Open Office.zip
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice v3.2.0 - Windows XP SP3
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12838
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: Raffraichir un champ Utilisateur dans une ligne de table

Message par Bidouille »

Bonjour,
clairedelune a écrit :Pour tester les macros
Ce forum est organisé en sections et vous avez posté votre question au mauvais endroit : <traitement de textes>.

Votre question a été déplacée. Nous vous invitons vivement à lire le descriptif de chaque section mentionné sur la page d'accueil de notre forum.

Merci de votre collaboration.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Re: [Writer] Rafraîchir un champ dans un tableau

Message par Pierre-Yves Samyn »

Bonjour et bienvenue sur ce forum
clairedelune a écrit :Voici le défit que je vous propose
Euh... le prends pas mal... mais je serais plutôt du genre allergique aux défis... :)

Sinon, sur le fond, je n'ai pas regardé tes PJ car je m'interroge sur le principe même : puisque tu pilotes tout par macro, pourquoi garder les champs utilisateurs ? Pourquoi pas simplement les remplacer au fur et à mesure par leur valeur pour la ligne courante ?
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

Re: [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

Merci Pierre-Yves pour cette réponse ! Si le mot défit te rebute un peu, disons que c'est un jeu si tu préfère ... :P

Tu as dit :
Pourquoi pas simplement les remplacer au fur et à mesure par leur valeur pour la ligne courante ?
C'est en effet le choix que pour l'instant j'ai fait, même s'il ne me parait pas le meilleur !
J'ai remplacé les champs utilisateur par des balises du style <NomUsuelPersonne> dans les cellules des tableaux, mais si une cellule contient un retour chariot, la recherche et le remplacement de ces balises par la valeur des champs engendre une multiplication des saut de lignes !!! mais bon, je continue à rechercher dans cette voie ...

Si quelqu'un a une idée, elle est le bienvenue !
OpenOffice v3.2.0 - Windows XP SP3
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Rafraîchir un champ dans un tableau

Message par Dude »

Salut,
clairedelune a écrit :j'ai créé un moyen personnel pour effectuer un publipostage programmé depuis une application.
Ton application n'a peut être pas besoin de piloter OOo pour cela.
Pierre-Yves Samyn a écrit :Pourquoi pas simplement les remplacer au fur et à mesure par leur valeur pour la ligne courante ?
Un ODT est un assemblage zippé de XML. Il est donc facile de faire des remplacements directement dans le content.xml.

:idea:
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

Re: [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

Merci Dude,
Dude a écrit :Un ODT est un assemblage zippé de XML. Il est donc facile de faire des remplacements directement dans le content.xml
mais pour mettre à jour les tableaux ???? c'est à dire : pour chaque ligne de mon tableau, je veux récupérer la ligne "modèle" qui contient du texte et des champs (ou des balises) et ajouter une nouvelle ligne au tableau sur le modèle de celle que je viens de copier et mettre à jour les balises seulement pour cette nouvelle ligne.
Est-ce possible directement depuis le fichier XML ?
Si oui, est-ce plus simple que de manipuler le tableau dans une macro ?

je me disais, au début, que si le principe du publipostage existe sur OOowriter, comment procède-t-on si on veut produire une courrier par personne sélectionnée dans lequel on affiche l'adresse de la personne et un tableau des membres de sa famille ? (c'est un exemple mais il est courant, non ?)
OpenOffice v3.2.0 - Windows XP SP3
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Rafraîchir un champ dans un tableau

Message par Dude »

clairedelune a écrit :Est-ce possible directement depuis le fichier XML ?
Renomme ton OTT en ZIP et décompresse le content.xml. Explore le contenu pour voir comment est balisé ton tableau.
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

Re: [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

ok Dude,
Dude a écrit :Renomme ton OTT en ZIP et décompresse le content.xml. Explore le contenu pour voir comment est balisé ton tableau
En fait, je sais comment est organisé un fichier ott mais ce que je ne sais pas c'est comment depuis l'appli qui lance le mailing, je peux créer un document open office, et modifier son content.xml le tout dynamiquement !

il faut dire que mon appli propose toute sorte de documents à éditer, lesquels peuvent contenir un nombre variable de tableaux ... !
Il me semble avoir entre aperçu un post sur ce genre de traitement directement dans le xml, je vais explorer la solution .
Le temps de développement est mon principal soucis : donc en attendant d'en avoir le temps, (je suis en train de remplacer mes macros MS-Word par des macros OOo Writer) le plus rapide est de procéder par macro, n'est-ce pas ?

Aujourd'hui je n'ai plus que 2 problèmes à résoudre :
1) sélectionner une ligne de tableau dans laquelle des cellules peuvent être fusionnées (donc déterminer le nombre de colonnes d'une ligne d'un tableau complexe)
2) lorsque je remplace une balise par sa valeur, éviter les sauts de lignes intempestifs

j'ai modifié mon code pour remplacer les champs utilisateurs par des balises dans le tableau et j'ai ajouté une ligne de modèle dans la tableau qui a des cellules fusionnées
Je serais très reconnaissant à quiconque répondrait à mes deux questions (et c'est promis Dude, je regarderai du coté du fichier Content.xml)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice v3.2.0 - Windows XP SP3
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

Re: [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

j'ai trouvé comment sélectionner une ligne d'un tableau contenant des cellules fusionnées !

Si cela peux être utile à quelqu'un, (même si ma méthode est un peu rock'n roll :lol: )
Avant de traiter le tableau, j'utilise le nom de toutes les cellules du tableau pour charger une variable public (tabLignes) qui contiendra le nombre de cellules ligne par ligne

Code : Tout sélectionner

Sub ChargerNbreColonneParLigne(oTableau as object)
	dim cellNames
	dim i as long
	dim nbCol as long
	dim numCol as long
	nbCol = 0
	cellNames = oTableau.GetCellNames()
	for i = 0  to UBound(cellNames)
		numCol = GetNumCol(cellNames(i))
		tabLignes(numCol) = tabLignes(numCol) + 1
	next i
End Sub
'
Function GetNumCol(byval NomCell as string) as long
	dim NumCol as string
	dim ptDeb as long 
	NumCol = ""
	ptDeb = len(NomCell)
	do While IsNumeric(mid(NomCell,ptdeb,1)) AND ptdeb > 0
		NumCol = mid(NomCell,ptdeb,1) & NumCol
		ptDeb = ptDeb - 1
		if ptdeb = 0 then
			exit do
		end if
	loop
	GetNumCol = val(NumCol)	
End Function
je n'ai plus qu'à utiliser ce nombre de cellules lors de la sélection d'une ligne dans la procédure suivante :

Code : Tout sélectionner

sub SelectionnerLigneTableau(oTableau as object,nRow as long)
	Dim oText
	dim oVCurs
	dim cellNames
	dim nbColLigne as long
	
	oCell1 = oTableau.getCellByPosition(0, nRow)
	ThisComponent.getCurrentController().select(oCell1)
	nbColLigne = tabLignes(nRow + 1)

	oVCurs = ThisComponent.getCurrentController().getViewCursor()
	oText = oCell1.getText()
	Dim oStart : oStart = oText.getStart()
	If oText.compareRegionStarts(oStart(), oText.getEnd()) <> 0 Then
  		oVCurs.gotoEnd(True)
	End If

	oVCurs.goRight(nbColLigne -1, True)
end sub
OK, il ne me reste plus qu'à comprendre pourquoi le remplacement des balises par leur valeur entraine un retour chariot à chaque remplacement !!!
Exemple de tableau et du résultat après fusion :
Avant
TableauWriter.JPG
Après
TableauFusionne.JPG
J'espère que cela va inspirer quelqu'un ... merci de votre aide !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par clairedelune le 05 mai 2010 15:00, modifié 1 fois.
OpenOffice v3.2.0 - Windows XP SP3
clairedelune
Fraîchement OOthentifié
Messages : 6
Inscription : 03 mai 2010 07:23

Re: [Writer] Rafraîchir un champ dans un tableau

Message par clairedelune »

clairedelune a écrit :OK, il ne me reste plus qu'à comprendre pourquoi le remplacement des balises par leur valeur entraine un retour chariot à chaque remplacement !!!
Bon j'ai finalement résolu mon problème en remplaçant dans le tableau du document maître les caractères "retour Chariot" qui font changer de paragraphe (touche Entrée) par un saut de ligne sans changement de paragraphe (touches Maj + Entrée)

De cette façon, tout ce passe bien après le remplacement des balises de champ par leur valeur ...

Le mystère des sauts de ligne n'est pas élucidé pour autant mais je déclare momentanément forfait faute de temps !

Merci à Pierre-Yves et à Dude pour votre aide ! :wink:
OpenOffice v3.2.0 - Windows XP SP3