[Résolu][Calc] Exporter en PDF les feuilles d'un classeur

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 !
Avatar de l’utilisateur
Sharo Lley
Membre cOOnverti
Membre cOOnverti
Messages : 303
Inscription : 09 juin 2008 14:23

[Résolu][Calc] Exporter en PDF les feuilles d'un classeur

Message par Sharo Lley »

Bonjour,
N'y connaissant quasiment rien en Macro OOo, j'ai profité d'une demande spécifique pour me jeter à l’eau.

Le but, ... exporter chacune des feuilles d'un classeur dans un PDF spécifique.
J'ai fait des recherche, testé les solutions déjà proposées mais impossible d'obtenir le bon résultat... même en utilisant l'option du "DataFilter" & "PageRange".
Je me suis donc orienté sur les zone d'impressions et ai écrit une macro qui fait pil-poil ce qu'on lui demande (en supprimant les Zone d'Impressions définies dans le document, néammoins) (Voir "Code1").
Je me suis dis que ce serait intéressant de l'améliorer en permettant de faire l'export en PDF des onglets sélectionnés.
... Et c'est là que mon incompétence me pose problème.

Le code semble fonctionner (Voir Code2). Mais en faisant quelques test lors du nettoyage de celui-ci je me suis rendu compte qu’il plantait sur les onglets dont le nom comporte des espaces.
Cela ce produit uniquement sur une sélection multiple. Un onglet unique comportant des espaces est exporté correctement.
J’en conclu que le problème provient de la récupération du nom des onglets à partir du tableau TableauOnglets() … mais je cale. :fou:

Si l’un d’entre vous à une solution, ce serait sympa.

A noter : il y a du Pierre-yves, du Churay, et d’autre Inside... merci à eux ;)

PS : j’ai également jeté un oeil sur GetPrintData dans le but de récupérer les zone d’impression existantes afin de les remettre en place en fin de macro, mais j’ai fait chou blanc :marto:

Code1 :

Code : Tout sélectionner

'Cette macro exporte chacune des feuilles d'un classeur dans un fichier PDF spécifique.
'Ce PDF est enregistré dans le même dossier que le classeur (Le fichier Calc doit être préalablement enregistré).
'Le nom de ces PDF est constitué du nom du classeur suivi du nom de la feuille.

'ATTENTION ! cette macro supprime les zones d'impressions existantes.

Option Explicit

Private NomFeuille as string

'-----------------------------------------------------
Sub Export_Feuilles_Vers_PDF
		
Dim oDoc As Object
Dim NbFeuille as variant
	Dim x as integer
		Dim NumFeuille as string
  			Dim Feuille As Object
  			Dim Curseur As Object
  			Dim Cible As Object
  			Dim ZoneImpr(0) as New com.sun.star.table.CellRangeAddress 

oDoc=ThisComponent
NbFeuille=oDoc.Sheets.Count

	For x=0 to NbFeuille-1
	
	'suppression de toutes les zones d'impression du classeur.
	'appel "sub PysRazZoneImprmpr"
		PysRazZoneImpr
	
		'Numfeuille=val(x+1)
		Numfeuille=x+1
		NomFeuille=oDoc.sheets(x).getname	
					
			'----------Definition de la zone d'impression pour la feuille en cours
			Feuille = ThisComponent.Sheets.getByIndex(x) 

			Curseur = Feuille.createCursor()
   
   			Curseur.gotoStartOfUsedArea(False) 
	  		Curseur.gotoEndOfUsedArea(True) 
   			Cible = Curseur.getRangeAddress()
   			
   			With ZoneImpr(0)
			.Sheet = Numfeuille
			.StartColumn = Cible.StartColumn
			.StartRow = Cible.StartRow
			.EndColumn = Cible.EndColumn
			.EndRow = Cible.EndRow
			End With
			ThisComponent.Sheets.getByName(NomFeuille).setPrintAreas(ZoneImpr())
			
		'export PDF
		'Appel de "Export_Calc_Vers_PDF"
		Export_Calc_Vers_PDF

	next x
	PysRazZoneImpr
End Sub
'-----------------------------------------------------

'-----------------------------------------------------
sub PysRazZoneImpr
dim PysFeuille as object

for each PysFeuille in thiscomponent.sheets
       PysFeuille.PrintAreas = array()
next PysFeuille

end sub
'-----------------------------------------------------

'-----------------------------------------------------
Sub Export_Calc_Vers_PDF
dim ArgsProprietes(2) as new com.sun.star.beans.PropertyValue 
dim Fichier as string 
dim oDoc as object 

'Indique le nom de la sauvegarde au format pdf.
'Nom du classeur + nom de la feuille
'(Le fichier pdf sera cré dans le même répertoire que le classeur.)
	Fichier = Left( ThisComponent.URL , Len(ThisComponent.URL) - 4 ) & "-" & NomFeuille & ".pdf"

