oguruma
XLDnaute Occasionnel
Suite du post Combiner des fichiers Excel
Le fichier source et data sont les mêmes
Hypothèse : on souhaite combiner plusieurs Tables (tableaux structurés) [à condition que leurs structures soient identiques)
- soit on importe tous les TS du classeur Excel
- soit on importe tous les TS de manière générique
- soit des TS nommément précisés
Environnement PowerQuery
Rappel des paramètres
Les différentes fonctions
Le fichier source et data sont les mêmes
Hypothèse : on souhaite combiner plusieurs Tables (tableaux structurés) [à condition que leurs structures soient identiques)
- soit on importe tous les TS du classeur Excel
- soit on importe tous les TS de manière générique
- soit des TS nommément précisés
Environnement PowerQuery
Rappel des paramètres
PowerQuery:
let
Source = Excel.CurrentWorkbook(){[Name="TBL_2020"]}[Content]
in
Source
let
Source = fnGetTable("TBL_2020")
in
Source
let
pFilter=fnGetParameter("TB_PARAMS","FILTRE_TABLE"),
Source = Excel.CurrentWorkbook(),
FilterTable = if pFilter is null then Source else Table.SelectRows(Source, each Text.StartsWith([Name], pFilter)),
Content = FilterTable[Content],
ToTable = Table.FromList(Content, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
ExpandTable = Table.ExpandTableColumn(ToTable, "Column1", {"Date", "Client", "Produit", "Vendeur", "Montant"}, {"Date", "Client", "Produit", "Vendeur", "Montant"})
in
ExpandTable
let
Source = fnCombineAllTables("TBL_")
in
Source
let
//---------------------------------------------------------------------------
// On récupère un à un les tableaux structurés
//---------------------------------------------------------------------------
Source1 = Excel.CurrentWorkbook(){[Name="TBL_2020"]}[Content],
Source2 = Excel.CurrentWorkbook(){[Name="TBL_2021"]}[Content],
Source3 = Excel.CurrentWorkbook(){[Name="TBL_2022"]}[Content],
//---------------------------------------------------------------------------
// Puis combinaison des tableaux structurés en table
//---------------------------------------------------------------------------
Combine = Table.Combine({Source1, Source2, Source3})
in
Combine
let
//---------------------------------------------------------------------------------
// Appel de la fonction permettant de combiner plusieurs tables spécifiques
// Ces tables sont définies dans la table des paramètres
//---------------------------------------------------------------------------------
Source=fnCombineTableByList("TB_PARAMS","LISTE_TB")
in
Source
Les différentes fonctions
PowerQuery:
let
//-------------------------------------------------------------------------------
// Combinaison de plusieurs tables à partir du classeur Excel courant
// avec possibilité de filtrer sur le nom des tables (tableaux structurés)
// au préalable les tableaux structurés doivent être créés
// il est recommandé qu'ils commencent tous par le même préfixe
//-------------------------------------------------------------------------------
fnCombineAllTables = (pFilterTbl as text) =>
let
//---------------------------------------------------------------------------
// On récupère les objets du classeur
//---------------------------------------------------------------------------
Source = Excel.CurrentWorkbook(),
//---------------------------------------------------------------------------
// On applique le filtre sur les tableaux structurés
//---------------------------------------------------------------------------
FilterTable = if pFilterTbl is null then Source else Table.SelectRows(Source, each Text.StartsWith([Name], pFilterTbl)),
//---------------------------------------------------------------------------
// On récupère les tableaux structurés (tables)
//---------------------------------------------------------------------------
Content = FilterTable[Content],
//---------------------------------------------------------------------------
// Conversion en table d'objets
//---------------------------------------------------------------------------
ToTable = Table.FromList(Content, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
//---------------------------------------------------------------------------
// On se base sur le 1er tableau pour récupérer les titres de colonnes
//---------------------------------------------------------------------------
TblColumns = ToTable{0}[Column1],
//---------------------------------------------------------------------------
// Les colonnes sont transformées en liste
//---------------------------------------------------------------------------
LstColumns=Table.ColumnNames(TblColumns),
//---------------------------------------------------------------------------
// Création de la table contenant tous les tableaux structurés
//---------------------------------------------------------------------------
ExpandTable = Table.ExpandTableColumn(ToTable, "Column1", LstColumns, LstColumns)
in
ExpandTable
in
fnCombineAllTables
let
//---------------------------------------------------------------------------------
// Fonction permettant de combiner plusieurs tables (tableaux structurés)
// Ce dossier et ces tables sont définis dans une table paramètres
//---------------------------------------------------------------------------------
// La table des paramètres et le paramètre tables à combiner
fnCombineExcelByList = (pTableParams as text, pParam as text) as table =>
let
LstFiles=Text.Split(fnGetParameter(pTableParams,pParam),";"), // Liste des tables à combiner
LstCombine=List.Accumulate(
LstFiles, // Initialisation de la boucle sur la liste à traiter
#table({},{}), // Initialisation de l'accumulateur sur une table vide
(state,current) => // Boucle de traitement pour combiner les fichiers un à un
let
Source = fnGetTable(current), // Importation de la table en cours
Combine = Table.Combine( {state , Source}) // Combinaison de la table
in
Combine // Ensemble des tables combinées
)
in
LstCombine
in
fnCombineExcelByList
let
//-------------------------------------------------------------------
// Fonction permettant d'importer un tableau structuré
// Ce tableau structuré doit exister au préalable
//-------------------------------------------------------------------
fnGetTable=(pTable as text) as table =>
let
Source = Excel.CurrentWorkbook(){[Name=pTable]}[Content]
in
Source
in
fnGetTable
Dernière édition: