[Résolu][Calc]Export Pdf plage de cellules variable

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 !
fneck
Membre OOrganisé
Membre OOrganisé
Messages : 50
Inscription : 07 janv. 2014 11:38

[Résolu][Calc]Export Pdf plage de cellules variable

Message par fneck »

Bonjour,

Le code ci-joint fonctionnait parfaitement sous windows 7 avec Pdfcréator (filtrages des colonnes utiles et impression de la plage voulue au bon format avec visualisation préalable du Pdf.

Code : Tout sélectionner

Sub impression()

	' mise en forme pour impression, création d'un fichier pdf
	Dim zoneImprim(0) As New com.sun.star.table.CellRangeAddress
	Dim stylesPage, StyleMaPage, enTete as Object
	Dim Texte2, Curseur2 As Object	
	Dim nomStyleMaPage As String	
	Dim Props(2) As New com.sun.star.beans.PropertyValue
	Props(0).Name = "PaperOrientation"
	Props(0).Value = com.sun.star.view.PaperOrientation.LANDSCAPE
	Props(1).Name = "PaperFormat"
	Props(1).Value = com.sun.star.view.PaperFormat.A4
	Props(2).Name = "Name"
	Props(2).Value = "PDFCreator"
	Mondoc.Printer = Props()
	maFeuille2 = Mondoc.Sheets.getByName("Données")

		' recherche de la dernière ligne
		macell2 = maFeuille2.getCellRangeByName("A1")
		oCursor = maFeuille2.createCursorByRange(macell2)
		oCursor.GotoEndOfUsedArea(True)
		aAddress = oCursor.RangeAddress
		fin = aAddress.EndRow + 1
		
		' on masque les colonnes Ne conserver que colonnes A G H L R S et T
		' Soit respectivement, N° CHO, Numéro titre, NOM, Code ACT, Montant global RAR, TOTAL DU , et enfin, Commentaires
		macell2 = maFeuille2.getCellRangeByName("B1:F1")
		macell2.Columns.IsVisible = False
		macell2 = maFeuille2.getCellRangeByName("I1:K1")
		macell2.Columns.IsVisible = False		
		macell2 = maFeuille2.getCellRangeByName("M1:Q1")
		macell2.Columns.IsVisible = False					

		nomStyleMaPage = maFeuille2.PageStyle
		stylesPage = mondoc.StyleFamilies.getByName("PageStyles")
		StyleMaPage = stylesPage.getByName(nomStyleMaPage)
		StyleMaPage.HeaderIsOn = False
		StyleMaPage.FooterIsOn = True
		StyleMaPage.PageScale = 100

		zoneImprim(0).Sheet = 0
		zoneImprim(0).StartColumn = 0 : zoneImprim(0).StartRow = 1 ' A2
		zoneImprim(0).EndColumn = 19 : zoneImprim(0).EndRow = fin ' T
		Mondoc.currentController.setActiveSheet(Mondoc.Sheets.getByName("Données"))
		Mondoc.CurrentController.getActiveSheet().setPrintAreas(zoneImprim())
		Mondoc.Print(Array())

		wait 100
		
		macell2 = maFeuille2.getCellRangeByName("B1:Q1")
		macell2.Columns.IsVisible = True				

End Sub
Nous sommes maintenant sous Win 10 avec uniquement Microsoft print to Pdf et l'impression des plages utiles se lance directement sans visualisation du PDF (qui ne permettait d'imprimer que les feuilles nécessaires à chaque utilisateur en fonction du portefeuille de gestion de chacun.

J'ai cherché sur le forum et testé différentes solutions mais étant totalement néophyte en programmation je sollicite votre aide et vous remercie d'avance.
Dernière modification par fneck le 18 juin 2019 16:08, modifié 4 fois.
Obligation de version libreoffice 6.2.7.1
windows 10 Pro
Avatar de l’utilisateur
Dredd
Membre cOOnverti
Membre cOOnverti
Messages : 362
Inscription : 24 mai 2006 11:15
Localisation : Mega-City One

Re: [Calc]créer et visualiser Pdf

Message par Dredd »

Bonjour,

PdfCreator n'a jamais fait partie des produits Microsoft Windows. C'est un logiciel à part qui s'installe très bien sous Windows 10.
Propulsé par OpenOffice 4.1.6 sous Windows 10 x64
fneck
Membre OOrganisé
Membre OOrganisé
Messages : 50
Inscription : 07 janv. 2014 11:38

Re: [Calc]Export Pdf plage de cellules variable

Message par fneck »

Merci mais les ordi du bureau sont archi vérouillés et je ne peux rien installer dessus d'où ma question pour savoir comment utiliser le générateur de pdf natif sur nos PC à savoir Microsoft Print to Pdf ou autre soluce en sachant que la mise en page est restée conforme aux souhaits de "mes" utilisateurs
Dernière modification par fneck le 17 juin 2019 11:21, modifié 1 fois.
Obligation de version libreoffice 6.2.7.1
windows 10 Pro
Avatar de l’utilisateur
Dredd
Membre cOOnverti
Membre cOOnverti
Messages : 362
Inscription : 24 mai 2006 11:15
Localisation : Mega-City One

Re: [Calc]Choix imprimante Pdf

Message par Dredd »

Tu peux toujours poser ta question sur un forum Microsoft mais, cette imprimante virtuelle n'est bien sûr pas aussi élaborée.
Propulsé par OpenOffice 4.1.6 sous Windows 10 x64
fneck
Membre OOrganisé
Membre OOrganisé
Messages : 50
Inscription : 07 janv. 2014 11:38

Re: [Calc]Export Pdf plage de cellules variable

Message par fneck »

Je comprends mais ils ne s'y connaissent pas beaucoup plus que moi en macro ooo.
J'ai trouvé ce code sur un vieux post de 2009 ici même https://forum.openoffice.org/fr/forum/v ... t=calc+pdf

Code : Tout sélectionner

sub ZoneImpression
   document = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")         
'Définition de la zone   
    Dim origZone(0) as new com.sun.star.beans.PropertyValue
           origZone(0).Name = "ToPoint"
      origZone(0).Value = "$a$2:$tS$18"
   dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, origZone())
   dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Array())         
end sub

sub ExporterPDF
   ZoneImpression
   document = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args2(2) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "SelectionOnly"
   args2(0).Value = 1
   args2(1).Name = "FilterName"
   args2(1).Value = "calc_pdf_Export"
   args2(2).Name = "URL"
   args2(2).Value = "C:/AdresseFichier.pdf"
   dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args2())
end sub
qui permet de lancer la bonne imprimante je pense mais il génère 1 erreur ("Erreur lors de l'enregistrement du document AdresseFichier") et je ne vois pas comment l'intégrer au code d'origine qui a pour effet de définir les plages utiles en excluant les autres.
Mais ne voulant pas faire de déterrage, je me demande s'il n'y a pas moyen de fusionner les 2.
 Ajout : J'ai aussi trouvé ce code qui génère bien un PDF sans intervention utilisateur mais qui ne l'ouvre pas et qui pourrait se faire après le filtrage de zone qui fonctionne dans la macro d'origine

Code : Tout sélectionner

Sub Main
dim propFich(1) As New com.sun.star.beans.PropertyValue
propFich(0).Name = "FilterName"
propFich(0).Value = "calc_pdf_Export"
propFich(1).Name = "FilterData"
propFich(1).Value = filterProps()
adresseDoc = convertToURL("C:\Users\Public\Downloads\test.pdf") 'remplace ton chemin par l'endroit ou tu veux que le fichier soit enregistré
thiscomponent.storeToURL(adresseDoc, propFich())
End Sub
qu'en pensez vous? et encore merci :fou: 
Dernière modification par fneck le 17 juin 2019 11:21, modifié 1 fois.
Obligation de version libreoffice 6.2.7.1
windows 10 Pro
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Re: [Calc]Choix imprimante Pdf

Message par Dude »

Tu mélanges "impression" et "export" qui sont deux notions différentes.
fneck a écrit :'imprimer que les feuilles nécessaires à chaque utilisateur
Il y a une extension qui fait parfaitement ce travail : https://forum.openoffice.org/fr/forum/v ... 18&t=32339
fneck
Membre OOrganisé
Membre OOrganisé
Messages : 50
Inscription : 07 janv. 2014 11:38

Re: [Calc]Export Pdf plage de cellules variable

Message par fneck »

1000 Merci Dude.je testerai Lundi pour voir si mes chers utilisateurs arrivent à l utiliser si tant est que je puisse installer des extensions OXT sur nos postes.
Si oui, je mettrai en résolu bien entendu.

