Export Power BI data with semicolon (;) using Power Automate

power bi power automate export data with semicolon

Power BI offers many options for exporting and sharing data, but sometimes users run into small, yet frustrating limitations. One such limitation is the export format of CSV files. By default, Power BI exports CSV files with a comma (,) as the delimiter. However, in many regions – especially across Europe – the standard delimiter is a semicolon (;).

Unfortunately, Power BI does not provide an out-of-the-box option to change the delimiter. This can cause challenges when opening CSV files in Excel, as the data may not split correctly into columns.

The good news is: with Power Automate, you can easily solve this problem! In this guide, I’ll show you how to build a simple automated flow that exports your Power BI data with semicolons instead of commas.

What is Power Automate?

Power Automate (previously known as Microsoft Flow) is a cloud-based automation service that allows you to connect different apps and services. You can use it to:

  1. Automate repetitive tasks (like sending emails or notifications)
  2. Move data between apps and services (like exporting from Power BI to OneDrive)
  3. Create scheduled processes (like refreshing and distributing reports)

In our case, we’ll use Power Automate to convert a standard Power BI CSV export into a semicolon-delimited file -automatically, with no manual intervention.

Licensing Requirements

To use this solution, you’ll need:

  • Power BI Pro (or Premium per user, depending on license you use in Power BI Service) – because you’ll be connecting to your semantic model in Power BI Service via Power Automate.
  • Power Automate license – most Microsoft 365 business plans include Power Automate in the package. If you already use Office 365 at work, you likely already have access.

✅ In most cases, if you already have Power BI Pro in your tenant, you’ll be able to follow along without additional purchases.

Prerequisites

Before starting, make sure you have the following:

  1. Power BI semantic model published to the Power BI Service, with data you want to export.
  2. Access to Power Automate in your Microsoft 365 environment.
  3. OneDrive or SharePoint Online (or another storage service) where your exported CSV files will be saved.
  4. Basic familiarity with Power Automate (don’t worry, I’ll walk you through everything step by step).

And now, let’s do it!
Here is summary of steps:

  • 1. Create the flow (Scheduled)
  • 2. Get the DAX Query Using Performance Analyzer
  • 3. Power Automate – Run a query against a dataset (Power BI)
  • 4. Parse JSON (rows). Convert the raw Power BI query results into a structured format that Power Automate can understand
  • 5. Select — rename & order columns. Pick only the columns you need, rename them if necessary, and order them correctly
  • 6. Initialize variable — CSV header line
  • 7. Apply to each — build each CSV row
  • 8. Compose Row. Format the current row as proper CSV text.
  • 9. Append to array variable. Collect all the formatted rows together in a list.
  • 10. Compose – join all lines with newlines for each row
  • 11. Create the CSV file (OneDrive)


Step by step!

  • Power Automate → CreateScheduled cloud flow
  • Name of the flow: Export Power BI to Semicolon CSV
  • Recurrence: set as you like (e.g., Monthly, every 1 month – this can easily be changed)
  • Create

Screenshots:

The Power Automate interface showing the sidebar with options for Home, Create, Templates, and other features.
Options for creating a flow in Power Automate, including Automated cloud flow, Instant cloud flow, and Scheduled cloud flow.
A user interface for creating a scheduled cloud flow in Power Automate, featuring fields for naming the flow, setting the start date, time, and frequency of execution.

Before you can run a query against a dataset in Power Automate, you first need to extract the query from Power BI. This is done using the Performance Analyzer tool inside Power BI Desktop.

How to open Performance Analyzer:

  1. Open your pbix report in Power BI Desktop (report or dataset, no matter – the goal is just to create a visual which will contain all the fields you need for export).
  2. Go to the View tab in the ribbon.
  3. Enable Performance Analyzer. A pane will appear on the right side.

Recording a query:

  1. Click Start Recording in the Performance Analyzer pane.
  2. Click on “Refresh Visuals”.
  3. Once the visual is refreshed, expand that visual within performance analyzer pane (click on “+”) and then click the Copy Query button.
Power BI 'View' menu with selected 'Performance Analyzer' button. A table of product sales data is shown, listing product names, dates, and quantities sold.
Screenshot of a Power BI table displaying product data including 'Product Name', 'Date', and 'Quantity Sold' with a performance analyzer panel showing the option to refresh visuals.
A table displaying product sales data, featuring columns for Product Name, Date, and Quantity Sold, alongside a performance analyzer panel showing the recording status and the option to copy a query.

This will copy the DAX query that Power BI generated in the background. You can paste it into Notepad (or any text editor) for later use.

Things to pay attention to when copying queries:

Fields order – The sequence of columns in your Power BI visual will directly affect the dataset you get back.

Sorting – The order of the fields in your visual determines the order in the query results. If your automation depends on sorted output, make sure the order is correct before copying.

Totals and subtotals – Performance Analyzer will also capture queries for totals. Decide if you need raw detail rows or aggregated totals.

Back to Power Automate. All next steps are done within Power Automate.

Add action (click on “+” sign), and then in search bar type “run a query against a dataset” and then select that option: Power BI → Run a query against a dataset

Screenshot of Power Automate interface showing options to add an action, specifically 'Run a query against a dataset' under the Power BI section.

Firstly you will be asked to authenticate yourself, just use credentials that you use to login to your Power BI Service account. This will enable Power Automate to communicate with Power BI Service.

Fill in parameters:

Workspace: workspace where semantic model (dataset) is published
Dataset: dataset which contains data for export
DAX Query: paste your query as is (query that you copied from Performance Analyzer)

Screenshot of Power Automate interface showing the 'Run a query against a dataset' action with parameters for workspace, dataset, and DAX query.

Add action: Data Operations → Parse JSON

Interface of Power Automate showing the action selection for 'Parse JSON' under the Data Operation section, with the next steps for running a query against a dataset.
  • Content (expression): when you click on content, there will be a little pop-up showing two icons on the right.
    Click on the one below, “Fx” icon.
    Now, on the right side there will appear blank space to paste formula below and then click on Add button:
body('Run_a_query_against_a_dataset')?['results'][0]['tables'][0]['rows']
Screenshot showing the parameters of the Parse JSON action in Power Automate, highlighting the 'Content to create schema from' field.
Screenshot of the Parse JSON action in Power Automate, showing parameters for content and schema.

Schema (use script below as a template; adjust table/column names according to table and columns that you want to export):

{
"type": "array",
"items": {
"type": "object",
"properties": {
"Product[Product Name]": { "type": "string" },
"Fact[Date]": { "type": "date" },
"Fact[Quantity Sold]": { "type": "number" }
}
}
}
  • JSON schema allows these data types:
  • "string"
  • "number"
  • "integer"
  • "boolean"
  • "array"
  • "object"

So, if there is a field Date, mark it as string, not as a date within this schema part.

Flow diagram showing the steps to export Power BI data to a semicolon-delimited CSV file using Power Automate, with an emphasis on the Parse JSON action.


It is time to see if everything is fine, let’s test what we have done until now.
Go to Save and then Test.

A screenshot of a Power Automate flow editor, showcasing three main steps: 1. Recurrence trigger, 2. Action to run a query against a dataset, 3. Parse JSON action.

If there is an error shown on the top after clicking Save button, check the error, see if the error is relevant to step “Run a query against a dataset” or “Parse JSON”.
Probably the issue would be Parse JSON if your layout is a lot different or field type is wrong.
In that case, you can just paste to ChatGPT DAX query generated via Performance Analyzer and ask to convert it to JSON schema for Power Automate.

Testing Power Automate Flow

  • After clicking on Test button, choose option “Manually” because we want to trigger the flow now and click on “Test” button
  • In the next step it will notify you that this flow is connecting to Power BI Service and if needed, you can review connection details (credentials) by clicking on Review connections and actions. Click on button “Run flow”
  • Next step, i am not sure why it is there, you just need to click on button “Done” :)
  • After these steps you will be shown all actions of your flow, on each action there are two labels/icons.
    If everything is fine there will green checkmark icon and besides duration of each step (in seconds).
    If it failed, there will be red X icon. Copy the error and if needed consult with ChatGPT what you should fix.
Screenshot of Power Automate showing the results of a flow running successfully, with inputs and schema details for parsing JSON data from Power BI.

  • On the left side there are two sections, specific for each action:
    INPUTS – each action has parameters used in the action
    OUTPUTS – each action has output, the result – here it shows values of the first row

    Clicking on “Show raw inputs” or “Show raw outputs”, you can actually see the list of all rows (in our cases, rows to be exported).

To get back to editing the flow, on the top right part of Power Automate, just click on button “Edit” and it will open again Edit mode.

Add action: Data Operations → Select

Screenshot of the Power Automate interface, showing the action selector with 'Select' highlighted and options for Microsoft Dataverse and Data Operation actions.
  • From: click on “From” area and it will show you again two icons as in previous step.
    This type, chose the first icon (⚡which represents Dynamic content – output of some of previous steps).
Power Automate interface showing parameters for the 'Select' action with dynamic content options.

Here, select “Body” which is under “Parse JSON” action:

It means that in current action (Select), we are using the result of previous step (Parse JSON).

Power Automate interface showing the 'Select' action parameters with fields for 'From' and 'Map', including a highlighted 'Body' option from previous actions.

Under Map area:
Enter key: here enter the name of the column that you want to appear in the final export. Just type the text.
Enter value: when you click on it, choose “Fx” option, and for each item add formula mapping and then click on “Add” button:

