[Résolu] [Calc] Automatisation conversion vers Writer

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 !
furytonio
Membre lOOyal
Membre lOOyal
Messages : 37
Inscription : 07 févr. 2019 20:31

[Résolu] [Calc] Automatisation conversion vers Writer

Message par furytonio »


La modération vous a écrit: règles de cette section
Le balisage (à taper au clavier) doit être correctement orthographié (première lettre en majuscule puis le reste en minuscules).

Pour faire suite à mon lien suivant :

https://forum.openoffice.org/fr/forum/v ... =4&t=59929

Merci de votre aide
Dernière modification par Oukcha le 30 mars 2019 10:06, modifié 3 fois.
Raison : Terme redondant ("calc" déjà identifié par la balise) supprimé + balisage
LO 7.0 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [CALC] Automatisation calc vers writer

Message par Piaf »

Re
un peu d'explications :)
La macro doit être lancée à partir de l'onglet dont on veut récupérer les données.
Le principe est de créer un document Writer contenant les données voulues.

Code : Tout sélectionner

Option Explicit
Sub Main
Dim maFeuille as Object, oCurseur as Object, docWriter as Object, monTexte as Object
Dim monCurseur as Object, maTable as Object, maZone as Object, maCellule as Object
Dim oCol as Long, adresseDoc as String, oTitre as Variant, i as Integer, oFormats, x as Integer, y as Integer, n as Integer, txt as String
Dim aLocale As New com.sun.star.lang.Locale
	'L'onglet visible dans l'interface (la feuille en cours)
	maFeuille = thisComponent.CurrentController.ActiveSheet 
	oCurseur = maFeuille.createCursor
	oCurseur.gotoEndOfUsedArea(False)
	'récupération de l'index de la dernière colonne de données
	oCol = oCurseur.RangeAddress.EndColumn
	'Création d'un document Writer
	adresseDoc = "private:factory/swriter"
	docWriter = StarDesktop.loadComponentFromURL("private:factory/swriter", "_default", 0, Array() )
	monTexte = docWriter.Text
	monCurseur = monTexte.createTextCursor
	With monCurseur
		.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER
		.CharWeight = com.sun.star.awt.FontWeight.BOLD
		.CharFontName = "Time New Roman"
		.CharHeight = 22
	End With
	'Insertion du nom de l'onglet en cours comme titre du document Writer
	monTexte.insertString(monCurseur, maFeuille.Name, False)
	monTexte.insertControlCharacter(monCurseur, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false)
	monCurseur.gotoNextParagraph(False)
	monCurseur.setAllPropertiesToDefault
	monTexte.insertControlCharacter(monCurseur, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false)
	monCurseur.gotoNextParagraph(False)
	monTexte.insertControlCharacter(monCurseur, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false)
	'Insertion de paragraphes vides
	maTable = docWriter.createInstance("com.sun.star.text.TextTable")
	maTable.initialize(oCol + 1,5)
	'Insertion d'un tableau de cinq colonnes et d'un nombre de lignes égale au nombre de colonnes (ocol) + 1 (la ligne des titres du tableau)
	monTexte.insertTextContent(monCurseur, maTable, false)
	oTitre = Array("Dates","Horaires","Lieux","Unités concernées","Formateurs")
	'Renseigner la ligne des titres du tableau
	For i = 0 To UBound(oTitre)
		maTable.getCellByPosition(i,0).String = oTitre(i)
	Next i
	'Formater la première colonne du tableau et la renseigner avec les dates récupérées dans l'onglet Calc	
	oFormats = docWriter.NumberFormats
	maZone = maFeuille.getCellRangeByPosition(1,4,oCol,4)
	For i = 1 To maTable.Rows.Count - 1
		maTable.getCellByPosition(0,i).NumberFormat = oFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, aLocale)
		maTable.getCellByPosition(0,i).Value = maZone.getCellByPosition(x,0).Value
		x = x + 1
	Next i
	y = 1
	'Rechercher dans les colonne de la feuille Calc les cellules marquées Réservé
	'lorsqu'on en trouve, on récupère le nom de l'unité
	For i = 1 To oCol
		For n = 5 To 17
			maCellule = maFeuille.getCellByPosition(i,n)
			If maCellule.String = "Réservé" Then
				txt = txt & maFeuille.getCellByPosition(0,n).String & Chr(13)
			End If	
		Next n
		if txt <> "" Then
			txt = Left(txt,Len(txt)-1)
			'on renseigne le tableau Writer avec le ou les noms des unités (txt)
			maTable.getCellByPosition(3,y).String = txt
		End If
		y = y + 1
		txt = ""
	Next i
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
furytonio
Membre lOOyal
Membre lOOyal
Messages : 37
Inscription : 07 févr. 2019 20:31

Re: [Calc] Automatisation calc vers writer

Message par furytonio »

Merci Piaf,

Mais honnêtement c'est très compliqué pour moi ! Je n'arrive pas à suivre.

Du coup j'ai allégé mon document calc ci joint :
planning 2019 nouvelle edition.ods
Est t'il possible dans la même idée, prenons exemple le mois d'avril, que vous réalisiez une macro pour que lorsque j'ai une réservation cela me remplisse mon doc writer ci joint :
Calendrier Prévisionnel Avril 2019.odt
pour les colonnes Dates et Unité.

Merci d'avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LO 7.0 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Automatisation conversion vers Writer

Message par Piaf »

Bonjour
A tester
J'ai simplifié le formatage du document Writer en utilisant un modèle;
Le fichier modèle (.ott) doit être dans le même répertoire que le fichier Calc.

Code : Tout sélectionner

Option Explicit
Sub Main
Dim maFeuille as Object, oCurseur as Object, docWriter as Object, monTexte as Object
Dim monCurseur as Object, maTable as Object, maZone as Object
Dim oLigne as Long, adresseDoc as Variant, oTitre as Variant, i as Integer, oFormats, x as Integer
Dim aLocale As New com.sun.star.lang.Locale
	maFeuille = thisComponent.CurrentController.ActiveSheet 
	oCurseur = maFeuille.createCursor
	oCurseur.gotoEndOfUsedArea(False)
	oLigne = oCurseur.RangeAddress.EndRow
	adresseDoc = Split(thisComponent.URL,"/")
	adresseDoc(UBound(adresseDoc())) = ""
	adresseDoc = join(adresseDoc, "/")
	docWriter = StarDesktop.loadComponentFromURL(ConvertToURL(adresseDoc & "Prevision.ott"), "_default", 0, Array() )
	monTexte = docWriter.Text
	monCurseur = monTexte.createTextCursor
	monTexte.insertString(monCurseur, maFeuille.Name, False)
	monCurseur.gotoEnd(False)
	maTable = docWriter.createInstance("com.sun.star.text.TextTable")
	maTable.initialize(oLigne,5)
	monTexte.insertTextContent(monCurseur, maTable, false)
	oTitre = Array("Dates","Horaires","Lieux","Unités concernées","Formateurs")
	For i = 0 To UBound(oTitre)
		maTable.getCellByPosition(i,0).String = oTitre(i)
	Next i
	oFormats = docWriter.NumberFormats
	maZone = maFeuille.getCellRangeByPosition(0,2,0,oLigne)
	For i = 1 To maTable.Rows.Count - 1
		maTable.getCellByPosition(0,i).NumberFormat = oFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, aLocale)
		maTable.getCellByPosition(0,i).Value = maZone.getCellByPosition(0,x).Value
		x = x + 1
	Next i
	x = 0
	maZone = maFeuille.getCellRangeByPosition(2,2,2,oLigne)
	For i = 1 To maTable.Rows.Count - 1
		If maZone.getCellByPosition(0,x).String <> "DISPONIBLE" Then
			maTable.getCellByPosition(3,i).String = maZone.getCellByPosition(0,x).String
		End If	
		x = x + 1
	Next i		
End Sub
Le principe est toujours le même, la macro crée le document Writer avec les données de la feuille en cours dans le document Calc.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
furytonio
Membre lOOyal
Membre lOOyal
Messages : 37
Inscription : 07 févr. 2019 20:31

Re: [Calc] Automatisation conversion vers Writer

Message par furytonio »

RE bonjour Piaf et merci pour cette réponse fonctionnelle,

Cependant est t'il possible de dire à la macro que je veux seulement les dates réservées par une unité quelconque ? Et ne pas me retrouver avec tout le mois ?

Merci de la réponse que vous pourrez m'apporter et merci pour votre travail.
LO 7.0 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Automatisation conversion vers Writer

Message par Piaf »

Re
À tester

Code : Tout sélectionner

Option Explicit
Sub Main
Dim maFeuille as Object, oCurseur as Object, docWriter as Object, monTexte as Object
Dim monCurseur as Object, maTable as Object, maZone as Object
Dim tabDates() as Variant, tabUnites() as String
Dim oLigne as Long, adresseDoc as Variant, oTitre as Variant, i as Integer, oFormats, x as Integer
Dim aLocale As New com.sun.star.lang.Locale
	maFeuille = thisComponent.CurrentController.ActiveSheet 
	oCurseur = maFeuille.createCursor
	oCurseur.gotoEndOfUsedArea(False)
	oLigne = oCurseur.RangeAddress.EndRow
	maZone = maFeuille.getCellRangeByPosition(0,2,2,oLigne)
	For i = 0 To UBound(maZone.DataArray)
		Select Case maZone.DataArray(i)(2)
			Case "DISPONIBLE"
			Case "INDISPONIBLE"
			Case Else
				redim Preserve tabDates(x) : redim Preserve tabUnites(x)
				tabDates(x) = maZone.DataArray(i)(0)
				tabUnites(x) = maZone.DataArray(i)(2)
				x = x + 1
		End Select
	Next i
	If UBound(tabDates) = - 1  Then
		MsgBox("Il n'y a aucune réservation pour " & maFeuille.Name)
		Exit Sub
	End If	
	adresseDoc = Split(thisComponent.URL,"/")
	adresseDoc(UBound(adresseDoc())) = ""
	adresseDoc = join(adresseDoc, "/")
	docWriter = StarDesktop.loadComponentFromURL(ConvertToURL(adresseDoc & "Prevision.ott"), "_default", 0, Array() )
	monTexte = docWriter.Text
	monCurseur = monTexte.createTextCursor
	monTexte.insertString(monCurseur, maFeuille.Name, False)
	monCurseur.gotoEnd(False)
	maTable = docWriter.createInstance("com.sun.star.text.TextTable")
	maTable.initialize(UBound(tabDates) + 2,5)
	monTexte.insertTextContent(monCurseur, maTable, false)
	oTitre = Array("Dates","Horaires","Lieux","Unités concernées","Formateurs")
	For i = 0 To UBound(oTitre)
		maTable.getCellByPosition(i,0).String = oTitre(i)
	Next i
	oFormats = docWriter.NumberFormats
	For i = 0 To UBound(tabDates)
		maTable.getCellByPosition(0,i + 1).NumberFormat = oFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, aLocale)
		maTable.getCellByPosition(0,i + 1).Value = tabDates(i)
		maTable.getCellByPosition(3,i + 1).String = tabUnites(i)
	Next i		
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
Messages : 3952
Inscription : 06 oct. 2008 08:03

Re: [Calc] Automatisation conversion vers Writer

Message par Oukcha »

Bonjour,
Dernière visite le : 10 Mars 2019 08:47
Vous avez lu semble t-il les réponses qui vous ont été faites sans y donner de suite.
N'ayant plus de nouvelle, on peut en déduire que le problème est résolu ou ne se reproduit plus.

Merci de baliser par vous-même la prochaine fois.

Un remerciement fait aussi plaisir aux bénévoles qui vous ont consacré de leur temps.
La politesse fait également partie de la philosophie du logiciel libre.

En cas d'erreur, contactez l'équipe de modération pour la réouverture du fil.
                                        
Pour tout savoir sur le fonctionnement de ce forum :arrow: À lire avant tout ! Image