Power Query Forumle Query récupérer le nom de propriété et l'insérer dans une colonne

Fanaouer

XLDnaute Nouveau
Bonjour,

Tout est dit dans le titre, j'ai beaucoup de requête qui vienne de plusieurs feuilles d'un classeur excel.

J'aimerais importer le nom de chaque feuille, donc le nom de la requête dans une colonne, car j'aimerais ensuite fusionner toute les requêtes.

Savez vous comment faire?

Merci d'avance
 

Marion G

XLDnaute Nouveau
Bonjour,
Je dois realiser la cartographie d'un dossier, en ajoutant les noms des differents auteurs des fichiers de ce dossier.
Les noms se trouvent sous "proprietes"- "details" -"origines"- "auteurs" mais comment ajouter cette information directement dans une colonne en face de chaque fichier avec Power query ?

Sachant que j'ai beaucoup de fichiers, il n'est pas imaginablale d'ajouter cette information manuellement.

Une idée ?
 

mromain

XLDnaute Barbatruc
Bonjour Marion, le forum,

J’arrive après la bataille et avec une solution partielle, mais tu trouveras ci-dessous une fonction qui permet d’extraire ces propriétés pour les fichiers au format Open XML - de la suite Office (docx, xlsm, ppsx).

La fonction GetOpenXmlFileCoreProps dézippe le fichier Open XML et récupère les propriétés à partir du fichier docProps/core.xml.
Le code permettant de dézipper vient d’ici.

Le code de la fonction GetOpenXmlFileCoreProps est le suivant :
Code:
let
    
    fn = (openXmlFileBinary as binary) as table =>
        let
        
            // unzip function source: https://github.com/ibarrau/PowerBi-code/blob/master/PowerQuery/ExtractZIP.pq
            UnzipFile = (ZIPFile as binary) =>
                let
                    Header = BinaryFormat.Record([      Signature            = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32,ByteOrder.LittleEndian),
                                                        Version         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        Flags             = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        Compression         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        ModTime         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        ModDate         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        CRC32             = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32,ByteOrder.LittleEndian),
                                                        CompressedSize         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32,ByteOrder.LittleEndian),
                                                        UncompressedSize     = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32,ByteOrder.LittleEndian),
                                                        FileNameLen         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
                                                        ExtraFieldLen         = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian)
                                                    ]),
                
                    FileEntry = BinaryFormat.Choice(Header, each if _[Signature] <> 0x4034B50 then BinaryFormat.Null else
                                                             BinaryFormat.Record([
                                                                            Header           = _,
                                                                            FileName         = BinaryFormat.Text(_[FileNameLen]),
                                                                            ExtraField       = BinaryFormat.Text(_[ExtraFieldLen]),
                                                                            UncompressedData = BinaryFormat.Transform(BinaryFormat.Binary(_[CompressedSize]),(x) => try Binary.Buffer(Binary.Decompress(x, Compression.Deflate)) otherwise null)
                                                                            ]), type binary),
                    ZipFormat = BinaryFormat.List(FileEntry, each _<> null),    
                
                    Entries = List.Transform(
                            List.RemoveLastN( ZipFormat(ZIPFile), 1),
                        (e) => [FileName = e[FileName], Content = e[UncompressedData] ]
                    )
                in
                   Table.FromRecords(Entries),
        
            UnzipedFileTable = try UnzipFile(openXmlFileBinary) otherwise error "Source file is not an OpenXml file.",
            docPropsCoreBinary = try Table.SelectRows(UnzipedFileTable, each ([FileName] = "docProps/core.xml")){0}[Content] otherwise error "Source file is not an OpenXml file.",
            ContenuXml = Xml.Document(docPropsCoreBinary),
            Value = ContenuXml{0}[Value],
            SelectedColumns = Table.SelectColumns(Value,{"Name", "Value"})
        in
            SelectedColumns,
    
    DocumentationMetadata = 
        [
            Documentation.Name = "GetOpenXmlFileCoreProps",
            Documentation.Description = "This function extract 'core properties' of an OpenXml file (docx, xlsm, ppts, ...).", 
            Documentation.Examples = 
                {
                    [
                        Description = "Extract core properties of a .docx file:",
                        Code = "GetOpenXmlFileCoreProps(File.Contents(""c:\folder\document.docx"")",
                        Result = "Table with name and values of core properties."
                    ]
                }
        ]

in
    Value.ReplaceType(fn, Value.ReplaceMetadata(Value.Type(fn), DocumentationMetadata))

Ci-dessous un exemple d’utilisation :
Code:
let
    Source = Folder.Files("D:\TMP"),
    Filtre_FichiersOffice = Table.SelectRows(Source, each ([Extension] = ".docx" or [Extension] = ".dotm" or [Extension] = ".dotx" or [Extension] = ".pptx" or [Extension] = ".xlsm" or [Extension] = ".xlsx")),
    ColonneAjoutée_FileCoreProp = Table.AddColumn(Filtre_FichiersOffice, "CoreProperties", each GetOpenXmlFileCoreProps([Content]))
in
    ColonneAjoutée_FileCoreProp

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 971
Membres
103 073
dernier inscrit
MSCHOE16