@DhritimanL
Unfortunately, PowerQuery doesn’t support output of one query to multiple sheets.
If your version of Excel supports Dynamic Arrays and the FILTER function, you can use this code:
Option Explicit
Public Sub SplitTableToSheets()
Dim full_data_listobject As ListObject
Dim selected_range As Range
Dim selected_data As Variant
Dim selected_data_header As String
Dim items_sheet As Worksheet
Dim items_range As Range
Dim item As String
Dim i As Integer
Dim new_item_sheet As Worksheet
DeleteSheetWithoutWarning "items"
Set full_data_listobject = ThisWorkbook.Worksheets("full data").ListObjects(1)
' get the range currently selected
Set selected_range = Selection
selected_data_header = Selection.Offset(-1, 0).Cells(1, 1)
Set items_sheet = ThisWorkbook.Worksheets.Add
items_sheet.Name = "items"
selected_range.Copy
items_sheet.Range("A1").PasteSpecial xlValues
Set items_range = items_sheet.Range("A1").CurrentRegion
items_range.RemoveDuplicates 1, xlNo
'loop through each item and create a new sheet with the filtered data
For i = 1 To items_range.Rows.Count
If items_range.Cells(i, 1) <> "" Then
item = items_range.Cells(i, 1)
DeleteSheetWithoutWarning item
Set new_item_sheet = ThisWorkbook.Worksheets.Add
With new_item_sheet
.Name = item
.Range("A1").Formula2 = "=" & full_data_listobject.Name & "[#Headers]"
.Range("A2").Formula2 = "=FILTER(" & full_data_listobject.Name & _
"," & full_data_listobject.Name & "[" & selected_data_header & "] = """ & item & """)"
''optionally uncomment these two lines to paste the results as values in the destination sheet
'.Range("A1").CurrentRegion.Copy
'.Range("A1").PasteSpecial xlPasteValues
End With
Else
Exit For
End If
Next i
End Sub
Private Sub DeleteSheetWithoutWarning(sheet_name As String)
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets(sheet_name).Delete
On Error GoTo 0
Application.DisplayAlerts = True
End Sub
Select a column in your data that contains the items you want to split by, then run the SplitTableToSheets sub-procedure.
The benefit of this is that it will keep the sub-sheets up to date when the data on the main sheet refreshes.
You can test it with my dataset using the attached file.
If this doesn’t work for you because you don’t have access to the FILTER function, let me know. There are other ways to do it.
There’s an old joke about “Export to Excel” being the most important feature of any BI tool. In fact, I’d say export to Excel is one of the most important features of any enterprise application of any type. Of course the reason we joke about it is that we know it’s a Bad Thing and the starting point for all kinds of manual, error-prone and time-consuming business processes – but even though we know there are much better ways of achieving whatever it is the user wants to do, they still want to export to Excel.
So wouldn’t be good if you could export to Excel and instead of getting a static copy of the data, you could get a table connected to a Power Query query which in turn connected back to the original data source, so it could be refreshed whenever the user wanted? After all, pretty much everyone nowadays has a version of Excel with Power Query in it (even, with some limitations, Mac users). It’s always been possible to build yourself but technically difficult. Recently, though, I became aware of a JavaScript library developed by the Excel Power Query team called “Connected Workbooks” that makes it extremely easy to do this. You can find out more about it here:
https://www.npmjs.com/package/@microsoft/connected-workbooks
https://github.com/microsoft/connected-workbooks#readme
So if you’re adding export to Excel to your application, or know someone who is, check it out!
My name is Chris Webb, and I work on the Power BI CAT team at Microsoft. I blog about Power BI, Power Query, SQL Server Analysis Services, Azure Analysis Services and Excel.
View all posts by Chris Webb
Suvik Пользователь Сообщений: 17 |
Всем привет. |
Экспортируйте через ДаксСтудию за определенные периоды, а не все сразу. Время экспорта 4 часа скорее всего связана со слабым хардом. У меня на SSD экспорт 1 млн занимает порядка 15 минут. Касаемо иероглифов — без примера не никто не подскажет. зы: что это за версия клика такая с ограничением в 50мб? Вы наверное прикрепляете файл к запросу, а не используете файл как источник данных |
|
PooHkrd Пользователь Сообщений: 6602 Excel x64 О365 / 2016 / Online / Power BI |
Выгрузить из модели в csv можно попробовать и макросом . А вот что с кликом делать — уже не подскажу. Вот горшок пустой, он предмет простой… |
Suvik, https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=130680&a… Добрый день. Я выгрузку делаю на сервер SQL. Хочу добавить, что при огромных выгрузках, 100 000 строк и более, глюки могут усугубиться, поэтому в реальном проекте выгрузка на сервер происходит каждый день и по чуть чуть. Изменено: lostandleft — 29.06.2021 11:58:34 |
|
Suvik Пользователь Сообщений: 17 |
mechanix 85, хард точно нормальный. Нашел метод как ускорить процесс. Сейчас попробую. Как потом добавлять данные в готовый файл csv? При добавлении нового месяца думал просто заменять его на новый. Изменено: Suvik — 29.06.2021 11:41:33 |
Suvik Пользователь Сообщений: 17 |
PooHkrd,Макрос пробовал. Какую-то ошибку выдает, решения не нашел, поэтому начал пробовать DAX |
Suvik Пользователь Сообщений: 17 |
#7 29.06.2021 11:47:13
Пока не настроили путь в «расположение файлов» пытаюсь просто файлом загрузить данные. Вот и ругается. Может быть и с этим связано |
||
Suvik, клик также может собирать файлы с папки. просто вместо пути //файл.csv указывайте //*.csv ну или с доп. маской. Поэтому формируйте файлы помесячно или поквартально. (но клик в десятки раз быстрее загружает данные, непонятно для чего двойная работа) Пришлите лучше файл excel с парой строк в модели данных, гляну у себя через Студио |
|
Suvik Пользователь Сообщений: 17 |
mechanix 85, декабрь — исходник с моделью данных, таблица — полученный через DAX csv |
Suvik Пользователь Сообщений: 17 |
|
vikttur Пользователь Сообщений: 47199 |
Suvik, если мысль опоздала, можно дополнить предыдущее сообщение |
mechanix 85 Пользователь Сообщений: 1031 |
#12 29.06.2021 12:45:41 и теперь чтобы не прогружать старые данные в ДаксСтудио код будет:
таблицы и названия полей с вашей модели |
||
Suvik Пользователь Сообщений: 17 |
#13 29.06.2021 13:42:15
Спасибо. Нужная штука. Только теперь другая проблема. С кириллицей и экспортом разобрался. При экспортировании он текстовые ячейки заключает в кавычки, дату тоже текстом проставил и пишет её мне текстом вплоть до секунд. Соответственно в клике потом нечитаемая чушь с большим количеством ненужных кавычек. Название месяца тоже в кавычках все. Как этот недочет исправить можно? |
||
mechanix 85 Пользователь Сообщений: 1031 |
#14 29.06.2021 14:00:36 Это такая фича Студио. Эти поля можно легко переименовать в клике по типу [Дата`накл.] as [Дата накл.] и дополнительно преобразовать текстовые даты с секундами в нормальную дату:
Изменено: mechanix 85 — 29.06.2021 14:01:08 |
||
Suvik Пользователь Сообщений: 17 |
#15 29.06.2021 14:31:47
Это в самом клике в скрипт прописывать? Или в DAX? |
||
Suvik Пользователь Сообщений: 17 |
#17 29.06.2021 15:52:27
По синтаксису сможете прокомментировать? Что-то ругается |
||
на что именно? вместо [Дата`накл.] указать свое поле из csv формат даты после Студио такой же как на скрине? Прикрепленные файлы
|
|
Suvik Пользователь Сообщений: 17 |
#19 29.06.2021 16:02:08
Да. Клик только недавно начал изучать. В скрипты толком не лез. В какую строку его добавлять нужно? Прикрепленные файлы
|
||
mechanix 85 Пользователь Сообщений: 1031 |
#20 29.06.2021 16:13:23 Вместо Дата
Только почему у вас Студио не заменил шапку файла, которые содержали пробелы на апостроф ` ? Скорее всего это изначальный код загрузки таблицы, сейчас там таких полей нет вот клик и матюкается |
||
Suvik Пользователь Сообщений: 17 |
#21 29.06.2021 16:49:46
Получилось, спасибо. Есть ли варианты не в скрипте это исправлять? Дело в том, что этот файл-исходник будет лежать в папке, видимой кликом. И добавлять я его буду «расположением фалов». Есть сомнения, что в таком случае данные в самом клике обновляться не будут. Или будут?.. Т.к. при текущей ситуации, когда я просто закинул туда файл, потом этот файл на компе поменял, но в клике ничего не изменилось |
||
StepanWolkoff Пользователь Сообщений: 1252 |
#22 29.06.2021 16:53:46
В EVALUATE используйте SELECTCOLUMNS, что переименовать столбцы удобоваримо, а также преобразовать их в нужный формат, как даты. Прикрепленные файлы
Изменено: StepanWolkoff — 29.06.2021 16:55:25 |
||
Suvik Пользователь Сообщений: 17 |
#23 29.06.2021 17:18:34
Наверно достал уже)) Но с синтаксисом проблемы. Первый аргумент — таблица, потом название столбца, потом на что меняем этот столбец. Если всё правильно понял. Но как прописать формат даты в этой функции? Изменено: Suvik — 29.06.2021 17:19:17 |
||
StepanWolkoff Пользователь Сообщений: 1252 |
#24 29.06.2021 17:28:52 Suvik, да пожалуйста. Еще раз выделил желтым, чтобы не забывали выбирать Custom Export Format, чтобы убрать кавычки вокруг текста
Прикрепленные файлы
Изменено: StepanWolkoff — 29.06.2021 17:30:09 |
||
Suvik Пользователь Сообщений: 17 |
#25 30.06.2021 11:20:17
Новый день новые проблемы. Путем выполнения запроса экспорт ведется в кодировке, которая не воспринимает кириллицу. Если сохранять не дефолтным форматом, а выбирать нужную кодировку, то появляются кавычки. В принципе их можно будет убрать потом общей заменой в блокноте. Если в запросе это можно будет прописать, то тоже хорошо Изменено: Suvik — 30.06.2021 16:24:42 |
||
Recently I found a PowerQuery gem, trick with Java/VB Script that allows to export data from Power Query to CSV without R / DAX Studio / SMS and Registration. However, related with risk. As everything else in our life.
Kudos to user Shi Yang from Stack Overflow who replied to How to write to DATA sources with Power Query?.
Shi proposes to use following code (extended with my comments)
Let // reference to a query you wish to export to CSV Source = ReferenceToYourTableOrQuery, // demote headers to have headers in resulting CSV // if you don't need headers, remove Table.DemoteHeaders Json = Text.FromBinary(Json.FromValue(Table.ToRows(Table.DemoteHeaders(Source)))), // trigger execution of script Export = Web.Page(" var fso=new ActiveXObject('Scripting.FileSystemObject'); var f1=fso.CreateTextFile('C:/Temp/test.csv',true); var arr=" & Json & "; f1.WriteLine(arr.join('n')); f1.WriteBlankLines(1); f1.Close(); ") in Export
All great, but this method doesn’t work with default settings of Internet Explorer.
Yes… yes… IE is involved somehow.
To make it work, you need to open IE, go ‘Internet options‘
Tab ‘Security‘ then ‘Custom level…‘
Find setting ‘Initialize and script ActiveX controls not marked as safe for scripting (not secure)
Unfortunately, this is a risky option, as it potentially allows to execute any script on your workstation.
But if you really need to export something to CSV… you probably allowed to change this setting on your corporate laptop… right?
For your convenience, IE will show notification about security risk each time when you open it
You may click ‘Fix settings for me‘ to restore secure configuration.
Proposed code is basically a script that writes text file using CreateTextFile method
Export = Web.Page(" var fso=new ActiveXObject('Scripting.FileSystemObject'); var f1=fso.CreateTextFile('C:/Temp/test.csv',true); var arr=" & Json & "; f1.WriteLine(arr.join('n')); f1.WriteBlankLines(1); f1.Close(); ")
Script creates FileSystemObject needed to work with files as with objects, then creates TextFile (with overwrite option = true).
Then saves prepared Json into variable, adds line breaks and finally writes everything into text file.
Data Volume
First thing I did – tried to export something not small but not too big. It was a table about 200k rows and 15 columns. Script successfully exported data. Then I doubled volume – went well, tripled – no CSV file were created.
Obviously, limit on data volume exists. Json can’t be infinite large.
I also tried to export table with over one million of rows but got ‘Out of memory’ message.
It is clear that we will need paging if we want to export huge tables.
And when I hear ‘paging’ I think about List.Generate.
Pagination
Instead of CreateTextFile we will need OpenTextFile method, that also allows to create file, but in addition allows to append to existing file.
Idea of test – take a small table and try to record it to CSV several times.
What if Power Query will be so fast that create a conflict while recording to file, e.g. if PQ create multiple threads? – i thought.
And I decided to add a delay between appending.
We can start with a function
let fScriptFunction = (tbl as table, FilePath as text) => let ForAppending = 8, Json = Text.FromBinary(Json.FromValue(Table.ToRows(Table.DemoteHeaders(tbl) ) ) ), Export = Web.Page(" var fso=new ActiveXObject('Scripting.FileSystemObject'); // var objFile=fso.OpenTextFile('" & FilePath & "', " & Text.From(ForAppending) & ", true); // <- with create new file // without creation of new file -> var objFile=fso.OpenTextFile('" & FilePath & "', " & Text.From(ForAppending) & "); var arr=" & Json & "; objFile.WriteLine(arr.join('n')); objFile.WriteBlankLines(1); objFile.Close(); ") in Export, // Initial parameters ResultingFilePath = "C:/Temp/test.csv", buffer = Table.Buffer( MyTable ), // MyTable is another query in workbook Delay = 1, TestVolume = List.Generate( ()=> [i=1, Tbl=buffer, dummy=null, time=null ], each // do while [i] < 10, each // just write to CSV each time let /// your complex logic // export = fScriptFunction( buffer, ResultingFilePath ) export = Function.InvokeAfter( ()=> fScriptFunction( buffer, ResultingFilePath ), #duration(0,0,0,Delay) ) in [ i=[i]+1, Tbl = buffer, // could be table range // skip first N rows dummy = export, // to trigger script time = DateTime.LocalNow() ], each // result of iteration [ [i], [Tbl], [dummy], [time]] ), #"Converted to Table" = Table.FromList( TestVolume , Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"dummy", "time"}, {"dummy", "time"}), #"Expanded dummy" = Table.ExpandTableColumn(#"Expanded Column1", "dummy", {"Caption", "Source", "ClassName", "Id", "Data"}, {"Caption", "Source", "ClassName", "Id", "Data"}) in #"Expanded dummy"
However, I couldn’t achieve stable number of rows in resulting file.
Even if I set Delay to 3 seconds or 5, I still get my table written to file two or three or five times.
Had no time to explore this further. Share as is.
I think that in Excel iteration can be done through VBA code that can change code of PQ queries…
You can download my sample file from here.
P.S. – not a single corporate laptop was at risk during writing of this post.
Yeah. Not really aware of a good way. I sometimes will use DAX Studio to export loaded tables to text files.
You could use the Power Query connector in Power Automate then use an export to file in a flow. You can write your Power Query code in Power BI desktop or Excel, then just copy the M code to Power Automate, assuming it has access to the files or data, either via cloud (SharePoint online) or the on prem Gateway.
Did I answer your question? Mark my post as a solution!
Did my answers help arrive at a solution? Give it a kudos by clicking the Thumbs Up!
DAX is for Analysis. Power Query is for Data Modeling
Proud to be a Super User!
MCSA: BI Reporting
Power Query — это инструмент для продвинутого бизнес-анализа, предназначенный для подключения к источникам данных и их преобразования.
Несмотря на то, что данные в Excel можно загружать с помощью инструментов Power Pivot, возможностей для преобразования и доступных источников данных в Power Query намного больше и работа с ними проще. Итак, теперь для обработки таблиц и подключения к данным больше не нужны сложные формулы и макросы.
Power Query в меню Excel
В зависимости от того, какая у вас версия Excel, вид надстройки Power Query может выглядеть по-разному. В Excel 2010 и 2013 надстройка появляется в виде отдельной вкладки «Power Query» (если у вас такой вкладки нет, прочитайте, как ее установить).
В Excel после 2016 года Power Query уже встроен по умолчанию и находится в меню Данные → раздел Получить и преобразовать данные (в некоторых версиях Excel этот раздел называется Скачать & преобразовать).
Работа с данными в Power Query
Power Query умеет:
- напрямую подключаться к данным в различных источниках;
- очищать данные и выполнять преобразования;
- подготовленные данные выгружать на лист, в сводную таблицу или добавлять в модель данных Excel.
Таким образом, Power Query – это полноценный ETL-инструмент (Extract, Transform, Load).
Подключение к данным в Power Query
В Power Query можно подключать данные из самых разных источников: таблицы в самом файле и других Excel-файлах, текстовые/csv файлы, папки, базы данных, источники в интернете, файлы xml и json, pdf-файлы, данные из канала OData и так далее. А также загрузить данные из Power BI и написать запрос с нуля – Пустой запрос.
Чтобы посмотреть, какие именно источники данных доступны в Excel, перейдите на вкладку Данные → Получить данные (или Создать запрос, если у вас не новая версия Excel).
Для примера добавим в Power Query данные из таблицы.
- Выделите любую таблицу на листе Excel и перейдите в меню:
— в Excel 2010 и 2013: вкладка Power Query → Из таблицы (или С листа).
— для Excel после 2016: меню Данные → Из таблицы (Из таблицы/диапазона).
В открывшемся окне поставьте галочку «Таблица с заголовками».
Таблица с данными при этом превратится в «умную» smart-таблицу.
- Откроется окно редактора запросов, в котором будет наша таблица. Нажимаем кнопку в меню Главная → Закрыть и загрузить. Готово!
Чтобы открыть список запросов, нажмите в меню Данные → Запросы и подключения. В открывшейся вкладке «Запросы и подключения» отобразится список всех запросов, созданных в файле.
Редактор запросов Power Query
Разберем подробнее интерфейс редактора запросов Power Query.
Если окно редактора у вас закрыто, откройте его в меню Данные → Получить данные → Запустить редактор запросов. Или щелкните 2 раза мышкой по названию запроса на вкладке Запросы и подключения.
Итак, в редакторе Power Query есть:
- Лента редактора запросов для вкладок меню: Главная, Преобразование, Добавить столбец, Просмотр.
- Перечень созданных запросов, который можно свернуть / развернуть.
- Строка формул.
- Название самого запроса.
- Примененные шаги запроса: записанные шаги получения или преобразования данных. Их можно редактировать, выбирая в списке, изменять последовательность шагов, добавлять новые или удалять.
- Область предварительного просмотра, в которой выводится результат преобразования данных для каждого шага.
- Меню для данных, которое открывается при нажатии правой кнопкой мышки.
- При выборе правой кнопкой мыши названия шага появляется его контекстное меню.
Преобразование данных
Посмотрим на простом примере, как преобразовать данные в Power Query.
Допустим, у нас есть таблица с выручкой и расходами по городам за несколько лет. В таблице эти показатели разделены на две группы. Столбец с городами тоже имеет группировки (смотрите рисунок).
Если вы знакомы со сводными таблицами, то знаете, что построить сводную на основе таких данных не получится. Привести их в «нужный вид» можно в Power Query буквально за несколько щелчков мышкой:
- выделите таблицу (можно выделить таблицу целиком или одну из ячеек);
- выберите в меню Данные → Из таблицы (Из таблицы/диапазона);
- в появившемся окне поставьте галочку рядом с «Таблица с заголовками» → ОК;
- в открывшемся редакторе запросов выделите столбцы «показатель» и «город», нажав мышкой на названия столбцов с зажатым Ctrl;
- в меню нажмите Преобразование → Заполнить → Вниз.
- Готово! Пустые строки заполнены значениями из ячеек сверху.
При создании запроса Power Query сам автоматически записывает его шаги. Их можно увидеть в области справа Параметры запроса → Примененные шаги.
Шаги запроса можно редактировать, выбирая мышкой (таблица в области предварительного просмотра при этом тоже изменится). Ненужные шаги удаляются при нажатии на «крестик». Можно добавлять новые шаги в середину запроса или менять их местами, перемещая мышкой.
Обработка данных в Power Query выполняется последовательно, шаг за шагом, и каждое последующее действие использует результаты предыдущего. Поэтому при добавлении новых шагов или изменении их последовательности обязательно проверьте, все ли в порядке со следующими операциями. Проверить, все ли в порядке, можно, нажав на самый нижний шаг.
Кроме простых операций с данными, Power Query умеет выполнять и другие действия: сортировать, фильтровать, заменять, группировать, заполнять пустые значения, удалять дубликаты, работать с текстом и числами, выполнять простые вычисления, транспонировать таблицы и разворачивать их столбцы, объединять данные и многое-многое другое.
Строка формул и расширенный редактор
Код запроса, который вы создаете в Power Query, автоматически записывается на языке M. Это не значит, что обязательно потребуется писать код – большинство операций по преобразованию данных можно выполнить только с помощью кнопок меню.
Формулы Power Query выводятся в строке формул. По умолчанию эта строка скрыта, ее включают на вкладке Просмотр → Строка формул.
Чтобы посмотреть все формулы, здесь же на вкладке Просмотр нажмите на кнопку Расширенный редактор. В открывшемся окне появится полный текст запроса.
Типы данных Power Query
Определение типов данных – важная часть каждого запроса Power Query. Обычно типы данных задают в конце запроса после всех преобразований:
- в меню Главная → Тип данных или Преобразование → Определить тип данных;
- нажать мышкой по значку типа данных в названии столбца;
- определить тип даты на вкладке Преобразование → Дата → Выполнить анализ.
Перед сохранением запроса проверьте, все ли типы данных заданы правильно. Это сэкономит время на поиск ошибок. А вот шаг «Измененный тип», который автоматически проставляется в середине запроса, лучше удалить.
Импорт данных из Power Query
Итак, данные преобразованы. Что делать с ними дальше? В Power Query доступно несколько вариантов импорта данных.
Способы импорта можно задать при сохранении запроса Главная → Закрыть и загрузить в…
… А если запрос уже сохранен – в списке на вкладке Запросы и подключения. Щелкните по названию запроса правой кнопкой мышки и выберите в меню Загрузить в
Excel предлагает пользователям на выбор несколько вариантов импорта данных (вид окна импорта может отличаться в зависимости от версии Excel):
- Выгрузка на лист: выберите способ представления данных → Таблица, поместить данные на лист. На листе будет создана «умная» smart-таблица с данными из Power Query.
- Сводная таблица или сводная диаграмма: способ представления → Отчет сводной таблицы или Сводная диаграмма. Данные будут импортированы в виде сводной таблицы.
- Только подключение: выберите Только создать подключение. Запрос будет сохранен.
- Добавить данные в модель данных: при нажатии галочки «Добавить эти данные в модель данных» результаты выполнения запроса будут добавлены в модель Power Pivot.