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
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())
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.