[Résolu][Calc] Adaptation de la Hauteur des lignes

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
Alpha Beta
Fraîchement OOthentifié
Messages : 5
Inscription : 29 août 2013 19:29

[Résolu][Calc] Adaptation de la Hauteur des lignes

Message par Alpha Beta »

Bonjour,
Quand Open/Libre Office Ouvre un document de type classeur il adapte la hauteur des lignes. Il en fait autant quand il applique un collage spécial, un tri etc... Ce qui prend en général très peu de temps mais lorsque on manipule un csv de quelques dizaines de milliers de lignes, les quelques secondes de cette opération se font sentir. Ce qui est dommage quand on constate que la simple opération d'ouverture s'avère suffisante puisque dans mon contexte, l'affichage visuel des données n'a pas d'importance.

Voici un extrait de mon code utilisé sur environnement XP / sept pour ouvrir un csv me permettant d'ouvrir assez fluidement un gros csv :

Code : Tout sélectionner

		If InStr("txt,csv",LCase(GetFileNameExtension(ConvertFromUrl(ChemFichier),"\")))>0 Then
			ReDim Preserve Opt(1)
			Opt(0).Name = "FilterName"
			Opt(0).Value = "Text - txt - csv (StarCalc)"
			Opt(1).Name = "FilterOptions"
			'Opt(1).Value="59,34,0,1"
			Opt(1).Value="44,34,0,1"
			If J=1 Then	
				' nettoyage de Feuil
				LeCurseur = Feuil.CreateCursorByRange(Feuil.GetCellByPosition(0,0))
				LeCurseur.GotoEndOfUsedArea(True)
				With LeCurseur.RangeAddress
					DX0 = .EndColumn 
					DY0 = .EndRow    
				End With	
				Feuil.GetCellRangeByPosition(0,0,DX0,DY0).ClearContents(255)
				DY0=0
				Y=-1
			End If
			
			Clas1 =StarDesktop.LoadComponentFromURL( ChemFichier, "_blank", 0, Opt())
			Feuil1=Clas1.Sheets(0)
			LeCurseur = Feuil1.CreateCursorByRange(Feuil1.GetCellbyPosition(0,0))
			LeCurseur.GotoEndOfUsedArea(True)
			With LeCurseur.RangeAddress
				DX = .EndColumn 
				DY = .EndRow    
			End With
			' Récupère les données de Feuil1
			Plage = Feuil1.GetCellRangeByPosition(0,0,DX,DY)
			Contenu = Plage.GetDataArray()
			' Injection dans Feuil de ces données
			Y=DY0+1
			DY0=Y+DY
			Plage = Feuil.GetCellRangeByPosition(0,Y,DX,DY0)
			'casse les liens d'importation pour rendre FeuilF propiétaire de ces données
			Plage.setDataArray(Contenu())
			Clas1.Close(True)
		End If
De même il n'est pas rare qu'il me faille appliquer sur une plage de cellules des fonctions de calcul assez conséquentes. Par exemple un extrait de mon code :

Code : Tout sélectionner

	Zone=Feuil1.GetCellRangeByPosition(XD,YD,XF+6,YF)		
	' a transformation de la référence de cellule XD+1,YD en alpha XY
	' a1 la colonne Lettrée
	XY=Feuil1.GetCellByPosition(XD+1,YD).Columns.ElementNames(0)
	' a2 la ligne
	XY=XY & Split(Feuil1.GetCellByPosition(XD+1,YD).RowDescriptions(0)," ")(1)
	' b la colonne ANR en XF+1
	Feuil1.GetCellByPosition(XF+1,YD).FormulaLocal="=CNUM(DROITE(" & XY & ";4))"
	' c la colonne MoisR en XF+2
	Feuil1.GetCellByPosition(XF+2,YD).FormulaLocal="=CNUM(STXT(" & XY & ";4;2))"
	' d la colonne JourR en XF+3
	Feuil1.GetCellByPosition(XF+3,YD).FormulaLocal="=CNUM(GAUCHE(" & XY & ";2))"
	' e transformation de la référence de cellule XD+2,YD en alpha XY
	' e1 la colonne Lettrée
	XY=Feuil1.GetCellByPosition(XD+2,YD).Columns.ElementNames(0)
	' e2 la ligne
	XY=XY & Split(Feuil1.GetCellByPosition(XD+2,YD).RowDescriptions(0)," ")(1)
	' f la colonne HR en XF+4
	Feuil1.GetCellByPosition(XF+4,YD).FormulaLocal="=CNUM(GAUCHE(" & XY & ";2))"
	' g la colonne MR en XF+5
	Feuil1.GetCellByPosition(XF+5,YD).FormulaLocal="=CNUM(STXT(" & XY & ";4;2))"
	' h la colonne SR en XF+6
	Feuil1.GetCellByPosition(XF+6,YD).FormulaLocal="=CNUM(DROITE(" & XY & ";2))"
	' i étirage des formules de YD+1 à YF
	Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF).FillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)	
	' j Collage spécial de cette zone pour ne garder que les résultats et pas les fonctions
	Dim Dispatcher As Object
	Dispatcher =CreateUnoService("com.sun.star.frame.DispatchHelper")
	Clas.CurrentController.Select(Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF))
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:Copy", "", 0, Array())
	Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF).ClearContents(255)
	Dim args(5) As new com.sun.star.beans.PropertyValue
	args(0).Name = "Flags"
	args(0).Value = "V"
	args(1).Name = "FormulaCommand"
	args(1).Value = 0
	args(2).Name = "SkipEmptyCells"
	args(2).Value = false
	args(3).Name = "Transpose"
	args(3).Value = false
	args(4).Name = "AsLink"
	args(4).Value = false
	args(5).Name = "MoveMode"
	args(5).Value = 4
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:InsertContents", "", 0, args())
Là aussi l'adaptation de la hauteur des lignes s'exécute et mange du temps.

Je cherche depuis des lustres un moyen de bloquer l'adaptation de la hauteur des lignes . Si une âme compatissante passait par là ce serait sympa de m'éclairer.
Dernière modification par Oukcha le 07 sept. 2013 16:29, modifié 2 fois.
Raison : Mise en forme du code (bouton Code de la fenêtre d'édition) + balisage
Libre Office 4.0.5 et Open Office 4.0.0 sur XP Pro sept pro 64 et ToutouLinux
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 30 avr. 2011 23:08
Localisation : Casablanca (Maroc)

Re: [Calc] Adaptation de la Hauteur des lignes

Message par alhazred »

Bonsoir,

Dans un simple copier-coller, pour éviter l'adaptation de la hauteur des lignes, on commence par sélectionner toute la feuille réceptrice, puis menu Format > Lignes > Hauteur... et on indique la hauteur désirée.

Dans une macro, essaie d'ajouter, juste avant le transfert des données, la ligne

Code : Tout sélectionner

feuille.rows.optimalHeight = false
feuille étant bien sûr la feuille qui recevra les données (ton code étant incomplet, je n'ai pas testé).
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
Alpha Beta
Fraîchement OOthentifié
Messages : 5
Inscription : 29 août 2013 19:29

Re: [Calc] Adaptation de la Hauteur des lignes

Message par Alpha Beta »

:? Bonjour,

Je viens de tester OptimalHeight=False aussi bien sur une feuille entière que sur ma zone .... sans plus de succès!

Voici mon code en deux Sub .

Le premier (Test) me permet d'extraire des éléments bien précis pour des calculs ultérieurs. Malgré OptimalHeight=False je constate une adaptation des lignes .... non souhaitée.

Le second (JCSuperTri5) exerce mon tri et lui aussi fait appel à cette adaptation de lignes non souhaitée.

D'où (60 à 80 s d’exécution selon l'occupation de mes processeurs ... au lieu de quelques secondes. Dommage à moins que je bloque tout simplement l'affichage pendant mes calculs avec thisComponent.lockControllers et thisComponent.unlockControllers mais là non plus le gain n'est pas énorme à peine quelques secondes de moins.

Je reconnais que ma plage est immense mais bon ...

Code : Tout sélectionner

Sub Test
         thisComponent.lockControllers 
	 T0=Now
	 Dim Feuil1 As Object
	On Error Resume Next
	GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
	  On Error Goto 0	
	Clas=ThisComponent
	Feuil1=Clas.CurrentController.ActiveSheet
	XD=1
	YD=3
	XF=7
	YF=15219
	Zone=Feuil1.GetCellRangeByPosition(XD,YD,XF,YF)
	' font apparaître des mois différents. Pour cela  création d'une fonction qui va éclater
	' la colonne 3 contient des heures par exemple  '10:36:54 éclaté en trois colonnes AnR,MoisR,JourR
	' la colonne 4 contient  des dates par exemple ''12-07-2012 éclaté en trois colonnes HR,MR,SR
	' On substitue le tri normal avec un tri maison incluant FLUX,AnR,MoisR,JourR,HR,MR,SR
	' pour cela zone est étendue de 6 colonnes
	Zone=Feuil1.GetCellRangeByPosition(XD,YD,XF+6,YF)
	Zone.rows.OptimalHeight=False		
	' a transformation de la référence de cellule XD+1,YD en alpha XY
	' a1 la colonne Lettrée
	XY=Feuil1.GetCellByPosition(XD+1,YD).Columns.ElementNames(0)
	' a2 la ligne
	XY=XY & Split(Feuil1.GetCellByPosition(XD+1,YD).RowDescriptions(0)," ")(1)
	' b la colonne ANR en XF+1
	Feuil1.GetCellByPosition(XF+1,YD).FormulaLocal="=CNUM(DROITE(" & XY & ";4))"
	' c la colonne MoisR en XF+2
	Feuil1.GetCellByPosition(XF+2,YD).FormulaLocal="=CNUM(STXT(" & XY & ";4;2))"
	' d la colonne JourR en XF+3
	Feuil1.GetCellByPosition(XF+3,YD).FormulaLocal="=CNUM(GAUCHE(" & XY & ";2))"
	' e transformation de la référence de cellule XD+2,YD en alpha XY
	' e1 la colonne Lettrée
	XY=Feuil1.GetCellByPosition(XD+2,YD).Columns.ElementNames(0)
	 ' e2 la ligne
	XY=XY & Split(Feuil1.GetCellByPosition(XD+2,YD).RowDescriptions(0)," ")(1)
	' f la colonne HR en XF+4
	Feuil1.GetCellByPosition(XF+4,YD).FormulaLocal="=CNUM(GAUCHE(" & XY & ";2))"
	' g la colonne MR en XF+5
	Feuil1.GetCellByPosition(XF+5,YD).FormulaLocal="=CNUM(STXT(" & XY & ";4;2))"
	' h la colonne SR en XF+6
	Feuil1.GetCellByPosition(XF+6,YD).FormulaLocal="=CNUM(DROITE(" & XY & ";2))"
	' i étirage des formules de YD+1 à YF
	Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF).FillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)
	' j Collage spécial de cette zone pour ne garder que les résultats et pas les fonctions
	Dim Dispatcher As Object
	Dispatcher =CreateUnoService("com.sun.star.frame.DispatchHelper")
	Clas.CurrentController.Select(Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF))
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:Copy", "", 0, Array())
	Feuil1.GetCellRangeByPosition(XF+1,YD,XF+6,YF).ClearContents(255)
	Dim args(5) As new com.sun.star.beans.PropertyValue
	args(0).Name = "Flags"
	args(0).Value = "V"
	args(1).Name = "FormulaCommand"
	args(1).Value = 0
	args(2).Name = "SkipEmptyCells"
	args(2).Value = false
	args(3).Name = "Transpose"
	args(3).Value = false
	args(4).Name = "AsLink"
	args(4).Value = false
	args(5).Name = "MoveMode"
	args(5).Value = 4
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:InsertContents", "", 0, args())		
	'JCSuperTri2(Zone,Array(5,6,XF+1,XF+2,XF+3,XF+4,XF+5,XF+6)) ' le mieux
	JCSuperTri5(Zone,Array(5,6,XF+1,XF+2,XF+3,XF+4,XF+5,XF+6)) 
	msgbox DateDiff("s",T0,Now) & " seconde(s)"
        thisComponent.unlockControllers
End Sub

Code : Tout sélectionner

Sub JCSuperTri5(Zone As Object,XTri As Array) 
	' fait le 29 Août 2013 par JC PAU
	If IsMissing(XTri) Then Exit Sub
	Dim QTri As Integer
	QTri=Ubound(XTri)
	If QTri<0 Then Exit Sub
	If IsNull(Clas) Then Clas=ThisComponent
	Dim AMax As Integer
	Dim args(5) As new com.sun.star.beans.PropertyValue
	Dim ATri As String
	Dim ConfigTri(0) As New com.sun.star.table.TableSortField
	Dim Descriptri As Variant
	Dim Dispatcher As Object
	Dim FTri As Object ' Feuille concernant le tri
	Dim T As String
	Dim Tri As Integer
	Dim XD As Integer
	Dim XF As Integer
	Dim Y As Double
	Dim YD As Double
	Dim YF As Double
	Dim YTaille As Integer
	Dispatcher =CreateUnoService("com.sun.star.frame.DispatchHelper")
	args(0).Name = "Flags"
	args(0).Value = "S"
	args(1).Name = "FormulaCommand"
	args(1).Value = 0
	args(2).Name = "SkipEmptyCells"
	args(2).Value = false
	args(3).Name = "Transpose"
	args(3).Value = false
	args(4).Name = "AsLink"
	args(4).Value = false
	args(5).Name = "MoveMode"
	args(5).Value = 4	
	With Zone.RangeAddress
		XF=.EndColumn
		YF=.EndRow
		FTri=Clas.Sheets.GetByIndex(.Sheet)
		XD=.StartColumn
		YD=.StartRow
	End With
	With ConfigTri(0)
		.Field=XF+2-XD ' la colonne sur laquelle le tri va s'exercer 
		.IsAscending=True
	End With	
	' relevage lettré de chaque abcisse de Tri ATri
	T="=""'"""
	For Each Tri  In XTRi
		ATri=FTri.GetCellByPosition(Tri,YD).Columns.ElementNames(0)
		AMax=0
		'Nombre de caractères contenus dans chaque cellule de la colonne de YD à YF
		For Y=YD To YF
			YTaille=Len(FTri.GetCellByPosition(Tri,Y).String)
			If AMax<YTaille Then AMax=YTaille
		Next Y
		T=T & " & Texte(" & ATri & (YD+1) & ";" & Chr(34) & String(AMax,"0") & Chr(34) & ")"
	Next Tri
	' Formule de calcul appliquée sur la colonne XF+2 de YD à YF contenant les conditions de tri
	' sous forme de données en collage spécial pour ne pas conserver les formules de calculs
	FTri.GetCellByPosition(XF+2,YD).FormulaLocal=T
	FTri.GetCellRangeByPosition(XF+2,YD,XF+2,YF).FillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)
	' transformation de la colonne XF+2 de YD à YF en pur string
	Clas.CurrentController.Select(FTri.GetCellRangeByPosition(XF+2,YD,XF+2,YF))
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:Copy", "", 0, Array())
	FTri.GetCellRangeByPosition(XF+2,YD,XF+2,YF).ClearContents(255)
	Dispatcher.executeDispatch(Clas.CurrentController.Frame, ".uno:InsertContents", "", 0, args())
	' application du tri de l'ensemble XD,YD,XF+2,YF via la colonne XF+2
	Descriptri=FTri.GetCellRangeByPosition(XD,YD,XF+2,YF).CreateSortDescriptor()
	Descriptri(0).Name="SortFields"
	Descriptri(0).Value=Configtri()
	Descriptri(1).Name="IsSortColumns"
	Descriptri(1).Value=False
	Descriptri(2).Name="CopyOutputData"
	Descriptri(2).Value=False
	Descriptri(3).Name="IsUserListEnabled"
	Descriptri(3).Value=False
	Descriptri(4).Name="BindFormatsToContent"
	Descriptri(4).Value=False
	Descriptri(5).Name="ContainsHeader"
	Descriptri(5).Value=False
	FTri.GetCellRangeByPosition(XD,YD,XF+2,YF).Sort(Descriptri())