Product Name → item()?['Product[Product Name]']
Date → item()?['Fact[Date]']
Quantity Sold → item()?['[SumQuantity_Sold]']

Why doesn’t Quantity Sold use same logic, example: @item()?['Fact[SumQuantity_Sold]']
I tried and when tested the flow at this step, this column returned null for each row.
Then i checked that output of previous step (Parse JSON) and saw in OUTPUT area that Power Automate didn’t add table prefix for this column.
I didn’t go to much in details, is it because it is aggregated numeric column (not a measure) or something else. But pay attention to this step.
Map columns exactly as they appear in Parse JSON output.

Once you enter mapping formulas, they will appear like this:

Screenshot of Power Automate interface showing the Select action with parameters for mapping Product Name, Date, and Quantity Sold from the body.

Add action: Initialize variable.

Screenshot of Power Automate interface showing the option to initialize a variable.
  • Name: csvLines
  • Type: Array
  • Value: [“Product Name;Date;Quantity Sold”]
Screenshot of Power Automate interface showing the initialization of a variable named 'csvLines' with type 'Array' and a value of 'Product Name;Date;Quantity Sold'.

Add action: Apply to each

Screenshot showing the Power Automate interface with an action search bar where 'apply' is typed, highlighting the 'Apply to each' action in the list.
  • Items: choose output of Select. To find it, click the first icon (⚡which represents Dynamic content – output of some of previous steps).
Power Automate interface showing the 'Apply to each' action with parameters and output selection for CSV export from Power BI.

Add action: Compose.
Important note: this step is within “Apply to each” part.

Screenshot of the Power Automate interface showing the action selection for 'Compose' within a flow that exports Power BI data.
Click on inputs, click on "Fx" button. Past script below and click on "Add" button.
concat(
'"', replace(string(item()?['Product Name']), '"','""'), '";',
'"', replace(string(item()?['Date']), '"','""'), '";',
'"', replace(string(item()?['Quantity Sold']), '"','""'), '"'
)
Interface of Power Automate showing the 'Compose' action with parameters including a concat function for generating a CSV row.

Add action: Append to array variable.
Important note: this step is within “Apply to each” part.

Screenshot of Power Automate interface showing the action 'Append to array variable' in the process of building a flow for exporting Power BI data.
  • Name: csvLines
  • Value: Compose > Outputs
Power Automate interface for appending to an array variable named 'csvLines', including options to select outputs from previous steps.

Add action: Compose (name: Compose_CSV_Text).
Important note: this step is outside of “Apply to each” part.

Screenshot of Power Automate interface showing the 'Add an action' section with various options including 'Compose' for creating data operations.
Click on Inputs and then choose "Fx" button.
Paster formula below and click on "Add" button.
join(variables('csvLines'), decodeUriComponent('%0A'))
Screenshot of the Power Automate interface showing the Compose action for joining CSV lines with a newline delimiter.

decodeUriComponent(‘%0A’) creates new line for each row in data.

Ok, that is it regarding data preparation.
Now, we can choose where to export data.
Power Automate offers different options:
1. create file on local pc
2. create file on OneDrive
3. create file on Sharepoint…

In my scenario, i will use OneDrive.

Add action: OneDrive for Business → Create file (or SharePoint → Create file)

Screenshot showing the Power Automate interface for creating a file action in OneDrive for Business.
  • Folder Path: /Documents (or your folder)
  • File Name (static): export_semicolon_final.csv
  • File Content: use dynamic content (⚡) and select Compose > Outputs.
Screenshot of the Power Automate interface showing the 'Create file' action. It displays parameters including Folder Path set to '/Documents', File Name set to 'export_semicolon_final.csv', and a section for File Content which highlights the dynamic content being used.

That’s it!
Save the flow and run it.
If everything is fine, you will have green checkmarks for each step.
If not, check the error under step which shows the error.

Screenshot of a Power Automate flow titled 'Export Power BI to Semicolon CSV' showing successful execution with steps including Initialize variable, Apply to each, Compose, Append to array variable, and Create file.


Finally, let’s go to OneDrive to see if the file has been created.
If yes, download it and open in Notepad to see if it looks correct.

Screenshot of OneDrive interface displaying the file 'export_semicolon_final.csv' highlighted in the Documents folder.


Here is the export layout in notepad.
If you open it in Excel, you will be able to split data to columns using “;” delimiter.

A screenshot showing a CSV file content with headers 'Product Name', 'Date', and 'Quantity Sold', and several rows of data formatted with semicolon delimiters.

Home this post will help you solve issues with exporting data from Power BI using semicolon delimiter.

Again to mention, Power Automate is here to automate the work.
If i set it to run each day, export file will be updated every day.
Enjoy!

Leave a comment