[Résolu][Calc] - Contenu d'un répertoire

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 !

[Résolu][Calc] - Contenu d'un répertoire

Messagepar stanol69 » 08 Juil 2018 16:58

Bonjour,

But recherché : Lister tous les fichiers contenus dans un répertoire (si possible, y compris ceux figurant dans les sous-répertoires) et restituer sur feuille comportant 3 colonnes :
A-Nom du fichier (chemin complet non indispensable)
B-Taille du fichier en Octets
C-Date de modification du fichier

Ecueil : je me suis inspiré des divers fils, notamment celui du suprême https://forum.openoffice.org/fr/forum/viewtopic.php?p=67689#p67689. La solution proposée par alhazred le 29/11/2012 liste parfaitement le nom de chacun des fichiers présents à la racine du répertoire choisi en commençant la restitution en cellule A2.
Je souhaite que figure en B2 la taille du fichier et en C2 la date de modification du fichier.
Naïvement, après le :
MaFeuille.getCellByPosition(0,x).string = Direction
j'ai souhaité insérer
MaFeuille.getCellByPosition(1,x).value = Direction.Size
ou
MaFeuille.getCellByPosition(2,x).value = Direction.DateLastModified.Value

Bien évidemment, j'ai des messages d'erreur. Ce que je n'arrive pas à faire (par manque de compréhension du code pompé), c'est définir comme un fichier chaque élément restitué (pour en extraire ses propriétés : .Size et .DateLastModified.Value)

Et s'il y a moyen que la procédure aille gratouiller tous les sous-répertoires de la même façon, je suis preneur ! (Ce n'est pas la priorité, mais ce serait un plus appréciable ! :D )
Merci beaucoup

Code : Tout sélectionner   AgrandirRéduire
'Cette macro va lister sous calc le contenu d'un répertoire
'Philippe Bronchart 2008 (modifications par alhazred, signalées par ***)

Sub Listerunrepertoire

   Dim MonDoc as object, Mesfeuilles as object, MaFeuille as object
   Dim Dossier As object ,  Valeur As Integer , lerep as string, Ocurseur as object
   Dim Direction As string , Resultat As String
   
   MonDoc = ThisComponent 'Sélectionne le document en cours
   MesFeuilles=MonDoc.sheets ' les feuilles du classeur
   MaFeuille = Mesfeuilles.GetByName("feuille1")' la feuille1
   
   'la boite de dialogue pour choisir le dossier     
   Dossier = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker") 'création du service sélection d'un fichier
   Valeur = Dossier.Execute()
   
   'si il y au moins un choix
   If Valeur = 1 Then lerep=ConvertFromUrl(Dossier.getDirectory()) Else Exit Sub '*** on convertit l'URL, sinon on ne fait rien
   
   'on fabrique le chemin de direction
   Direction=dir((lerep)&"\*",0) '*** tous les fichiers du répertoire   
   'Direction=dir((lerep)&"\*.ods",0) '*** seulement les classeurs .ods
   'Direction=dir((lerep)&"\*",16) '*** seulement les sous-répertoires

   'on fait une boucle tant qu'il il y a des fichiers
   oCurseur = MaFeuille.createCursor  '*** création du curseur avant la boucle (inutile de répéter)
   x = 1  '*** si on veut commencer en ligne 2
   Do While Len(Direction) > 0   
      MaFeuille.getCellByPosition(0,x).string = Direction     ' on écrit en A2 feuille1 (0,X) où x = 1 au départ puis 2 3 4 5 .....
      X=X+1 ' on ajoute 1 à X
      Direction=Dir() '*** élément suivant
   Loop ' on boucle

End Sub
Dernière édition par stanol69 le 09 Juil 2018 22:23, édité 1 fois.
LibreOffice 4.3- c'est la version imposée au travail
LibreOffice 5.4.5.1 à la maison
Windows 10
stanol69
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Juin 2015 22:14

Re: [Calc] - Contenu d'un répertoire

Messagepar Jurassic Pork » 09 Juil 2018 06:20

hello,
en utilisant l'extension LibreOffice - Openoffice EasyDev voici une macro basic qui permet de réaliser ce que tu veux faire :

Code : Tout sélectionner   AgrandirRéduire
Sub RecupFicRep()
Dim Dossier As object ,  Valeur,x As Integer , lerep as string
Dim Direction,FileSousRep As string , Resultat As String
Dim util,address,cell,files as object
'la boite de dialogue pour choisir le dossier     
Dossier = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker") 'création du service sélection d'un fichier
Valeur = Dossier.Execute()
'si il y au moins un choix
If Valeur = 1 Then lerep=ConvertFromUrl(Dossier.getDirectory()) Else Exit Sub '*** on convertit l'URL, sinon on ne fait rien
util = createUnoService("org.universolibre.EasyDev")
address = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")
'on récupère la cellule active
address.Current = True
cell = util.getCell(address)
'On récupère tous les fichiers du répertoire et des sous-répertoires
files = util.getFiles(lerep, "")
' util.msgbox(files)
x = 0
'on crée un tableau avec nom de fichier, date, time par élément
dim tabfile(UBound(files)) as Variant
For  each elem in files
tabfile(x) = Array(elem,FileDateTime(elem),FileLen(elem))
x = x+1
Next elem
'on transfert le tableau dans la feuille excel à partir de la cellule active
util.setData(cell,tabfile)
End Sub