End Sub
Dernière modification par micmac le 01 sept. 2013 05:26, modifié 2 fois.
Raison : Mise en [code]
Libre Office 4.0.5 et Open Office 4.0.0 sur XP Pro sept pro 64 et ToutouLinux
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9835
Inscription : 28 août 2010 08:45

Re: [Calc] Adaptation de la Hauteur des lignes

Message par micmac »

Bonjour,

Pour insérer du code dans un message, veuillez (re)lire le message suivant :
Améliorer la lisibilité d'un message : les balises BBCode
[b][color=#BF0000]papayes[/color][/b] a écrit : Les Boutons-balises du BBCode se trouvent au-dessus du Cadre-texte du Message en cours d'écriture.
Boutons des Balises du BBCode.png
Déplacer le curseur sur cette ligne de Boutons-balises fait apparaître leur fonction en infobulle et leur syntaxe :
Image

Procédure d'utilisation :
  1. Sélectionnez à la souris la zone à baliser,
  2. Cliquez sur un Bouton-balise.
Cela ajoute en début de la sélection la balise [balise] correspondante
et en fin de sélection sa balise finale [/balise] marquée par un slash /.

Vous ne verrez leur effet qu'en cliquant sur le bouton Prévisualiser
puis,
une fois toutes les améliorations apportées,
ne pas oublier de cliquer sur le bouton Envoyer pour les valider.
Merci
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
Avatar de l’utilisateur
Alpha Beta
Fraîchement OOthentifié
Messages : 5
Inscription : 29 août 2013 19:29

Re: [Calc] Adaptation de la Hauteur des lignes

Message par Alpha Beta »

Bonjour,

Désolé je découvre les possibilités de ce forum au demeurant plutôt fort sympathique et très dynamique! :super:
Libre Office 4.0.5 et Open Office 4.0.0 sur XP Pro sept pro 64 et ToutouLinux
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 30 avr. 2011 23:08
Localisation : Casablanca (Maroc)

Re: [Calc] Adaptation de la Hauteur des lignes

Message par alhazred »

Bonjour,

Plutôt que des macros séparées, il vaudrait mieux pour tester joindre un classeur effectif ainsi qu'un exemple abrégé du csv utilisé (bien sûr, sans données "sensibles").

Donne également une description précise de ce que tu souhaites faire, car tes macros sont tout sauf faciles à analyser (noms de variables, décomposition en sous-macros...).
 Ajout : À mon avis, une grande partie du ralentissement est due à la partie 'Nombre de caractères contenus dans chaque cellule de la colonne de YD à YF
Je n'arrive pas à voir à quoi elle sert, et comme elle consulte les cellules une à une...
Ensuite, tu traduis les données numériques en chaînes, comme s'il n'était pas possible de trier des nombres ???? 
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

Re: [Calc] Adaptation de la Hauteur des lignes

Message par bm92 »

Bonjour,
Solution vue sur la version anglaise du forum :

Code : Tout sélectionner

ThisComponent.IsAdjustHeightEnabled = False
' . . . faites votre cuisine . . .
ThisComponent.IsAdjustHeightEnabled = True
Cette propriété a été introduite en version 3.0.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial
Avatar de l’utilisateur
Alpha Beta
Fraîchement OOthentifié
Messages : 5
Inscription : 29 août 2013 19:29

Re: [Calc] Adaptation de la Hauteur des lignes

Message par Alpha Beta »

Bonjour,

Un très grand merci !

C'est exactement ce que je cherchais, je gagne ainsi facilement 10 secondes de traitement ! :super:
Libre Office 4.0.5 et Open Office 4.0.0 sur XP Pro sept pro 64 et ToutouLinux