Сборка таблиц из разных файлов Excel с помощью Power Query

Постановка задачи

Давайте разберем красивое решение для одной из весьма стандартных ситуаций, с которой рано или поздно сталкивается большинство пользователей Excel: нужно быстро и автоматически собрать данные из большого количества файлов в одну итоговую таблицу. 

Предположим, что у нас есть вот такая папка, в которой содержится несколько файлов с данными из филиалов-городов:

Файлы для сборки

Количество файлов роли не играет и может меняться в будущем. В каждом файле есть лист с именем Продажи, где расположена таблица с данными:

Данные в книгах

Количество строк (заказов) в таблицах, само-собой, разное, но набор столбцов везде стандартный.

Задача: собрать данные из всех файлов в одну книгу с последующим автоматическим обновлением при добавлении-удалении файлов-городов или строк в таблицах. По итоговой консолидированной таблице затем можно будет строить любые отчеты, сводные таблицы, фильтровать-сортировать данные и т.д. Главное - суметь собрать.

Подбираем оружие

Для решения нам потребуется последняя версия Excel 2016 (в нее нужный функционал уже встроен по умолчанию) или предыдущие версии Excel 2010-2013 с установленной бесплатной надстройкой Power Query от Microsoft (скачать ее можно здесь). Power Query - это супергибкий и супермощный инструмент для загрузки в Excel данных из внешнего мира с последующей их зачисткой и обработкой. Power Query поддерживает практически все существующие источники данных - от текстовых файлов до SQL и даже Facebook :)

Если у вас нет Excel 2013 или 2016, то дальше можно не читать (шучу). В более древних версиях Excel подобную задачу можно реализовать только программированием макроса на Visual Basic (что весьма непросто для начинающих) или монотонным ручным копированием (что долго и порождает ошибки).

Шаг 1. Импортируем один файл как образец

Для начала давайте импортируем данные из одной книги в качестве примера, чтобы Excel "подхватил идею". Для этого создайте новую пустую книгу и...

  • если у вас Excel 2016, то откройте вкладку Данные и выберите Создать запрос - Из файла - Из книги (Data - New Query- From file - From Excel)
  • если у вас Excel 2010-2013 с установленной надстройкой Power Query, то откройте вкладку Power Query и выберите на ней Из файла - Из книги (From file - From Excel)
Затем в открывшемся окне переходим в нашу папку с отчетами и выбираем любой из файлов-городов (не играет роли какой именно, т.к. они все типовые). Через пару секунд должно появиться окно Навигатор, где нужно в левой части выбрать требуемый нам лист (Продажи), а в правой отобразится его содержимое:

Навигатор Power Query

Если нажать в правом нижнем углу этого окна кнопку Загрузить (Load), то таблица будет сразу импортирована на лист в исходном виде. Для одиночного файла - это хорошо, но нам нужно загрузить много таких файлов, поэтому мы пойдем немного другим путем и жмем кнопку Правка (Edit). После этого должен в отдельном окне отобразиться редактор запросов Power Query с нашими данными из книги:

Редактор запросов Power Query

Это очень мощный инструмент, позволяющий "допилить" таблицу под нужный нам вид. Даже поверхностное описание всех его функций заняло бы под сотню страниц, но, если совсем кратко, то с помощью этого окна можно:

  • отфильтровывать ненужные данные, пустые строки, строки с ошибками
  • сортировать данные по одному или нескольким столбцам
  • избавляться от повторов
  • делить слипшийся текст по столбцам (по разделителям, количеству символов и т.д.)
  • приводить текст в порядок (удалять лишние пробелы, исправлять регистр и т.д.)
  • всячески преобразовывать типы данных (превращать числа как текст в нормальные числа и наоборот)
  • транспонировать (поворачивать) таблицы и разворачивать двумерные кросс-таблицы в плоские
  • добавлять к таблице дополнительные столбцы и использовать в них формулы и функции на встроенном в Power Query языке М.
  • ...

Для примера, давайте добавим к нашей таблице столбец с текстовым названием месяца, чтобы потом проще было строить отчеты сводных таблиц. Для этого щелкните правой кнопкой мыши по заголовку столбца Дата и выберите команду Дублировать столбец (Duplicate Column), а затем щелкните правой кнопкой мыши по заголовку появившегося столбца-дубликата и выберите команды Преобразование - Месяц - Название месяца:

Добавление столбца с месяцем

Должен образоваться новый столбец с текстовыми названиями месяца для каждой строки. Дважды щелкнув по заголовку столбца, его можно переименовать из Копия Дата в более удобное Месяц, например.

Новый столбец
Если в каких-то столбцах программа не совсем корректно распознала тип данных, то ей можно помочь, щелкнув по значку формата в левой части каждого столбца:

Преобразование форматов данных в столбцах

Исключить строки с ошибками или пустые строки, а также ненужных менеджеров или заказчиков можно с помощью простого фильтра:

Фильтрация данных в Power Query

Причем все выполненные преобразования фиксируются в правой панели, где их всегда можно откатить (крестик) или изменить их параметры (шестеренка):

Шаги преобразований

Легко и изящно, не правда ли?

Шаг 2. Преобразуем наш запрос в функцию

Чтобы впоследствии повторить все сделанные преобразования данных для каждой импортируемой книги, нужно преобразовать наш созданный запрос в функцию, которая затем будет применяться, по очереди, ко всем нашим файлам. Сделать это, на самом деле, очень просто.

В редакторе запросов перейдите на вкладку Просмотр и нажмите кнопку Расширенный редактор (View - Advanced Editor). Должно открыться окно, где все наши предыдущие действия будут записаны в виде кода на языке М. Обратите внимание, что в коде жестко прописан путь к файлу, который мы импортировали для примера:

Исходный код

Теперь аккуратно вносим пару правок:

Измененный код

Смысл их прост: первая строка (filepath)=> превращает нашу процедуру в функцию с аргументом filepath, а ниже мы меняем фиксированный путь на значение этой переменной. 

Все. Жмем на Готово и должны увидеть вот это:

Созданная функция

Не пугайтесь, что пропали данные - на самом деле все ОК, все так и должно выглядеть :) Мы успешно создали нашу пользовательскую функцию, где запомнился весь алгоритм импорта и обработки данных без привязки к конкретному файлу. Осталось дать ей более понятное имя (например getData) на панели справа в поле Имя и можно жать Главная - Закрыть и загрузить (Home - Close and Load). Обратите внимание, что в коде жестко прописан путь к файлу, который мы импортировали для примера.. Вы вернетесь в основное окно Microsoft Excel, но справа должна появиться панель с созданным подключением к нашей функции:

Подключение к функции

Шаг 3. Собираем все файлы

Все самое сложное - позади, осталась приятная и легкая часть. Идем на вкладку Данные - Создать запрос - Из файла - Из папки (Data - New Query - From file - From folder) или, если у вас Excel 2010-2013, аналогично на вкладку Power Query. В появившемся окне указываем папку, где лежат все наши исходные файлы-города и жмем ОК. Следующим шагом должно открыться окно, где будут перечислены все найденные в этой папке (и ее подпапках) файлы Excel и детализация по каждому из них:

Импорт всех файлов Excel из заданной папки

Жмем Изменить (Edit) и опять попадаем в знакомое окно редактора запросов.

Теперь нужно добавить к нашей таблице еще один столбец с нашей созданной функцией, которая "вытянет" данные из каждого файла. Для этого идем на вкладку Добавить столбец - Пользовательский столбец (Add Column - Add Custom Column) и в появившемся окне вводим нашу функцию getData, указав для ее в качестве аргумента полный путь к каждому файлу:

Дополнительный столбец

После нажатия на ОК созданный столбец должен добавиться к нашей таблице справа.

Теперь удалим все ненужные столбцы (как в Excel, с помощью правой кнопки мыши - Удалить), оставив только добавленный столбец и столбец с именем файла, т.к. это имя (а точнее - город) будет полезно иметь в итоговых данных для каждой строки.

А теперь "вау-момент" - щелкнем мышью по значку со своенным стрелками в правом верхнем углу добавленного столбца с нашей функцией:

Подгружаем данные в пользовательский столбец

... снимаем флажок Использовать исходное имя столбца как префикс (Use original column name as prefix)и жмем ОК. И наша функция подгрузит и обработает данные из каждого файла, следуя записанному алгоритму и собрав все в общую таблицу:

Собранные данные

Для полной красоты можно еще убрать расширения .xlsx из первого столбца с именами файлов - стандартной заменой на "ничего" (правой кнопкой мыши по заголовку столбца - Заменить) и переименовать этот столбец в Город. А также подправить формат данных в столбце с датой.