'--- Spécifie le filtre de conversion ---
ArgsProprietes(0).Name = "FilterName" 
ArgsProprietes(0).Value = "calc_pdf_Export" 
ArgsProprietes(1).Name = "CompressMode"
ArgsProprietes(1).Value = 1 
 
'--- exporte au format PDF ---
ThisComponent.storeToUrl( Fichier , ArgsProprietes()) 
End Sub
'-----------------------------------------------------
Code 2 :

Code : Tout sélectionner

'Cette macro exporte chacune des feuilles sélectionnées d'un classeur dans un fichier PDF spécifique.
'Ce PDF est enregistré dans le même dossier que le classeur (Le fichier Calc doit être préalablement enregistré).
'Le nom de ces PDF est constitué du nom du classeur suivi du nom de la feuille.

'ATTENTION ! cette macro supprime toutes les zones d'impressions existantes dans ce classeur.

Option Explicit

Private NomFeuille as string
Private NumFeuille as integer
'-----------------------------------------------------
Sub Export_Feuilles_Selectionnees_vers_PDF()
  Dim OngletsSelectionnes As String
  Dim TableauOnglets() As String
  Dim i As Integer
  Dim Cible As Object
  Dim Collect As New Collection
  Dim NomFeuilleSel As String
  
  Cible = ThisComponent.CurrentController

  If Cible.Selection.supportsService("com.sun.star.sheet.SheetCellRanges")  Then
    'S'il y a plusieurs feuilles de sélectionnées.
    OngletsSelectionnes  = ThisComponent.CurrentSelection.RangeAddressesAsString
    'msgbox OngletsSelectionnes
    TableauOnglets() = Split( OngletsSelectionnes , ";" )

    On Error Resume Next
    For i = 0 To UBound (TableauOnglets())
       NomFeuilleSel = Left( TableauOnglets( i ) , Instr( 1 , TableauOnglets( i ) , "." ) - 1 )
       'Récupère le nom des feuilles sans doublon
       Collect.Add NomFeuilleSel , Cstr(NomFeuilleSel)
    Next i
    On Error GoTo 0

    For i = 1 To Collect.Count
		'MsgBox Collect(i)
		NomFeuille=Collect(i)	      
		'Numfeuille=thisComponent.Sheets.getByName(NomFeuille).getCellRangeByName("A1").RangeAddress.Sheet
		Numfeuille=thisComponent.Sheets.getByName(Collect(i)).RangeAddress.Sheet
		Export_Feuilles_Vers_PDF
    Next
    
  Else
    'S'il y a une seule feuille de sélectionnée.
    	Numfeuille=thisComponent.CurrentController.ActiveSheet.RangeAddress.Sheet
    	NomFeuille=thisComponent.sheets(Numfeuille).getname
		Export_Feuilles_Vers_PDF
  End If
End Sub
'-----------------------------------------------------
'-----------------------------------------------------
Sub Export_Feuilles_Vers_PDF
		
Dim oDoc As Object
	Dim x as integer
  			Dim Feuille As Object
  			Dim Curseur As Object
  			Dim Cible As Object
  			Dim ZoneImpr(0) as New com.sun.star.table.CellRangeAddress 

oDoc=ThisComponent

	'suppression de toutes les zones d'impression du classeur.
	'appel "sub PysRazZoneImprmpr"
		PysRazZoneImpr
			
			'----------Definition de la zone d'impression pour la feuille en cours
			Feuille = ThisComponent.Sheets.getByIndex(Numfeuille) 

			Curseur = Feuille.createCursor()
   
   			Curseur.gotoStartOfUsedArea(False) 
	  		Curseur.gotoEndOfUsedArea(True) 
   			Cible = Curseur.getRangeAddress()
   			
   			With ZoneImpr(0)
			.Sheet = Numfeuille
			.StartColumn = Cible.StartColumn
			.StartRow = Cible.StartRow
			.EndColumn = Cible.EndColumn
			.EndRow = Cible.EndRow
			End With
			ThisComponent.Sheets.getByName(NomFeuille).setPrintAreas(ZoneImpr())
			
		'export PDF
		'Appel de "Export_Calc_Vers_PDF"
		Export_Calc_Vers_PDF
End Sub
'-----------------------------------------------------

'-----------------------------------------------------
sub PysRazZoneImpr
dim PysFeuille as object

for each PysFeuille in thiscomponent.sheets
       PysFeuille.PrintAreas = array()
next PysFeuille

end sub
'-----------------------------------------------------

'-----------------------------------------------------
Sub Export_Calc_Vers_PDF
dim ArgsProprietes(2) as new com.sun.star.beans.PropertyValue 
dim Fichier as string 
dim oDoc as object 

'Indique le nom de la sauvegarde au format pdf.
'Nom du classeur + nom de la feuille
'(Le fichier pdf sera cré dans le même répertoire que le classeur.)
	Fichier = Left( ThisComponent.URL , Len(ThisComponent.URL) - 4 ) & "-" & NomFeuille & ".pdf"