:alerte: Alors le verdict: Malheureusement, cette extension qui pour ma part convient tout à fait (encore merci à Dude) ne sera pas exploitable par mes utilisateurs.
La sélection multiple n'étant pas des plus aisée pour eux (la navigation dans l'extension et les diverses possibilités pas d'avantage d'ailleurs).
Dude a écrit :Tu mélanges "impression" et "export" qui sont deux notions différentes.
J'ai modifié le titre en conséquence du coup.

Je vous joins un extrait du fichier
Extrait.ods
(18.92 Kio) Téléchargé 136 fois
les colonnes en jaune sont les seules que je souhaiterais conserver pour export en PDF en enregistrant l'export à l'endroit choisi par l'utilisateur (nom libre).
Celui-ci contient le code suivant que j'ai extrait d'ici https://forum.openoffice.org/fr/forum/v ... =8&t=37997, merci à Luky-Luke;

Code : Tout sélectionner

Sub Main
	dim document   as object
	dim dispatcher as object
	rem ----------------------------------------------------------------------
	rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	rem ----------------------------------------------------------------------
	dim args1(1) as new com.sun.star.beans.PropertyValue
	rem ----------------------------------------------------------------------
	dim args2(3) as new com.sun.star.beans.PropertyValue
	args2(0).Name = "URL"
	
	'filename = ConvertToURL(DlgExport.getControl("cheminText").Text)
	
	args2(0).Value = filename
	args2(1).Name = "FilterName"
	args2(1).Value = "calc_pdf_Export"
	args2(2).Name = "FilterData"
	args2(2).Value = Array(Array("UseLosslessCompression",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,50,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ReduceImageResolution",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarks",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTransitionEffects",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsSkipEmptyPages",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FormsType",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportFormFields",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerToolbar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerMenubar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerWindowControls",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ResizeWindowToInitialPage",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DisplayPDFDocumentTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Magnification",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Zoom",0,100,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PageLayout",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportLinksRelativeFsys",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DocumentOpenPassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PermissionPassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Selection",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE))
	args2(3).Name = "SelectionOnly"
	args2(3).Value = true
	
	dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args2())
	
	' Suppression de la zone d'impression décrite au dessus
	dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, array())
	
	' Sélection d'une cellule pour que cela fasse plus propre
	args1(1).Value = "$A$2:$A$2"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 1, args1())

end sub
Ce extrait de code (issu de la macro d'origine que vous pouvez trouver tout en haut de ce post) est parfaitement fonctionnel mais ne filtre pas la plage utile jusqu'à la dernière ligne (Jamais le même numéro de ligne)
J'ai aussi ce code qui fonctionnait avant sous pour sélectionner la plage utile jusuq'en dernière ligne et virer les colonnes superflues .

Code : Tout sélectionner

	' recherche de la dernière ligne
		macell2 = maFeuille2.getCellRangeByName("A1")
		oCursor = maFeuille2.createCursorByRange(macell2)
		oCursor.GotoEndOfUsedArea(True)
		aAddress = oCursor.RangeAddress
		fin = aAddress.EndRow + 1
		
		' on masque les colonnes Ne conserver que colonnes A G H L R S et T
		' Soit respectivement, N° CHO, Numéro , NOM, Code ACT, Montant global RAR, TOTAL DU , et enfin, Commentaires
		macell2 = maFeuille2.getCellRangeByName("B1:F1")
		macell2.Columns.IsVisible = False
		macell2 = maFeuille2.getCellRangeByName("I1:K1")
		macell2.Columns.IsVisible = False		
		macell2 = maFeuille2.getCellRangeByName("M1:Q1")
		macell2.Columns.IsVisible = False					

		nomStyleMaPage = maFeuille2.PageStyle
		stylesPage = mondoc.StyleFamilies.getByName("PageStyles")
		StyleMaPage = stylesPage.getByName(nomStyleMaPage)
		StyleMaPage.HeaderIsOn = False
		StyleMaPage.FooterIsOn = True
		StyleMaPage.PageScale = 100
Alors s'il vous plaît :fou: , une bonne âme pour fusionner ces 2 codes et je pourrai mettre en résolu.

Enfin Résolu via l'enregistreur de macros et plusieurs copier, collage spécial (conserver formats mais pas les formules).
Code hideux mais ça a le mérite de faire le job.
Merci à tous ceux qui ont tenté de m'aider.
Obligation de version libreoffice 6.2.7.1
windows 10 Pro
Verrouillé