Все! Жмем на Главной - Закрыть и загрузить (Home - Close & Load). Все собранные запросом данные по всем городам будут выгружены на текущий лист Excel в формате "умной таблицы":

Собранные данные

Созданное подключение и нашу функцию сборки не нужно никак отдельно сохранять - они сохраняются вместе с текущим файлом обычным образом.

В будущем, при любых изменениях в папке (добавлении-удалении городов) или в файлах (изменение количества строк) достаточно будет щелкнуть правой кнопкой мыши прямо по таблице или по запросу в правой панели и выбрать команду Обновить (Refresh) - Power Query "пересоберет" все данные заново за несколько секунд.

P.S.

Поправка. После январских обновлений 2017 года Power Query научился собирать Excel'евские книги сам, т.е. не нужно больше делать отдельную функцию - это происходит автоматически. Таким образом второй шаг из этой статьи уже не нужен и весь процесс становится заметно проще:

  1. Выбрать Создать запрос - Из файла - Из папки - Выбрать папку - ОК
  2. После появления списка файлов нажать Изменить
  3. В окне редактора запросов развернуть двойной стрелкой столбец Binary и выбрать имя листа, который нужно взять из каждого файла

И все! Песня!

Ссылки по теме



Страницы: 1  2  3  4  5  
28.04.2017 09:56:56
Подскажите пожалуйста. У меня Excel 2010. Установил надстройку PQ. При выполнении шага 1. в момент импорта первого файла в качестве образца все зависает и висит пока не убьешь процесс...  в чем может быть дело?
сразу оговорюсь, что таблица сложная много сгруппированных строк и столбцов в шапке, также есть формулы сумм в некоторых столбцах. И количество строк порядка 1500 шт.
Николай, добрый день!
Если есть время помогите или направьте в нужном направлении. Есть файл банковских операций до 01.05. и файлы обновлений. Слияние на один лист, к примеру "Альфа", исходного файла и обновлений из папки я настроил. Теперь пробую сделать так чтобы информация на листе "Альфа" сохранялась даже при удалении выписок, т.е. чтобы конечный лист помнил свое текущее состояние и обновлялся только в случая поступления новых выписок. Power Query такое конечно позволяет делать результат мне выгружает в новый лист, так как выгрузка в текущую таблицу данных запрещена.
Спасибо!
25.05.2017 15:10:49
Николай, добрый день.
Подскажите, как можно сделать слияние, если во всех файлах отличается имя листа (каждый раз генерится новое имя) а структура данных абсолютно одинакова. Я так понимаю нужно делать 2 запроса и превращать их в функцию: 1-й для файла, 2-й для имени книги и подставлять их в итоговый большой запрос?
13.11.2017 09:30:37
В двух словах не объяснишь.
Но идея в том, что надо сначала собрать сами файлы в Power Query, а потом применить к ним функцию =Excel.Workbook(), чтобы вытащить из каждого весь список листов (независимо от их имен).
А потом уже разворачиваем содержимое листов и работает с данными.
Как-то так, если на пальцах.
Nik
25.06.2022 21:35:25
Вот и мне пришлось столкнуться с той же проблемой и судя по запросам у многих эта проблема есть - как собирать из папки если название листов разное. Гугление привело к достаточно простому решению.

На примере кода из статьи, на втором шаге:
Продажи_Sheet = Источник{[Item="Продажи",Kind="Sheet"]}[Data], 
Меняем на -
Продажи_Sheet = Источник{0}[Data], 

В итоге, перебирая файлы из папки, Ексель не ищет лист и таблицу на нем по названию, а просто забирает первый лист и первую таблицу на нем. Если вместо 0 поставить 1, то соответственно второй и так далее.

Если собирали с помощью функции "из папки", то после создания, перейдите в редактор ПоверКвери, на шаг "Преобразовать файл" и в коде исправьте на:
Лист1_Sheet = Источник{0}[Data], 
Николай, если вас не затруднит, возможно стоит добавить этот метод в статью. Спасибо.
01.06.2017 11:47:55
Добрый день! Подскажите пожалуйста, у меня возникла проблема после того как добавила пользовательский столбец. У меня пишет в строчках этого столба Error: Не удается преобразовать значение Binary в тип Function.
Подскажите что неправильно сделала?
Excel 2013
07.06.2017 13:15:10
https://www.youtube.com/watch?v=1yXhDmjmj7k&list=PL84ESW5WdEfJkFpuhLHO_uAvX0-h3QxB1
Здесь много вариантов применения PQ. Все очень подробно.
12.06.2017 15:04:52
Доброго дня!
Прошу помощи...при добавлении пользовательского столбца, прописав формулу, не активируется кнопка "Ок" и указывается что "Определение формулы не завершено". Отчеты скачал из данного примера и пробовал другие.
Пробовал и формулу "=Excel.Workbook([Content])" тоже самое... не активируется "ок" и "определение формулы не завершено".
Почему? Что не так?(((((
Excel 2013 и 2010...
13.11.2017 09:27:16
Явно проблемы с самим Power Query. Я бы накатил все обновления на Excel и переустановил Power Query для начала.
02.08.2017 00:24:53
Как можно добиться названия месяца на языке отличающемся от системного?
Например названия месяцев на русском и английском
25.10.2017 10:24:46
Добрый день, Sergii!

Я бы сделала дубликат столбца, и заменила бы Январь на January, Февраль на February и т.д. итого 12 раз
13.11.2017 09:26:10
Как вариант, можно сделать таблицу-справочник по датам, где в первом столбце будут даты на русском, а во втором на английском. И затем объединить запросы через команду Главная - Объедиить запросы.
25.10.2017 10:02:35
Добрый день!

Спасибо за статью, у меня все получилось.
Единственное - я бы хотела чтобы Power Query вставил данные начиная с определенной строки, например, начиная с 7-ой строки. Как это реализовать? Подскажите, пожалуйста!
13.11.2017 09:24:20
Тогда при выгрузке из Power Query в Excel лучше воспользоваться командой Главная - Сохранить и загрузить - Сохранить и загрузить как.
Дальше будет окно, где можно выбрать на какой лист выгрузить и начиная с какой конкретно ячейки.
29.04.2019 20:31:46
Здравствуйте, Николай. А можно поподробнее? Задача собрать таблицы без "шапок", шапки одинаковые, на определенное количество строк. Таблицы нужно объединить, начиная с определенной строки. Это возможно?
13.11.2017 07:55:28
Добрый день, Николай!
Я добавляю папку. В нем файлы и в них много листов. Как указать конкретный лист? Не осилил, прошу Ваш подсказать
13.11.2017 09:23:02
Никита, на Шаге 1 на первом же скриншоте выбирается лист Продажи - это и есть выбор листа, который будет импортироваться из всех книг.
16.11.2017 10:40:10
спасибо, получилось.
23.11.2017 22:35:18
Николай, добрый день! Классный урок.
Как можно обойти ошибку доступа к файлам EXCEL, при обновлении запроса, если один или несколько файлов открыты и на них нет группового доступа, а также закрывать файла нельзя. Может быть можно дописать в функцию команду как для обработки run-time ошибок в VB?.
08.12.2017 10:47:53
Погуглите конструкцию try ... catch языка М - возможно, это то, что вам нужно.
07.12.2017 08:41:02
Добрый день!
Спасибо за статью. Николай, подскажите, а с группировкой строк в исходных файлах совсем ничего не поделать? У меня выгрузки из базы данных сгруппированы по строкам и файлов достаточно много. Приходится заходить  в каждый и разгруппировывать..
08.12.2017 10:45:30
Инна, Power Query при импорте группировку, скрытые и отфильтрованные строки не должен видеть - он берет все содержимое листа как есть. Так что разгруппировывать, по идее, не надо.
09.12.2017 15:38:54
Да, действительно. Оказалось, что помешала группировка листов(!), а не строк в таблице
23.04.2020 12:26:13
Добрый день! Похожая проблема - в книге эксель выгружаемой из 1с скрыты первые 7 строк - и запрос выдает ошибку данных [Binary]. Не знаю что делать
11.12.2017 12:45:42
У меня есть 2 вопроса буду рад если ответите.

1) А если файлы в разных папках можно как нибудь их собрать одним запросом используя относительный путь к папке типа - = Excel.CurrentWorkbook(){[Name="_001_path_spiski"]}[Content]{0}[ Path]
? Или только каждую таблицу вытаскивать на отдельный лист а потом их все  обьеденять?

2)
В готовую таблицу на основе запроса power query нужно добавить новые столбцы которые должны забиваться вручную!!!!
Важно в исходной таблице из которой брал данные запрос power query этих столбцов нет и быть не должно.
Осуществимо ли это?
17.01.2018 23:15:24
Добрый день!

1) Если по файлам >1млн строк, то загрузить их все можно в PowerPivot только? Можно ли раскидать по листам Excel не фильтруя-разделяя на 2 и более запроса/-ов внутри PQ.
2) Можно ли через PQ получать количество строк по каждому из файлов? Есть список файлов, напротив каждого получить количество строк по содержимому.
28.02.2018 10:15:21
Добрый день! Подскажите пожалуйста, у меня такая задача:
есть куча однотипных файлов Эксель, в них есть слово итого и есть сумма. Нужно посчитать общую сумму всех этих "итого"
есть ещё поле дата (которая везде указана в разных форматах) вот очень желательно чтобы сумма считала за конкретный месяц. Я прочёл описание по Power Query, но не смог его установить. Установщик выдает следующее сообщение:
"Для Microsoft Power Query для Excel (x64) требуется 64-разрядная версия Microsoft Excel 2010 с пакетом обновления 1 (SP1) или Microsoft Excel 2013. Сначала установите 64-разрядную версию Microsoft Excel 2010 с пакетом обновления 1 (SP 1) или Microsoft Excel 2013."
У меня следующие ТТХ:
Windows 10 PRO
Exel 2016  в списке надстроек я не нашёл Power Query.

Буду благодарен за ответ!
01.12.2021 09:57:00
В Версии Excel 2016  Power Query  устанавливать не нужно.  Он идет "из коробки". Смотреть на вкладке Данные-Скачать и преобразовать или вкладка Данные-Получить и преобразовать Далее как на видео в начале статьи. Успехов в освоение удивительного и могучего инструмента.
04.04.2018 08:03:58
Если у Вас нет возможности использовать PowerQuery, можете использовать бесплатную надстройкуMerge and Totals
08.04.2018 08:48:09
Николай, подскажите:
1. Собирая данные из отдельных Книг в одной папке на сетевом диске - будет-ли PQ работать, если один или несколько исходных файлов открыты на удалённых компьютерах, при условии, что после каждого внесения изменения будут сохранять внесенную информацию.
2. Корректно ли работает PQ во всём диапазоне EXCEL? При каждом обновлении информации PQ проверяет все таблицы или в ней есть алгоритм, который не рассматривает старые значения, а вносит лишь новые?
Спасибо!
20.04.2018 07:57:55
Николай, здравствуйте!
У меня в одном столбце данные в виде дат и текста, при сборке таблиц из нескольких файлов PQ уделяет данные из этого столбца. Подскажите как это исправить.
23.04.2018 12:45:17
Здравствуйте!
Николай, подскажите пожалуйста, а как можно победить ограничение в 1 000 строк в фильтре столбца в PQ? Если это конечно не секрет?
24.04.2018 10:14:01
спасибо
24.04.2018 10:15:42
спасибо
15.06.2018 08:57:58
Кто-нибудь знает как обновить Power Query 2016, пишет что у меня не последняя версия...э
24.06.2018 19:34:29
Спс, мне очень помогло
26.06.2018 15:44:17
Использовал успешно PQ для преобразования таблиц и столкнулся с задачей склеить несколько файлов в один. Следуя этому алгоритму на 3 этапе загружается корректно только файл, загруженный на 1 этапе. Ошибка: Expression.Error: The key didn't match any rows in the table

Не подскажете, что можно сделать?
09.07.2018 07:32:12
Добрый день, Николай!
Возможно ли изменить уже записанную функцию? Или надо все заново делать?
Поняла, что удалила некоторые колонки, которые в целом могут понадобиться в будущем для сводной таблицы.
09.07.2018 11:17:05
Уже нашла :-)
Добрый день, Николай!
После склейки столбцов с путем и именем в новом столбце для всех книг кроме одной (той с которой на первом этапе делали настройки) вместо "table" пишет ошибку "error"
В запросе "" произошла ошибка. Expression.Error: Ключу не соответствует ни одна строка в таблице.
Сведения:
   Key=Record
   Table=Table.
В чем может быть причина?
20.07.2018 10:59:02
Не видя ваших исходных файлов и запроса - сказать невозможно. Миллион причин разных.
Страницы: 1  2  3  4  5  
Наверх