'--- Spécifie le filtre de conversion ---
ArgsProprietes(0).Name = "FilterName" 
ArgsProprietes(0).Value = "calc_pdf_Export" 
ArgsProprietes(1).Name = "CompressMode"
ArgsProprietes(1).Value = 1 
 
'--- exporte au format PDF ---
ThisComponent.storeToUrl( Fichier , ArgsProprietes()) 
End Sub
'-----------------------------------------------------
 Ajout : 
Bidouille a écrit :... En plus du code, fournissez avec un fichier complet....
ah ben vi... ça peut être une bonne idée en effet... sorry :oops:
Macro Export FeuillesToPDF.ods
... tant que l'on garde à l'esprit que la macro n'est pas destinée à être dans un document ;) 
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Sharo Lley le 11 févr. 2012 16:06, modifié 5 fois.
OpenOffice 3.1.1 -Windows XP/2000 (travail)
Apache OpenOffice 4.1.1 - LibreOffice 4.4.2.1 - Windows XP pro SP3 / Vista64
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26128
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Exporter en PDF les feuilles d'un classeur

Message par Dude »

Salut,

Pas le temps de tout regarder mais tu extraits mal le nom des feuilles :

Code : Tout sélectionner

NomFeuilleSel = Left( TableauOnglets( i ) , Instr( 1 , TableauOnglets( i ) , "." ) - 1 )
Cela renvoie par exemple une chaîne contenant :

Code : Tout sélectionner

'prem''s'
Avatar de l’utilisateur
DLE
HédOOniste
HédOOniste
Messages : 1514
Inscription : 30 déc. 2007 18:56
Localisation : Lille

Re: [Calc] Exporter en PDF les feuilles d'un classeur

Message par DLE »

Bonjour,

Si le nom de l'onglet comporte des blancs, ce nom est entouré de quotes dans "OngletsSelectionnes" et/ou si il comporte une quote (ex. prem's) la quote est doublée.

Ci-joint le fichier avec la macro modifiée.

A+
MacOS Tahoe 26.1 (iMac-M4) : AOO 4.1.16 , LibreOffice 25.2.7.2, Adoptium-temurinJDK 1.8.0_402, CCC, FireFox, Thunderbird, ORB 1.2.1
Parallel Desktop = Windows 11 & MacOS : AOO, Libreoffice.
Avatar de l’utilisateur
Sharo Lley
Membre cOOnverti
Membre cOOnverti
Messages : 303
Inscription : 09 juin 2008 14:23

Re: [Calc] Exporter en PDF les feuilles d'un classeur

Message par Sharo Lley »

Meuh ;)

Bien vu !, ... merci à tous les deux !

Dans la même veine, ... je me rends compte qu'il va falloir que je gère aussi le remplacement des caractères non-compatibles avec des noms de fichiers dans le nom des onglets (",|,*,?,...) ... si je veux garder le nommage en utilisant le nom des feuilles.
 Ajout : Avant de mettre en [résolu], ... je vais faire une pause pour me reposer les neurones.
En attendant ...
Sharo Lley a écrit :PS : j’ai également jeté un oeil sur GetPrintData dans le but de récupérer les zone d’impression existantes afin de les remettre en place en fin de macro, mais j’ai fait chou blanc :marto:
...si quelqu'un à un petit lien avec un exemple, ... je suis preneur. 
OpenOffice 3.1.1 -Windows XP/2000 (travail)
Apache OpenOffice 4.1.1 - LibreOffice 4.4.2.1 - Windows XP pro SP3 / Vista64
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc] Exporter en PDF les feuilles d'un classeur

Message par Churay »

Bonsoir

La propriété PrintAreas est définie pour chaque feuille.

Ce qui veut dire que pour chaque feuille, tu dois la récupérer et l'analyser :

Code : Tout sélectionner

	oSht = thisComponent.Sheets(n) ' pour une feuille donnée
	oPrtArea = oSht.PrintAreas
oPrtArea est de type com.sun.star.table.CellRangeAddress

- soit il n'y a qu'une zone d'impression dans la feuille et le RangeAddress est accessible dans oPrtArea(0),
- soit il y a plusieurs zones d'impression dans la feuille et les RangeAddress sont accessibles dans oPrtArea(0) à oPrtArea(n).

x fois pour x feuilles...

J'espère être clair.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Sharo Lley
Membre cOOnverti
Membre cOOnverti
Messages : 303
Inscription : 09 juin 2008 14:23

Re: [Calc] Exporter en PDF les feuilles d'un classeur

Message par Sharo Lley »

Bonsoir,
Churay a écrit :... J'espère être clair.
Vi, je vois comment ça marche... enfin ... sur le principe en tout cas ;).
Y'a pu qu'à !

merci bien
OpenOffice 3.1.1 -Windows XP/2000 (travail)
Apache OpenOffice 4.1.1 - LibreOffice 4.4.2.1 - Windows XP pro SP3 / Vista64