La macro récupère d'abord tous les fichiers (même ceux des sous-répertoires) à partir du répertoire choisi, grâce à la fonction getfiles de l'extension EasyDev.
Ensuite on balaie tous les fichiers et on crée un tableau avec 3 chaînes par élément.
A la fin, on transfert le tableau créé à partir de la cellule active de la feuille calc. Un transfert est toujours beaucoup plus rapide qu'une écriture cellule par cellule.
Voici ce que j'obtiens :
EasyDev - LibreOffice Calc.png

Environ 2 secondes pour exécuter la macro pour plus de 2000 fichiers.

Ami calmant, J.P
LibreOffice 6.1.x sous windows 10 et LibreOffice 6.0.x sous linux - OpenOffice 4.1.5 sous windows 10
Avatar de l’utilisateur
Jurassic Pork
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 202
Inscrit le : 09 Août 2017 23:15

Re: [Calc] - Contenu d'un répertoire

Messagepar stanol69 » 09 Juil 2018 17:47

Bonjour,
Et tout d'abord, merci ! Je me suis installé EasyDev, la macro marche du feu de dieu ! A peine une dizaine de secondes pour environ 9500 fichiers. C'est exactement ce que je veux.

Par contre, j'ai un souci : je ne peux malheureusement pas installer EasyDev au travail :x et le projet sur lequel je travaille est destiné au bureau pour un certain nombre d'utilisateurs (dont moi) qui ne pourront pas non plus installer EasyDev.

Existerait-il malgré tout une solution réalisée avec les paramètres "classiques" de LibreOffice Basic (même si le déroulement doit être plus long) ?
LibreOffice 4.3- c'est la version imposée au travail
LibreOffice 5.4.5.1 à la maison
Windows 10
stanol69
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Juin 2015 22:14

Re: [Calc] - Contenu d'un répertoire

Messagepar Hubert Lambert » 09 Juil 2018 21:32

Bonjour,

Ci-joint une version en "pur basic". Il y a évidemment matière à améliorer, mais je te laisse ce soin :) .
Le code :
Code : Tout sélectionner   AgrandirRéduire
dim files()

sub main
    folderpicker = createUnoService("com.sun.star.ui.dialogs.FolderPicker")
    if folderpicker.execute() = 0 then exit sub
    rep = folderpicker.Directory
    doc = thiscomponent
    sheet = doc.CurrentController.ActiveSheet
    startcol = 0
    startrow = 1
    sheet.getCellRangeByPosition(startcol, startrow, startcol+2, 5000).clearContents(31)
    listfiles(rep)
    range = sheet.getCellRangeByPosition(startcol, startrow, startcol+2, ubound(files)+startrow)
    range.setFormulaArray(files)
end sub

sub listfiles(rep)
    sfa = createUnoService("com.sun.star.ucb.SimpleFileAccess")
    content = sfa.getFolderContents(convertToUrl(rep), True)
    for each elem in content
        if sfa.isFolder(elem) then
            listfiles(elem)
        else
            D = sfa.getDateTimeModified(elem)
            datemodified = D.Day & "/" & D.Month & "/" & D.Year & " " & D.Hours & ":" & D.Minutes & ":" & D.Seconds
            x = ubound(files) +1
            redim preserve files(x)
            files(x) = array(convertFromUrl(elem), sfa.getSize(elem), datemodified)
        end if
    next elem
end sub

Cordialement.
Pièces jointes
stanol69.ods
(11.55 Kio) Téléchargé 15 fois
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 989
Inscrit le : 06 Avr 2016 08:26

Re: [Résolu][Calc] - Contenu d'un répertoire

Messagepar stanol69 » 09 Juil 2018 22:29

Bonsoir,
Ca correspond là-aussi exactement à ce que je voulais.
Merci beaucoup à tous les 2 pour votre aide précieuse.
Cordialement,
LibreOffice 4.3- c'est la version imposée au travail
LibreOffice 5.4.5.1 à la maison
Windows 10
stanol69
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Juin 2015 22:14

Re: [Résolu][Calc] - Contenu d'un répertoire

Messagepar Jurassic Pork » 10 Juil 2018 06:47

hello,
en essayant la macro d'H.L, je me suis aperçu que j'avais un problème dans ma macro : il y avait moins de fichiers trouvés avec ma macro. Le problème vient de la fonction d'EasyDev getFiles qui fait un filtre systématique de type .* si bien que je ne récupère pas les fichiers sans extension ( exemple : README).
Ami calmant, J.P
LibreOffice 6.1.x sous windows 10 et LibreOffice 6.0.x sous linux - OpenOffice 4.1.5 sous windows 10
Avatar de l’utilisateur
Jurassic Pork
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 202
Inscrit le : 09 Août 2017 23:15


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 5 invité(s)