So many cool Fabric features get announced at Fabcon that it’s easy to miss some of them. The fact that you can now not only generate Excel files from Fabric Dataflows Gen2, but that you have so much control over the format that you can use this feature to build simple reports rather than plain old data dumps, is a great example: it was only mentioned halfway through this blog post on new stuff in Dataflows Gen2 Nonethless it was the Fabcon feature announcement that got me most excited. This is because it shows how Fabric Dataflows Gen2 have gone beyond being just a way to bring data into Fabric and are now a proper self-service ETL tool where you can extract data from a lot of different sources, transform it using Power Query, and load it to a variety of destinations both inside Fabric and outside it (such as CSV files, Snowflake and yes, Excel).
The documentation for the new Excel destination, which you can find here, is extremely detailed indeed so I thought it would be useful to show a simple example of how you can now use Dataflows Gen2 to build an Excel report. First of all I created a query using the Enter Data source that returned a table with some sales data in:
let Source = Table.FromRows( Json.Document( Binary.Decompress( Binary.FromText( "i45WciwoyEktVtJRMlWK1YlW8i9KzEsH8w0NwAIBqYlFYK4RmOtelFgAkbZUio0FAA==", BinaryEncoding.Base64 ), Compression.Deflate ) ), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Product = _t, Sales = _t] ), #"Changed column type" = Table.TransformColumnTypes( Source, {{"Product", type text}, {"Sales", Int64.Type}} )in #"Changed column type"

I then created a query called ReportTitle that contained the text for my report’s title:
let Source = #table({"Title"},{{"My Sales Report"}})in Source

…and a query called FruitSalesOverview that passes the data from the FruitSales query to the FabricAI.Prompt M function to generate a text summary of it:
let Source = FabricAI.Prompt("Summarise the fruit sales data in 20 words or less", FruitSales), ToTable = #table({"Summary"}, {{Source}})in ToTable

The last query I created, called Output, generated a navigation table in the format described in the docs to describe the Excel output: the report title in a range starting in cell B1, the report summary in a range starting in cell B3, the sales data in a table starting in cell B5 and a bar chart showing the sales data.
let excelDocument = #table( type table [ Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any ], { // Report title {"Sales", "Title", "Range", [StartCell = "B1", SkipHeader = true], ReportTitle}, // Copilot-generated summary {"Sales", "Summary", "Range", [StartCell = "B3", SkipHeader = true], FruitSalesOverview}, // Table containing sales data { "Sales", "SalesTable", "Table", [StartCell = "B5", TableStyle = "TableStyleMedium9"], FruitSales }, //Column chart containing sales data { "Sales", "SalesChart", "Chart", [ ChartType = "Column", ChartTitle = "Fruit Sales", DataSeries = [AxisColumns = {"Product"}, ValueColumns = {"Sales"}] ], #table({}, {}) meta [Name = "SalesTable"] } } )in excelDocument

I then set the Data Destination of the Output query to use the New File option to create an Excel file and save it to the Files section of a Fabric Lakehouse. The use of the Advanced format option meant that the navigation table returned by the Output query was used to determine the structure of the resulting Excel file.

After refreshing the Dataflow I downloaded the resulting Excel workbook from my Lakehouse. Here’s what it looked like:

Pretty fun. Does it give you full control over the format of the Excel file? No, not quite. Is it a somewhat code-heavy approach? Yes, but I suppose in the age of AI that doesn’t matter so much since you’re unlikely to write your own code (although, being old-school, I adapted the code above from the docs manually). Most importantly: is this a better way of dumping data to Excel and/or generating simple Excel reports in Fabric than paginated reports? Good question, especially since Power Query is now available in paginated reports. I suspect the answer is that although paginated reports are harder to build (though you can generate rdl with AI too, I’ve done it) and that it’s harder to control what a paginated report rendered as an Excel file looks like, paginated reports may still have the edge if you want an Excel report but I’m not sure – factors like CU cost and how long it takes to generate an Excel file using each approach would also need to be taken into account. If you just want to dump data to Excel, however, Dataflows Gen2 are probably a better option now.
























































