PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV (versões anteriores) → Inserer champ RTF dans libreoffice
Inserer champ RTF dans libreoffice
Iniciado por Ambroise, out., 18 2017 9:52 AM - 17 respostas
Publicado em outubro, 18 2017 - 9:52 AM
Bonjour,

J ai un champ RTF permettant de mettre en forme mon texte (gras, tabulations, ....

J'ai besoin de l'inclure mis en forme dans libreoffice ou word.
Pour le moment j'utilise le composant livre pour faire du rechercher remplacer mais il me converti tout en teste sans garder la mise en forme. Avez vous une idéé de comment faore cela ?

Je suis en WD 17.
Publicado em outubro, 18 2017 - 11:09 AM
bonjour

je suis en windev 21

j'ai pas de souci avec libre office

je passe par une copie dans le presse papier

VersPressePapierRTF(Texte_RTF)

puis une rechercher puis coller

au debut je faisais cela en ole mais j’étais obligé d'ouvrir et fermer le document a chaque remplace


après j'ai récupéré une classe word et open office ( idem que libbre office ) livrer avec une lst
Publicado em outubro, 18 2017 - 11:23 AM
Merci pour la proposition.
Je passe aussi par le composant venant d'une LST pour piloter Office ou Libreoffice/OpenOffice.

Il me manquais la fonction VersPressePapierRTF(Texte_RTF)
que je ne connaissais pas.

Je teste cela immédiatement

:merci:
Publicado em outubro, 18 2017 - 11:46 AM
en utilisant le composant si on a le meme

VersPressePapierRTF(rtf) copie dans la presse papier

gpclEditeur:Rechercher("#dossier#") recherche dans le document #dossier#
gpclEditeur:Coller( ) coller le presse papier
Publicado em outubro, 18 2017 - 2:38 PM
Merci pour l'explication ..... MAIS

Eh oui il y a toujours un mais :

Voici mon code :
gpclEditeur:Rechercher("@STATUTESPECE@")
HLitRecherchePremier(espèce,IDespèce,COMBO_Espèce..ValeurMémorisée)
VersPressePapierRTF(espèce.Texte_RTF)
gpclEditeur:Coller()


Donc j'utilise bien le même composant que toi.
J'ai bien la sélection de mon texte @STATUTESPECE@ mais pas le collage espéré. Le texte sélectionné reste en surbrillance uniquement.

J'ai tenté de mettre ma recherche dans le fichier de donnée avant mais ca ne change rien.

Une idée ?
Publicado em outubro, 18 2017 - 5:44 PM
bonjour,

que recupere tu en faisant info(espèce.Texte_RTF) ou trace

ou alors mettre un champs rtf dans une fenetre

HLitRecherchePremier(espèce,IDespèce,COMBO_Espèce..ValeurMémorisée)
monchampsrtf=espèce.Texte_RTF

ensuite je mets dans l'ordre ( cela a peut etre de l'importance question de temps de collage dans le presse papier)
vers presse papier
rechercher
coller

autrement question bete le document est ouvert
Publicado em outubro, 18 2017 - 7:59 PM
Merci de t'occuper de mon cas.
Effectivement, mon problème est bien lié aux données. Via WDMAP, je n'ai que le formatage dans mon champ RTF sans mention des lignes marquées.

Je fais un simple
ecranversfichier()
Hajoute(espece)

C'est la première fois que je joue avec le RTF donc je ne fais peut être pas la bonne manip.

