[Résolu][Calc] Contenu répertoire et de ses sous-répertoires

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 !
stanol69
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 04 juin 2015 21:14

[Résolu][Calc] Contenu répertoire et de ses sous-répertoires

Message par stanol69 »

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/v ... 689#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

'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 modification par stanol69 le 09 juil. 2018 21:23, modifié 1 fois.
LibreOffice 4.3- c'est la version imposée au travail
LibreOffice 5.4.5.1 à la maison
Windows 10
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

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

Message par Jurassic Pork »

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

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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
stanol69
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 04 juin 2015 21:14

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

Message par stanol69 »

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
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

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

Message par Hubert Lambert »

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

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
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)
stanol69
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 04 juin 2015 21:14

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

Message par stanol69 »

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
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

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

Message par Jurassic Pork »

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 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Plob
Fraîchement OOthentifié
Messages : 2
Inscription : 24 avr. 2020 15:40

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

Message par Plob »

Bonjour,

merci milles fois pour cette macro de folie @Hubert Lambert.
Je dois bien avouer ne pas y comprendre grand chose, mais suffisamment pour bricoler un fichier pour faire un sommaire automatique du répertoire courant et des sous répertoires avec hyperliens vers les répertoires et les fichiers (sans macro supplémentaire)
Ça va me servir à avoir une vue d'ensemble rapide dans des répertoires (pour des gens qui ne maitrise pas la ligne de commande c'est clé en main, copier/coller dans le répertoire cible)
Ça va me servir aussi pour chercher des documents rapidement. (et pour me collègues aussi)

Ça fonctionne sous Windows, je pense qu'il faut adapter pour Linux ou Mac, notamment à cause des chemins qui sont différents / ou \.

Je pose le fichier ici pour ceux qui cherchent.
Sommaire.ods

La modération vous a écrit: Ami fossoyeur,
Merci de ne plus exhumer de fil aussi vieux : déterrage = verrouillage

Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.4.2.2 sous Win10 et Xubuntu.