Page 1 sur 1

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

Publié : 14 juin 2019 10:18
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.

Re: [Calc]créer et visualiser Pdf

Publié : 14 juin 2019 11:14
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.

Re: [Calc]Export Pdf plage de cellules variable

Publié : 14 juin 2019 11:35
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

Re: [Calc]Choix imprimante Pdf

Publié : 14 juin 2019 12:25
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.

Re: [Calc]Export Pdf plage de cellules variable

Publié : 14 juin 2019 15:01
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: 

Re: [Calc]Choix imprimante Pdf

Publié : 14 juin 2019 17:04
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

Re: [Calc]Export Pdf plage de cellules variable

Publié : 15 juin 2019 16:40
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.