Le trace ou le débogage pas a pas me donne aussi que le formatage :
{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Verdana;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\f0\fs17\par

Mon champ fait 800 caractères donc ce ne doit pas être un problème de longueur....
Publicado em outubro, 18 2017 - 10:14 PM
peux tu me donner la structure de ton champs

j'ai pas mon programme sous les yeux suis chez moi

je travaille pas ecranversfichier()

j'ai un arbre de decision avec des champs rtf je remplace des choses dans le champs rtf par des valeurs sql

et apres j'envoie cela sur libre office

je te tiens au courant demain

il faudrait voir l'enregistrement dans la table


a faire un champs dans une fenetre et voir le rtf apres le HLitRecherchePremier

prefere faire un htrouve mais vieux developpeur

HLitRecherchePremier(espèce,IDespèce,COMBO_Espèce..ValeurMémorisée)
monchampsrtf=espèce.Texte_RTF
Publicado em outubro, 24 2017 - 8:02 AM
Bonjour Serge,
Désolé de ce silence. J'ai été bloqué par d'autres projets.
Il semble en effet que ce soit ma rubruqye qui pose souci. Lorsque je rappelle le contenu de ma rubrique dans un champ RTF, rien n'apparait.
Peux tu me dire comment tu affecte le contenu d'un champ RTF à un enregistrement et comment tu le récupère ?
MErci d'avance.
Publicado em outubro, 24 2017 - 11:59 AM
il me semblait que tu faisais
HLitRecherchePremier(espèce,IDespèce,COMBO_Espèce..ValeurMémorisée)

monchampsrtf=espèce.Texte_RTF

deja moi je ferais un test avec htrouve


je traite en sql par select

apres j’exécute ma requete

je rempli mon champs rtf par le resultat de ma requete

FEN_test.Texte_RTF4=sdrequete.lib3

lib3 est un champs memo de ma table

Texte_RTF4 est un champs de saisie style rtf

après tu peux le récupérer avec les sequences hlit htrouve
Publicado em outubro, 25 2017 - 8:24 AM
:merci: :merci: :merci: :merci: :merci: :merci:
:D

Tu viens de me donner la solution .....

Ma rubrique était en sous-type TEXTE et non en sous-type MEMO TEXTE.
Maintenant cela fonctionne pour le stockage du contenu du champ dans la base de donnee mais toujours pas pour l'action coller ce contenu dans mon doc rtf.
Je continue a chercher...
Publicado em outubro, 25 2017 - 11:25 AM
faire un info pour voir si tu recupere bien quelque chose autrement il va coller du vide


dans ma procedure je lance

gpclEditeur = cEditeur.EditeurInstance()


apres j'ouvre le document

sDocument = chemin du document libre office

SI gpclEditeur:Ouvrir(sDocument) = Faux ALORS
Erreur("L'ouverture du document a échoué.")
FIN

puis

VersPressePapierRTF(rtf) copie dans la presse papier du champs memode la table

info(rtf) pour voir ce que tu recupere
gpclEditeur:Rechercher("#dossier#") recherche dans le document #dossier#
gpclEditeur:Coller( ) coller le presse papier

la fin du traitement
LanceAppliAssociée(sDocument )
Multitâche(120) a voir le timing mais sans multitache cela marche pas
nh est un entier système =0
nh=SysFenHandle(sdocumentfinal+" - LibreOffice Writer")
SysDonneFocus(nh)
SysFenAffiche(nh,sfaMaximise)
Publicado em outubro, 25 2017 - 3:24 PM
J'ouvre mon document depuis le début de la procédure puisque j'utilise déjà dans le document plusieurs
gpclEditeur:RechercherRemplacer

Ceux-ci fonctionnent correctement.

Voici mon code à la fin qui ne fonctionne pas :

gpclEditeur:Rechercher("@STATUT@")
HLitRecherchePremier(espèce.IDespèce,COMBO_Espèce)
Trace (espèce.Texte)
bTest est un booléen=VersPressePapierRTF(espèce.Texte)
Trace(bTest)
gpclEditeur:Coller()


Du coup je récupère bien le contenu de ma rubrique dans le premier TRACE.
Mon booléen de test me retourne bien VRAI donc ma valeur est récupérée dans le presse papier.
Le texte est sélectionné mais c'est comme si la fonction coller ne s'éxécutait pas...

Mystère.

Je vais tenter de contourner mon problème mais c'est vrai que je ne comprends pas le pourquoi du comment et je continuerai à chercher.
Publicado em outubro, 25 2017 - 4:31 PM
tu fais bien cela

pclEditeur = cEditeur.EditeurInstance()


apres j'ouvre le document

sDocument = chemin du document libre office

SI gpclEditeur:Ouvrir(sDocument) = Faux ALORS
Erreur("L'ouverture du document a échoué.")
FIN

tu choisi bien open office
moi je me sers que de libre office donc j'ai // sur le cas 2 pclEditeur = allouer un cOpenOfficeWriter

PROCEDURE GLOBALE EditeurInstance()

// Variable locale
pclEditeur est un cEditeur dynamique = Null

// Les deux installés ?
//Si cOpenOfficeWriter.Disponible() ET cMicrosoftWord.Disponible() ALORS
//1 : OpenOffice Writer
//2 : Microsoft Word
// SELON Dialogue("Souhaitez-vous utiliser OpenOffice Writer ou Microsoft Word ?")
// OpenOffice Writer
//CAS 1
pclEditeur = allouer un cOpenOfficeWriter
// Microsoft Word
// CAS 2
// pclEditeur = allouer un cMicrosoftWord
// FIN

RENVOYER pclEditeur
//FIN


la classe de coller
tu peux faire un test pour voir si tu passe dedans en mettant un info("toto")


// Variable


tabMNoArgs est un tableau de Variant

oDispatchHelper est un objet OLE dynamique = m_oApplication>>createInstance("com.sun.star.frame.DispatchHelper")
oFrame est un objet OLE dynamique = m_oDocument>>getCurrentController()>>getFrame()

// Collage par le dispatcher
oDispatchHelper>>executeDispatch(oFrame, ".uno:Paste", "", 0, tabMNoArgs)

// Libération
libérer oDispatchHelper
libérer oFrame
Publicado em outubro, 25 2017 - 5:28 PM
gpclEditeur:Rechercher("@STATUT@")
HLitRecherchePremier(espèce.IDespèce,COMBO_Espèce)
Trace (espèce.Texte)
bTest est un booléen=VersPressePapierRTF(espèce.Texte)
Trace(bTest)
gpclEditeur:Coller()

apres tu ouvre un doc et puis un coller on verra ce qu'il y a dans le presse papier
Publicado em outubro, 26 2017 - 7:48 AM
MEA MAXIMA CULPA !!!!

L'erreur venait de moi, ton code fonctionne à merveille.
Afin de ne pas risquer que mes utilisateurs détruisent mes modèles, je mets tous mes fichiers de texte en lecture seule à l'ouverture de l'application.

Or, si les fonctions gpclEditeur:RechercherRemplacer modifient le texte même dans un doc en lecture seule, la fonction gpclEditeur:Coller ne le fait pas.

J'ai uniquement retiré la lecture seule en début de procédure et tout fonctionne comme voulu.
Encore merci pour l'aide et le temps consacré à ma demande :merci:
Publicado em outubro, 26 2017 - 9:10 AM
cool

bon dev
:D
Membro registado
962 mensagems
Popularité : +183 (185 votes)
Publicado em outubro, 26 2017 - 10:30 AM
hello,
voici une fonction qui permet d'insérer du RTF dans Writer à partir d'un champ RTF de windev :
syntaxe :
Procedure OOInsereRTF(MonChampRTF,MonDocumentWriter est une chaîne,MonSignet est une chaîne)

MonChampRTF est le champ RTF à copier
MonDocumentWriter est le document à mettre à jour.
MonSignet est le nom du repère de texte à mettre dans Writer à l'endroit où l'on veut insérer le texte.

exemple d'appel :
VersPressePapierRTF(Texte_RTF)
OOInsereRTF(Texte_RTF,"f:\temp\LibreOffice\TestRtf.odt","PointDinsertion")


procédure OOInsereRTF :
Procedure OOInsereRTF(MonChampRTF,MonDocumentWriter est une chaîne,MonSignet est une chaîne)
// insertion de RTF dans un document Writer
// J.P Octobre 2017
LOCAL
PathURL est une chaîne
oSM est un objet automation dynamique
oDesktop est un objet automation dynamique
oCRef est un objet automation dynamique
oDocument est un objet automation dynamique
oFrame est un objet automation dynamique
oDispatcher est un objet automation dynamique
oViewCursor est un objet automation dynamique
oBookmark est un objet automation dynamique
arg_LdDoc est un tableau de 1 objet automation dynamique
arg_MyProps est un tableau de 0 objet automation dynamique //Variant //Tableau des Propriétés de MailMerge pour la fusion
vdl est un entier


SI fFichierExiste(MonDocumentWriter) ALORS
// Démarrage du service si il existe
QUAND EXCEPTIONEXCEPTION DANS
// Création d'un service LibreOffice si nécessaire
oSM = ObjetActif("com.sun.star.ServiceManager")
SI oSM = Null ALORS oSM = allouer un objet automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
oDispatcher = oSM>>createInstance("com.sun.star.frame.DispatchHelper")
// Core reflection est utilisé pour pouvoir créer des property value
oCRef = oSM>>createInstance("com.sun.star.reflection.CoreReflection")
FAIRE
FinProgramme("LibreOffice n'est pas installé sur votre poste.")
FIN
// on prépare les arguments pour la fonction LoadComponentFromURL
arg_LdDoc[1] = OOValeurNommée(oSM,oCRef,"Hidden",False)
// Ouverture du fichier dans OpenOffice Writer en mode visible
oDocument = oDesktop>>LoadComponentFromURL( OOFichier(MonDocumentWriter), "_blank", 0, arg_LdDoc)
oFrame = oDocument>>getCurrentController()>>getFrame()
SI oDocument<>Null ALORS
//Actualisation des liens du document
oDocument>>updateLinks
oViewCursor = oDocument>>CurrentController>>getviewCursor()
oBookmark = oDocument>>Bookmarks>>getByName(MonSignet)>>Anchor
oViewCursor>>gotorange(oBookmark, False)
oDispatcher>>executeDispatch(oFrame, ".uno:Paste", "", 0, arg_MyProps)
oDocument>>Close(Vrai)
SINON
Erreur("Document non ouvert")
FIN
oDesktop>>Terminate()
Libérer oSM
FIN
CAS EXCEPTION:
Erreur("Exception LibreOffice : ", ExceptionInfo())
oDesktop>>Terminate()
Libérer oSM


Procédure ooFichier :
Procedure OOFichier(Fichier est une chaîne)
RENVOYER "file:///"+Remplace(Fichier,"\","/")


Procédure OOValeurNommée :
Procedure OOValeurNommée(oSM est un objet automation dynamique, oCRef est un objet automation dynamique,
cName est une chaîne, uvalue est un Variant)
PropertyValue est un objet automation dynamique
//PropertyValue = oSM>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oCRef>>forName("com.sun.star.beans.PropertyValue")>>createObject(PropertyValue)
PropertyValue>>Name = cName
PropertyValue>>Value = uvalue
RENVOYER PropertyValue


et voilà le résultat :





--
Ami calmant, J.P