Tutorial: Convert a Tableau Workbook to a Power BI Report (.pbix)¶
A step-by-step, hands-on guide for converting a Tableau workbook end-to-end — from data source analysis through published report with RLS.
Prerequisites¶
- Tableau Desktop installed (to inspect the source workbook)
- Power BI Desktop installed (latest version)
- Access to the data sources used by the Tableau workbook
- Familiarity with the Calculation Conversion Reference
- Familiarity with the Visualization Migration guide
Estimated time: 3-4 hours for a medium-complexity workbook (5-10 worksheets, 5-15 calculated fields, no LOD expressions). Add 2-4 hours for workbooks with LOD expressions or complex table calculations.
Overview of the conversion process¶
flowchart LR
A[Step 1<br/>Document] --> B[Step 2<br/>Connect Data]
B --> C[Step 3<br/>Build Model]
C --> D[Step 4<br/>Convert Calcs]
D --> E[Step 5<br/>Build Visuals]
E --> F[Step 6<br/>Format]
F --> G[Step 7<br/>Configure RLS]
G --> H[Step 8<br/>Publish] Step 1: Document the existing Tableau workbook¶
Before opening Power BI Desktop, thoroughly document the Tableau workbook you are converting. This inventory is the migration specification.
1.1 Workbook metadata¶
Create a document (spreadsheet or markdown) with:
Workbook Name: [e.g., "Regional Sales Dashboard"]
Tableau Server Location: [URL and project path]
Owner: [Who created/maintains it]
Last Modified: [Date]
Usage: [Views per week from Tableau Server admin]
Priority: [High / Medium / Low]
Complexity: [Simple / Medium / Complex]
1.2 Data source inventory¶
Open the workbook in Tableau Desktop and document each data source:
| Data source | Connection type | Server/file | Database | Tables used | Custom SQL? | Extract or Live? |
|---|---|---|---|---|---|---|
| [Name] | [SQL Server / Snowflake / CSV / etc.] | [Server name] | [DB name] | [Table list] | [Yes/No] | [Extract/Live] |
1.3 Calculated field inventory¶
Document every calculated field in the data source:
| Field name | Type | Formula | Complexity | DAX approach |
|---|---|---|---|---|
| [Name] | [Dimension / Measure] | [Tableau formula] | [Simple / LOD / Table Calc] | [Measure / Calc Column / Power Query] |
1.4 Worksheet inventory¶
Document each worksheet in the workbook:
| Worksheet | Chart type | Rows shelf | Columns shelf | Color | Size | Detail | Filters | Table calc? |
|---|---|---|---|---|---|---|---|---|
| [Name] | [Bar / Line / etc.] | [Fields] | [Fields] | [Field] | [Field] | [Fields] | [Fields] | [Yes/No] |
1.5 Dashboard inventory¶
Document each dashboard:
| Dashboard | Worksheets included | Actions (filter/highlight/URL) | Parameters | Device layouts? |
|---|---|---|---|---|
| [Name] | [List] | [Action details] | [Parameter list] | [Yes/No] |
This step feels slow but saves time overall
Skipping documentation leads to discovering missing calculated fields and broken filters at the end of the conversion when fixing them is expensive. Invest 30-60 minutes upfront.
Step 2: Connect Power BI to the same data sources¶
2.1 Open Power BI Desktop¶
Launch Power BI Desktop. Save the file immediately as [WorkbookName].pbix in your working directory.
2.2 Connect to data sources¶
For each data source in your inventory:
- Home → Get Data → select the appropriate connector
- Enter server, database, and credentials
- Select the same tables used by the Tableau workbook
- If the Tableau workbook uses Custom SQL, decide:
- Preferred: Create a dbt view or database view with the same logic, then connect to the view
- Alternative: Use Power Query's "Advanced Editor" to enter a native SQL query
2.3 Apply source-level filters¶
If the Tableau workbook has data source filters (e.g., date range filters), apply equivalent filters in Power Query:
// Example: Filter to last 3 years of data
= Table.SelectRows(Source, each [OrderDate] >= Date.AddYears(DateTime.LocalNow(), -3))
2.4 Light data shaping in Power Query¶
Perform only minimal shaping in Power Query:
- Rename columns to business-friendly names
- Set correct data types (dates, numbers, text)
- Remove unnecessary columns
- Handle null values if needed
Do not put business logic in Power Query
Business calculations belong in DAX measures, not Power Query. Power Query should handle data connectivity and basic shaping only.
Step 3: Build the semantic model (tables and relationships)¶
3.1 Design the star schema¶
Tableau is forgiving with flat, denormalized tables. Power BI performs best with a proper star schema.
- Identify fact tables — tables with numeric measures (sales transactions, events, logs)
- Identify dimension tables — tables with descriptive attributes (customers, products, dates, regions)
- Create relationships — in Model view, drag primary keys from dimensions to foreign keys in fact tables
// Star schema example:
//
// [DimDate] ----1:*---- [FactSales] ----*:1---- [DimProduct]
// |
// *:1
// |
// [DimCustomer]
3.2 Create a date table¶
If the Tableau workbook uses date calculations, create a dedicated date table:
// In Power BI Desktop: Modeling → New Table
Calendar =
ADDCOLUMNS(
CALENDARAUTO(),
"Year", YEAR([Date]),
"Quarter", "Q" & FORMAT([Date], "Q"),
"Month Number", MONTH([Date]),
"Month Name", FORMAT([Date], "MMMM"),
"Month Short", FORMAT([Date], "MMM"),
"Week Number", WEEKNUM([Date]),
"Day of Week", FORMAT([Date], "dddd"),
"Year-Month", FORMAT([Date], "YYYY-MM")
)
Mark the Calendar table as a Date table: select the table → Table tools → Mark as date table → select the Date column.
3.3 Define relationships¶
In Model view:
- Create 1:many relationships from dimension primary keys to fact foreign keys
- Set cross-filter direction to Single (dimension filters fact) unless you have a specific reason for bi-directional
- Ensure no circular or ambiguous relationships exist
3.4 Hide technical columns¶
Hide columns that end users should not see in reports:
- Foreign key columns (e.g., CustomerID in the fact table when CustomerName is in the dimension)
- Technical columns (ETL timestamps, hash keys)
- Columns used only in relationships
Right-click the column → Hide in report view.
Step 4: Convert calculations to DAX¶
4.1 Triage the calculations¶
Using your calculated field inventory from Step 1, categorize each calculation:
| Category | Approach | Priority |
|---|---|---|
| Simple aggregates (SUM, AVG, COUNT) | DAX measure | Do first |
| Row-level calculations (math, string, date) | DAX calculated column or Power Query | Do second |
| LOD expressions (FIXED, INCLUDE, EXCLUDE) | DAX measure with CALCULATE | Do third (hardest) |
| Table calculations (RUNNING_SUM, RANK, etc.) | DAX measure with WINDOW or time intelligence | Do fourth |
| Parameters | What-If parameters or field parameters | Do last |
4.2 Create base measures¶
Start with the simplest measures. Every semantic model needs these:
Total Sales = SUM(Sales[Amount])
Total Quantity = SUM(Sales[Quantity])
Total Profit = SUM(Sales[Profit])
Order Count = COUNTROWS(Sales)
Customer Count = DISTINCTCOUNT(Sales[CustomerID])
Avg Order Value = DIVIDE([Total Sales], [Order Count])
Profit Margin = DIVIDE([Total Profit], [Total Sales])
4.3 Convert LOD expressions¶
Refer to Calculation Conversion Reference Section 1 for patterns. Key approach:
// Tableau: { FIXED [Customer ID] : SUM([Sales]) }
// DAX:
Customer Total Sales =
CALCULATE(
SUM(Sales[Amount]),
ALLEXCEPT(Sales, Sales[CustomerID])
)
4.4 Convert table calculations¶
Refer to Calculation Conversion Reference Section 2 for patterns.
4.5 Validate each measure¶
For every converted measure:
- Create a temporary table visual in Power BI with the same dimensions as the Tableau worksheet
- Compare the Power BI measure values against the Tableau calculated field values
- Spot-check at multiple grain levels (grand total, by region, by month, by product)
- Document any discrepancies and investigate
Validate measures before building visuals
Building visuals on incorrect measures creates rework. Validate every measure in a matrix or table visual first, then build the charts.
Step 5: Rebuild visualizations¶
5.1 Create report pages¶
For each Tableau dashboard, create a Power BI report page:
- Name the page to match the Tableau dashboard name
- Set page size if the Tableau dashboard uses a fixed size (File → Page setup)
- Consider Power BI's default 16:9 canvas or match the Tableau pixel dimensions
5.2 Build visuals¶
For each Tableau worksheet on the dashboard:
- Refer to Visualization Migration for the chart type mapping
- Insert the appropriate Power BI visual
- Drag fields to the correct wells (Axis, Values, Legend, Tooltips)
- Apply the validated DAX measures from Step 4
5.3 Configure interactions¶
By default, Power BI cross-filters all visuals on a page. To match Tableau behavior:
- Select a visual
- Format → Edit interactions
- For each target visual, choose:
- Filter (matches Tableau filter action)
- Highlight (matches Tableau highlight action)
- None (no interaction)
5.4 Add drillthrough pages¶
For Tableau "Go to Sheet" actions:
- Create a detail page
- Add a field to the Drillthrough well on the detail page
- Users right-click a data point on the source page → Drillthrough → detail page
5.5 Add slicers¶
Convert Tableau quick filters to Power BI slicers:
| Tableau filter | Power BI slicer |
|---|---|
| Single value dropdown | Slicer → Dropdown mode |
| Multi-value checkbox | Slicer → List mode |
| Date range | Slicer → Between (date range) |
| Relative date | Slicer → Relative date |
| Search box | Slicer → enable Search |
Step 6: Apply formatting and interactivity¶
6.1 Apply a theme¶
Create or apply a Power BI theme that matches your organization's branding:
- View → Themes → Browse for themes → select a JSON theme file
- Or customize the default theme in View → Themes → Customize current theme
6.2 Format individual visuals¶
For each visual:
- Set title text and formatting
- Configure data labels (position, font, format)
- Set axis labels and ranges
- Configure legend position
- Apply conditional formatting where the Tableau workbook uses color encoding
6.3 Add interactivity features¶
| Feature | How to add |
|---|---|
| Bookmarks | View → Bookmarks → Add bookmark for filter states |
| Buttons | Insert → Button → configure action (bookmark, page nav, URL) |
| Page tooltips | Create a tooltip-type page, assign to visuals |
| Report page navigator | Insert → Navigator → Page navigator |
Step 7: Configure row-level security¶
If the Tableau workbook uses user-based data filtering:
7.1 Create RLS roles¶
- Modeling → Manage Roles
- Create a new role (e.g., "RegionFilter")
- Select the table to filter
- Enter the DAX filter expression:
// If Tableau uses: [Region] = USERNAME()
// Power BI RLS:
[Region] = USERPRINCIPALNAME()
// If Tableau uses group-based security:
CONTAINS(
SecurityMapping,
SecurityMapping[UserEmail], USERPRINCIPALNAME(),
SecurityMapping[Region], Sales[Region]
)
7.2 Test RLS¶
- Modeling → View as → select role
- Verify that the report shows only the filtered data
- Test with multiple roles and user combinations
Step 8: Publish and validate¶
8.1 Publish to Power BI Service¶
- Home → Publish
- Select the target workspace
- Wait for the upload to complete
8.2 Configure in Power BI Service¶
After publishing:
- Navigate to the workspace in Power BI Service
- Configure dataset settings:
- Data source credentials
- Gateway connection (if on-prem sources)
- Scheduled refresh
- Assign RLS roles to users/groups:
- Dataset → Security → add members to roles
8.3 Side-by-side validation¶
Open both the Tableau dashboard and the Power BI report side by side:
- Grand total measures match
- Measures match by Region (or primary dimension)
- Measures match by Date (monthly, quarterly, yearly)
- Filter interactions produce the same results
- Drill-down behavior is correct
- RLS filters data correctly for test users
- Subscriptions and alerts are configured
- Mobile layout is acceptable
8.4 Get user sign-off¶
Before decommissioning the Tableau workbook:
- Share the Power BI report with the workbook owner
- Ask them to validate against their known-good numbers
- Address any discrepancies
- Get formal sign-off
8.5 Update navigation¶
- If using a Power BI App, add the report to the App
- Update any bookmarks, links, or portal pages that reference the Tableau workbook
- Add a redirect notice on the Tableau workbook: "This dashboard has moved to Power BI"
Common issues during conversion¶
| Issue | Cause | Solution |
|---|---|---|
| Numbers don't match | Different aggregation grain or filter context | Use a matrix visual to compare at multiple grains; check CALCULATE usage |
| Visual looks different | Tableau mark-based vs Power BI field-based rendering | Accept the difference; focus on analytical equivalence, not pixel parity |
| Performance is slow | Too many visuals or large Import dataset | Reduce visual count; use Direct Lake or aggregation tables |
| DAX error: circular dependency | Calculated column references a measure | Separate calculated columns (static) from measures (dynamic) |
| Missing chart type | No native Power BI visual for this chart | Check AppSource for custom visuals |
| Filter behavior is wrong | Default cross-filter vs Tableau actions | Configure Edit Interactions for each visual |
Last updated: 2026-04-30 Maintainers: CSA-in-a-Box core team Related: Calculation Conversion | Visualization Migration | Feature Mapping | Migration Playbook