Power Query: jak automatycznie połączyć wiele plików Excel z folderu: kod M

Power Query ładowanie folderu

Metoda 2: Łączenie plików Excel z folderu w języku M (dla zaawansowanych)

Jeśli chcesz mieć pełną kontrolę nad procesem – np. filtrować pliki po nazwie, wybierać konkretny arkusz czy zachować dodatkowe metadane – warto poznać kod w języku M, czyli języku programistycznym stojącym za Power Query. Szukaj: power query kod m

Jak wkleić kod M w Power Query

Excel: Dane → Pobierz dane → Inne źródła → Puste zapytanie
       → Widok → Edytor zaawansowany → Wklej kod → Gotowe

Podstawowy kod M: łączenie wszystkich plików .xlsx z folderu

// ============================================
// KOD M: Łączenie wszystkich plików .xlsx z folderu
// ============================================

let
    // KROK 1: Ścieżka do folderu (zmień na swoją!)
    ŚcieżkaFolderu = "C:\Users\krzys\OneDrive\Pulpit\dane_PQ",

    // KROK 2: Pobierz listę plików z folderu
    ZawartośćFolderu = Folder.Files(ŚcieżkaFolderu),

    // KROK 3: Filtruj tylko pliki Excel (.xlsx / .xls)
    TylkoExcel = Table.SelectRows(
        ZawartośćFolderu,
        each Text.EndsWith([Extension], ".xlsx") or Text.EndsWith([Extension], ".xls")
    ),

    // KROK 4: Dodaj kolumnę z nazwą pliku (bez rozszerzenia)
    ZNazwąPliku = Table.AddColumn(
        TylkoExcel,
        "NazwaPliku",
        each Text.BeforeDelimiter([Name], "."),
        type text
    ),

    // KROK 5: Funkcja wczytująca dane z pojedynczego pliku
    WczytajPlik = (plikBinarny as binary) as table =>
        let
            Źródło = Excel.Workbook(plikBinarny, null, true),
            PierwszyArkusz = Źródło{0}[Data],
            Nagłówki = Table.PromoteHeaders(PierwszyArkusz, [PromoteAllScalars=true])
        in
            Nagłówki,

    // KROK 6: Dodaj kolumnę z wczytanymi tabelami
    WczytaneTabele = Table.AddColumn(
        ZNazwąPliku,
        "DaneZPliku",
        each WczytajPlik([Content]),
        type table
    ),

    // KROK 7: Połącz wszystkie tabele w jedną
    NazwyKolumn = Table.ColumnNames(WczytaneTabele[DaneZPliku]{0}),

    PołączoneDane = Table.ExpandTableColumn(
        WczytaneTabele,
        "DaneZPliku",
        NazwyKolumn
    ),

    // KROK 8: Usuń kolumny systemowe (opcjonalnie)
    BezZbędnych = Table.RemoveColumns(
        PołączoneDane,
        {"Content", "Extension", "Date accessed", "Date modified",
         "Date created", "Attributes", "Folder Path", "Name"}
    )

in
    BezZbędnych

Co się dzieje w każdym kroku?

KrokFunkcja MCo robi
1Folder.Files(...)Skanuje folder i zwraca tabelę z metadanymi każdego pliku
2Table.SelectRows(...)Odrzuca pliki PDF, Word, JPG – zostawia tylko Excel
3Text.BeforeDelimiter(...)Wycina nazwę pliku bez rozszerzenia .xlsx
4Excel.Workbook(...)Otwiera plik binarny i pokazuje jego arkusze
5Źródło{0}[Data]Pobiera pierwszy arkusz z pliku
6Table.PromoteHeaders(...)Zamienia pierwszy wiersz danych na nazwy kolumn
7Table.ExpandTableColumn(...)Rozwija wszystkie małe tabele w jedną dużą
8Table.RemoveColumns(...)Czyści zbędne kolumny systemowe

Warianty kodu M – dopasuj rozwiązanie do siebie

A) Wczytywanie konkretnego arkusza (nie pierwszego z brzegu)

Zamień linię PierwszyArkusz = Źródło{0}[Data] na jedną z poniższych:

// Wersja A: arkusz o dokładnej nazwie
WybranyArkusz = Table.SelectRows(Źródło, each [Name] = "Dane")[Data]{0},

// Wersja B: arkusz, którego nazwa zaczyna się od "Raport"
WybranyArkusz = Table.SelectRows(Źródło, each Text.StartsWith([Name], "Raport"))[Data]{0},

B) Filtrowanie plików po nazwie (np. tylko pliki zaczynające się od „Raport_”)

Dodaj ten krok między filtrowaniem po rozszerzeniu a dodawaniem kolumny z nazwą pliku:

TylkoRaporty = Table.SelectRows(
    TylkoExcel,
    each Text.StartsWith([Name], "Raport_")
),

C) Zachowanie ścieżki folderu jako osobnej kolumny

Zamiast usuwać Folder Path w ostatnim kroku, dodaj go jako kolumnę wcześniej:

ZeŚcieżką = Table.AddColumn(ZNazwąPliku, "Ścieżka", each [Folder Path], type text),

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry