Frequently Asked Questions (FAQ) - Profitbase/PowerBI-visuals-FinancialReportingMatrix GitHub Wiki
This is an exhaustive FAQ for the Financial Reporting Matrix Power BI custom visual by Profitbase, covering everything from installation and licensing to rows, columns, formatting, formulas, features, and theming. Every answer is grounded in the official wiki documentation and links to the full wiki page for deeper reading.
Tip
Use Ctrl + F (Windows) or β + F (Mac) to search this page for a keyword. Features marked Premium require a paid license β see Use Premium features. Still stuck? See Get help.
- Getting started, licensing & support
- Data & structure
- Rows
- Columns
- Values & number formatting
- Calculations & formula functions
- Report features
- Theming
The Getting Started page points you to four resources:
- Get the visual β how to install the visual (wiki page).
- Use Premium features β licensing (wiki page).
- Video tutorials (wiki page).
- Get help (wiki page).
All documentation lives on the wiki of the GitHub repo Profitbase/PowerBI-visuals-FinancialReportingMatrix.
Learn more: Getting started
There are two options:
-
Option 1 β AppSource: Download from Microsoft AppSource (
https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA200000642?tab=Overview), or get it directly from AppSource inside Power BI Desktop or Power BI Web. -
Option 2 β Download the latest version (
.pbivizfile) from GitHub or Profitbase: Use the GitHub releases page (https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/releases) orhttps://www.profitbase.com/powerbi.
The wiki page also includes a 5-image screenshot walkthrough titled "Steps to add the visual to Power BI".
Learn more: Getting the visual
GitHub or the Profitbase website (https://www.profitbase.com/powerbi) β the most recent version is available there long before it appears on AppSource. AppSource lags behind.
Learn more: Getting the visual
It is a two-step process:
- Go into your Power BI admin portal and register the visual as an Organizational visual.
- In your development tool (Power BI Desktop or Service), choose "Get more visuals" from the Visualizations pane and import the visual from "Organizational visuals" instead of AppSource.
Important: "DO NOT try to import the visual from file to Power BI Desktop or Power BI Service. Power BI will just pull down the latest version from AppSource and ignore the file." You must go via the Organizational visuals route instead.
Learn more: Getting the visual
Adding the visual as an Organizational visual has three benefits: (1) you control versioning of visuals, (2) you can add versions not yet available in production, and (3) you can add the visual to the visualization pane for everyone in your organization by default.
Requirement: you need admin rights in Power BI. Microsoft's official documentation on Organizational visuals is at https://learn.microsoft.com/en-us/fabric/admin/organizational-visuals#add-a-visual-from-a-file.
Steps:
- Download the visual file (format:
.pbiviz). Pre-releases are available athttps://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/releases. - Go to
https://app.powerbi.com/and sign in. - Click the settings symbol (gear) in the top right, then select "Admin portal".
- Select "Organizational visuals" and click "Add visual", then select "From file".
- Browse for the downloaded file, give it a name, optionally update the icon, then click "Add".
- If you select the visual, you can click "Enable for Vizualization Pane" β this makes the organizational visual appear by default in the visualization pane for all users in your organization.
- If you don't enable it, find it in Power BI by clicking "Get more visuals" and selecting the "Organizational visual" tab.
Learn more: Add visuals as Organizational visuals
Yes β you will see two versions side by side (one from AppSource, one from the Organizational visual) and can choose which to use. To switch a report visual from one to the other: select the visual on your report page, then select the other visual in the format pane.
Learn more: Add visuals as Organizational visuals
In Power BI Desktop, open the visual's "About" pop-up window, which shows information about the visual:
- Traditional layout: Right-click the visual you want to check in the "build a visual" pane and click "about".
- On-object Interaction: If you have selected "on-object interaction" in the preview features section, right-click the visual and click "about" in the build a visual pane β not the insert-visual section in the home ribbon.
Learn more: Find visual version
Recommended approach: make a copy/duplicate of the current production file, then use Developer Mode in Power BI Desktop and import the visual from file. Do not save the file while testing! When you close without saving and reopen the report, it reverts back to the AppSource version.
Steps:
- Turn on Developer Mode (in Power BI Desktop).
- Import Visual From File.
- Select the downloaded visual file.
If something breaks while testing, close your report without saving β everything will be fine once you reopen the report. Developer Mode is a temporary setting that is set back to OFF once you close your report.
Report bugs found during beta testing here or by email to [email protected].
Learn more: Testing beta versions in Developer Mode
Upload the same visual file to the Org.Store (Organizational visuals): https://docs.microsoft.com/en-us/power-bi/admin/organizational-visuals#add-a-visual-from-a-file.
Learn more: Testing beta versions in Developer Mode
The following capabilities are Premium and require a license (Premium features show a watermark unless licensed):
| Category | Premium feature | What it does |
|---|---|---|
| Row Layout & Expansion | Stepped Layout | Indents child rows instead of showing them in a separate column |
| Row Layout & Expansion | Upwards Expansion | Allows hierarchy expansion to go upwards |
| Row Layout & Expansion | Expanded Row Styling | Applies distinct visual styles to expanded rows |
| Column Layout & Expansion | Column Expansion | Allows matrix columns to be expanded/collapsed |
| Value Formatting | Value Scaling | Scaling to thousands, millions, billions, or trillions |
| Calculations | HideRow |
Hide individual rows |
| Calculations | HideRowHierarchy |
Hide an entire row hierarchy |
| Calculations | AddColumn |
Add a custom calculated column |
| Calculations | AddMeasureCustomFormula |
Add a measure via a custom Eaze formula |
| Calculations | AddMeasureQuickCalc |
Add a measure via a quick calculation |
| Column Visibility | Hidden Columns | Any column (or column group) marked as hidden triggers premium |
| Row Visibility | Hide Empty Rows | Suppresses rows where all values are blank/zero |
| Ragged Hierarchy | Compress Descendants | Collapses sparse branches of the hierarchy |
| Ragged Hierarchy | Hide Blanks | Hides blank member nodes in a ragged hierarchy |
| Host Environment | Embedded / Export host | Premium is required when the visual runs inside an Embed or ExportReportHost environment |
| Commenting | Commenting | In-cell commenting / annotation feature |
Note that any column (or column group) marked as hidden triggers Premium, and Premium is also required purely based on where the visual runs β inside an Embed or ExportReportHost environment.
Learn more: Premium Features - Financial Reporting Matrix
Premium features show a watermark unless licensed; to remove the watermark you need to buy a license. For version 7.x and later, purchase licenses directly through Microsoft AppSource: https://appsource.microsoft.com/en-us/marketplace/checkout/WA200000642?exp=ubp8&tab=Overview.
Learn more: Use Premium features
Follow Microsoft's licensing FAQ: https://learn.microsoft.com/en-us/power-bi/developer/visuals/licensing-faq#how-do-we-assign-the-licenses-.
Learn more: Use Premium features
Email [email protected] and request a license for Power BI Embedded. Then, in Power BI Desktop or the Online Editor, go to the Format pane and enter the license key (there is a license-key field in the Format pane). An animated GIF "Insert License" on the wiki page shows how to insert the key (https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/blob/master/assets/Insert%20License.gif).
Learn more: Use Premium features
Yes β download the visual directly from https://profitbase.com/embed-licence-key-in-financial-reporting-matrix/ and supply your license key there; then you don't need to enter the key manually every time you add the visual to a report or dashboard.
Learn more: Use Premium features
Due to how Power BI works, to export the visual to PowerPoint/PDF you have to download the visual from AppSource.
Learn more: Use Premium features
Yes β "Add your Licence key from table" is available from version 9.0.0.0. With an Enterprise or Embedded license key, you can use the License bucket in the visual to supply the key directly from your data model. This enables centralized storage of the key (e.g., in OneLake or a database); when the key is renewed you only update it in the central storage and all connected visuals automatically use the new key.
Setup steps:
- Ensure your license key is loaded into a table within your Power BI semantic model.
- Select the Financial Reporting Matrix visual on your report canvas.
- In the Build visual pane, locate the License bucket.
- Drag and drop the data field containing your license key into the License bucket.
Example: a table called license with one column (key) and one row; the table has no relationships to other tables in the semantic model. Drag the key column into the License bucket. To renew, just update the value in the table.
Learn more: Use Premium features
The visual has a data limit set to 3000 rows β a result of stress testing performance during Microsoft certification. From v8.1.x.x, report developers can adjust the limit as they see fit in the Format pane under "Data limit", up to a global maximum of 30,000 rows set by Microsoft. Developers must find a balance between performance and the amount of data allowed in the visual.
Learn more: Data limit
Yes. Certification means Microsoft has tested the visual to verify it doesn't access external services or resources and that it follows secure coding patterns and guidelines.
How it is hosted and isolated:
- Each custom visual runs in an isolated sandbox (iFrame) within a Power BI report page. Each visual is hosted in a dedicated iFrame, totally isolated, and cannot interact with anything outside Power BI without going through the official Power BI custom visuals API.
- The visual does not in any way access data or any other type of information outside the Visual itself, including its hosting environment.
- A custom visual cannot directly interact with other visuals, neither built-in nor custom. It cannot and will not try to access information/data from other visuals or from the Power BI environment.
- The visual is built with React.js (an open-source front-end JavaScript library maintained by Facebook and a community), plus a few other industry-standard open-source libraries for specific features.
Learn more: Security
All business data comes from the Power BI Data Model, provided by the Power BI query engine using a push model β data is always pushed by the Power BI runtime into the visual. The visual does not fetch any data on its own and cannot initiate network calls to access the Data Model or any other resource.
- Sole exception: when a query result exceeds the maximum amount of data Power BI will push in one chunk, the visual can request the next chunk of the same Data Model query until everything has been received.
- The Visual does not make or receive any network calls and does not share any data externally, neither user information nor business data.
Learn more: Security
-
Local storage: No β the visual does not use the browser
localStorageor the Power BI Storage API to store or retrieve data in any way. - Export: Data can leave the visual only by direct user interaction through the Power BI user interface or via screen capture. The visual itself has no data export API or feature of any kind.
Learn more: Security
Email [email protected], or ask a question in the GitHub issues forum: https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/issues.
Learn more: Security
Check out this Youtube playlist: https://www.youtube.com/playlist?list=PLIKjDnkaTRYxmEMX0kb_zRcfVMYRTruD0.
Learn more: Video tutorials
Use the GitHub issue board: https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/issues.
When filing an issue:
- Check if the issue has been filed or answered before.
- Include the version of the visual (helpful).
- If possible, provide steps to reproduce.
- If possible, provide any additional information that may help track down the issue.
When writing a feature request: (1) provide a good name/title for the feature, and (2) describe what problem the feature will solve.
Two important rules:
- Always write in English β issues filed in other languages will be removed.
- The board and all issues filed are public, so do not post confidential information. Profitbase takes no responsibility for any information published on the forum.
Learn more: Get help
Drag and drop fields from your Power BI data model onto the visual's field wells in the Fields tool:
- Rows field β for row data
- Values field β for the measures/values
- Columns field β optional, for column data
Learn more: Adding data to the visual
Measure Placement controls where measures are displayed in the visual. The setting is located in the Values section of the Format pane, and it offers three layout options:
- Default
- Above Columns
- In rows
Default and Above Columns are available from v7.1; In rows is available from v7.2.
Learn more: Measure Placement
- Default places measures below the column headers β each measure repeats itself under each new column header name.
- Above Columns reverses this: each column header is repeated under each measure, so the measures sit above the columns instead of below them.
Note that if you only add one measure, the view looks the same for both Default and Above Columns, because the measure name is not visible with a single measure.
Learn more: Measure Placement
Yes. The In rows measure placement (available from v7.2) lists the measures in the rows of the visual.
Learn more: Measure Placement
Yes β from v8.1.x you can use the Add column formula function with the "Measures above columns" layout. The formula you create in the field will be shown in all columns below the measure.
Learn more: Measure Placement
Why did my custom rows, custom columns, or conditional formatting disappear after I changed Measure Placement?
This is by design. Each Measure Placement has its own separate set of Applied Steps. Steps you apply in one Measure Placement β for example adding custom rows, custom columns, or conditional formatting β are only active in the placement where they were created:
- Switching from Default to Above Columns deactivates them.
- Switching back to Default makes them reappear β they are not deleted, just inactive in the other placement.
Because applied steps are scoped per placement, choose your Measure Placement layout before you start adding steps. If you change the layout later, you might have to redo the steps in the new placement.
Learn more: Measure Placement
Introduced in v8.0.0.0, this feature (a toggle option in the visual) makes conditional formatting treat column headers as if they were separate measures, so formatting can be applied to selected columns individually:
- Turned OFF: all columns get the same formatting.
- Turned ON: the column headers are treated as separate measures, and the formatting is applied only where selected.
The typical use case is with calculation groups: conditional formatting is normally applied measure by measure, but with calculation groups you can build a report with one column header and a single measure where each column has its own calculation. This feature lets you apply different formatting to each of those calculations even though there is only one measure.
If there is a second column header level, the formatting is applied to each column with the same name, as if it was a measure β same-named columns across the second header level all receive the formatting.
Learn more: Treat columns as measures
A ragged hierarchy is a hierarchy with an uneven number of levels. Because Power BI tables and dimensions are column-based, ragged hierarchies must be "faked": columns representing intermediate levels in dimension tables are usually padded either with blanks or by copying the value of the parent column into the intermediate column. The visible effect is that when you expand a row, the value of the expanded level is either blank or matches the parent, forcing the user to expand multiple levels with seemingly the exact same value all the way to the lowest level.
Learn more: Ragged hierarchies
This is a Premium feature. Enable the option that matches the padding technique your data uses:
- Hide children matching parent names β enable if intermediate columns are padded by copying parent values into child columns.
- Hide blank β enable if intermediate columns are padded with blank values.
When enabled, the visual automatically hides the intermediate (padded) levels. For example, if the user expands the root level and levels 1β3 are padded, the visual automatically expands to level 4 and hides the intermediate levels. Pick the option based on the padding technique used in your dimension table.
Learn more: Ragged hierarchies
Yes β column ragged hierarchies are supported from version 9.0.0.0, via two settings:
- Hide column children matching parents β use when child nodes repeat the values of their parent nodes.
- Hide column blank β enable when intermediate column levels are padded with blank values.
When either setting applies, the expansion symbol will not appear for the padded node. For example, with columns Continent / Country / State where Bermuda's State is either Bermuda (a copy of the parent) or blank:
- With Hide column children matching parents enabled (Bermuda State =
Bermuda), no expansion symbol appears for Bermuda. - With Hide column blank enabled (Bermuda State = blank), no expansion symbol appears for Bermuda.
By contrast, on the row side the USA has real State values (New York and Texas), which remain expandable.
Learn more: Ragged hierarchies
Available from version 9.0.0.0, Drill Down lets the Financial Reporting Matrix use Power BI's native drill-down capabilities. Enabling it can significantly improve performance, because the visual only loads the data that is currently visible, rather than loading all child levels by default (even when collapsed).
Learn more: Drill Down
- Select the visual and navigate to the Visual section in the Format pane.
- Open the Drill Down section.
- Toggle the Enable Drill Down option On.
For details on how native drill-down interactions work in Power BI, see Microsoft's official documentation.
Learn more: Drill Down
There are two documented caveats to weigh against the performance benefit of loading only visible data:
- Expansion icons (+/β) still appear for rows without children. Drill down only works with the current level of data, so if you have multiple fields added to the Rows bucket, the expansion symbol continues to show even if there is no lower level for that specific row.
- Parent totals may look wrong or different. Because Drill Down does not load the underlying hidden data, parent totals might differ from the full-dataset value if you have added custom rows or custom calculations to the visual.
Learn more: Drill Down
- Click the +/- sign on a row to expand or collapse individual rows.
- To expand or collapse all items on the same level at once, hold Ctrl + click on an expand/collapse symbol.
Learn more: Expand/Collapse all
Yes. Toggle Row headers β Default expand rows on/off, and set the Expand to level property to On to specify whether rows should be automatically expanded to a specific level when the visual is loaded.
Be aware of the caveat: if Default expand rows is enabled, it overrides any custom expansion state set for the rows when a report is saved β the saved per-row expansion state will be replaced by the default expansion on load.
Learn more: Default expand rows
Use the Row expansion indent size option, which lets you control the indent of expanded rows. Set the indent size to 0 to have expanded rows align at the same "level" as their parents (no indent).
Learn more: Row expansion indent size
Set the option in Row expansion β Show +/- icons to control whether the +/- (expansion) icons are displayed.
Hiding the icons does not disable row expansion β it only removes the icons. The documented use case is to set a default expansion state, then hide the icons to remove the ability for users to expand/collapse rows when viewing the report.
Even when the icons are hidden globally, allowing row expansion can be specified per row by right-clicking the row in edit mode; the per-row setting overrides the Show +/- icons setting.
Learn more: Show / hide expansion icons
Yes β available from version 8.2.x. Under Row expansion in the format pane, you can select the icon type, size, and color.
Learn more: Show / hide expansion icons
Yes β this is a Premium feature. You can specify whether rows expand upwards or downwards when a user clicks the expand/collapse icon, effectively displaying the summarization row above or below its children. Toggle Grid β Upwards expansion on and off in the format pane.
Learn more: Row expansion β direction
Yes β this is a Premium feature. You can configure rows to apply a style when they are expanded; the style is automatically applied to rows when they are expanded and removed when they are collapsed.
Go to the Formatting pane β Row expansion β Apply expansion style. Ensure Apply expansion style is turned on, then specify the style β font color, background, font style, etc.
Learn more: Expanded rows β auto styling
Yes. You can disable expansion for specific rows β the typical documented use case is Payroll: expanding the row might reveal employee salaries, and you still want salaries aggregated to the Payroll level in the report, but you do not want to allow users to expand and view the details.
To disable (or allow) expansion for an individual row:
- Ensure you are in edit mode.
- Right-click the row you want to disable expansion for.
- Select "Set allow expansion".
- Enable/disable using the checkbox at the top of the visual.
This must be done in edit mode; per-row expansion settings cannot be changed in reading view. The per-row setting overrides the global Row expansion β Show +/- icons setting.
Learn more: Allow or deny expansion for individual rows
Stepped Layout is new in v8.0.0.0. Under "Row Expansion" in the formatting pane there is an option called "Stepped Layout". When ON, children in the row hierarchy are expanded in a separate column, instead of being shown below the parent (i.e., classic Power BI stepped/matrix layout rather than an indented tree).
To avoid the parent name being repeated on all rows, turn OFF "Show parent label" β with it off, e.g. "Sales" is only visible on the parent row.
Learn more: Stepped layout
Yes β the Sort by feature (available from version 9.0.0.0) allows you to reorder columns and rows based on specific data values rather than default alphabetical or chronological sorting, improving readability and letting you align the layout to your reporting preferences. Navigate to the Visual settings in the Format pane and enable Sort by.
Three sorting methods are available:
-
Sort columns by row value β reorders all columns based on the numeric values of one specific row:
- Step 1: Choose sorting scope: Groups (sorts columns separately inside their parent groups β e.g., sorting the months inside each year) or All (sorts all columns across the entire table together, ignoring parent groups).
- Step 2: Choose the Column level to apply sorting to. Sorting applies to this column level and all lower levels.
- Step 3: Select the row to base sorting on.
- Step 4: Select the measure to base sorting on. If you select All, the measures within each column are sorted independently, meaning their display order may vary across columns. If you select a specific measure, overall column sorting is based solely on that measure, and it will consistently appear first under each column header.
- Step 5: Choose Order (Ascending or Descending) and click Apply.
- Note: Row positions remain fixed; only the columns are reordered.
-
Sort columns by column header β rearranges columns based on a selected column header value:
- Step 1: Choose the Column level to apply sorting to.
- Step 2: Choose your Order (Ascending or Descending) and click Apply.
-
Sort rows by column value β reorders rows based on values within a specific column:
- Step 1: Select the column you want to sort rows by.
- Step 2: Select the Measure to base the sort on.
- Step 3: Choose your Order (Ascending or Descending) and click Apply.
- Note: If the system encounters empty rows during sorting, it treats the values as zero.
Grand totals and subtotals are completely excluded from sorting and remain in their default positions.
Learn more: Sorting rows & columns
Yes β the Format sort button options are:
- Hide icon: toggle on to hide the sort icon until the user hovers over the visual.
- Transparent background: turn on to remove the button's background color.
- Border: turn on to add a border to the button.
- Button size: increase or decrease the size of the button.
- Position: choose where the button is anchored on the visual (e.g., Top-right, Bottom-left).
Learn more: Sorting rows & columns
Under the Values section in the Formatting Pane, enable the Banded row style option to apply alternating background and foreground colors to rows (zebra striping).
Learn more: Banded row style
Enable the Row grand total option in the Totals section of the Format pane. This adds a grand total row to the bottom of the visual containing the sum for each column.
To keep the grand total row always visible (pinned) while scrolling, toggle on Freeze grand totals (new from v8.3) β the Grand total row will then always show as the last visible row in the matrix.
Learn more: Row grand totals
Turn on Row subtotals in the Format pane. The available options are:
| Setting | What it does |
|---|---|
| Row totals label | Text shown on the subtotal row, e.g. Total
|
| Row totals style | Style applied to the subtotal row (None, or one of the row styles β see Customize row styles) |
| Row placement | Where the subtotal row appears relative to its children: First element or Last element
|
| Per row level | When on, lets you set a different subtotal label for each level of the row hierarchy individually, instead of one label for all levels |
With Per row level turned on, each level of the hierarchy gets its own subtotal card in the Format pane (e.g. one for "Report display", one for "Account Description"), each with its own Subtotal label field. This lets a P&L show Total at one level and something else at another, instead of a single label for every level.
Learn more: Row subtotals
Yes. You can add custom subtotals to the matrix at any level and define the formula for calculating the value of each column in the subtotal row:
- Ensure you are in edit mode (click in the right upper corner of the visual to enter edit mode).
- In edit mode, right-click the row where you want to insert a subtotal before or after.
- Enter a name for the row, then press Tab or click in the Formula editor (located above the column headers) to give it focus. Then simply click each row that should make up the calculation. The visual automatically adds the
+operator between each operand, but you can manually change it to-,*or/(minus, multiply, divide). - Optionally, set a custom row style and a format string.
Learn more: Custom subtotals (rows)
Custom subtotal rows are anchored relative to data-model rows (before or after). If the rows from the data model that the custom subtotal is anchored to are filtered out, the subtotal will not appear.
The workaround: turn on "Show items with no data" for the field(s) in the Rows bucket so the anchor row is loaded, then use Hide empty rows to hide the empty rows visually β the custom subtotal rows added relative to them still appear.
Learn more: Custom subtotals (rows), Hide empty rows
- Ensure you are in Edit mode.
- Right-click the row you want to apply a custom style to and choose "Update row style".
- In the editor tools (above the column headers), choose the style and/or format to apply.
- If you choose any of the custom styles (custom1β4), you may need to go to the Format pane and define their properties β unless you are using a theme or have already set them up.
Row-style customization applies to both custom subtotals and rows from the data model.
Learn more: Customize row styles
- Ensure you are in Edit mode.
- Right-click above the row header.
- Select the style you want to apply.
- (Optional) Write a condition to choose which rows the style applies to.
Without a condition, the style applies to everything (e.g., apply the Custom1 style's grey background to all rows). With conditions you can, for example:
- Apply the style only to rows at a certain hierarchy level:
RowLevel()==1applies the style only to rows on level 1. - Reference values in other columns β e.g., only apply the style where the value of the "Is Cost" column is greater than 0.
- Combine multiple conditions using
&&or||.
After using a helper column in the style condition (e.g. "Is Cost"), you can hide that column so it doesn't show in the report.
Learn more: Update all row styles, with or without conditions
Yes β new from v8.3: in edit mode, hold the Ctrl key while selecting multiple rows, then apply changes to all of them as one. The applied step (in the Applied steps list) will contain information on all rows affected.
Learn more: Update multiple rows
Right-click any row in Edit mode and select "Set row options". It currently has two options β more options will be added in future releases:
- Allow expand/collapse of row β lets you turn expansion ON or OFF for individual rows.
-
Is Cost β if you tick the "Is cost" box, the row gets a value of 1, which can be referenced in formulas using
Row().cost. This returns 1 for all rows where the box has been ticked.
To see or validate the "Is cost" value per row, add a custom column and write Row().cost as the formula to extract and display the values per row. You can use the Row().cost values in formulas and conditional formatting.
Learn more: Row Options
Hiding rows is a Premium feature:
- Ensure you are in Edit mode.
- Right-click the row you want to hide (notice that a step is added to the Applied steps list).
- Choose Hide row.
Hiding a row is different from filtering it out: a hidden row is removed from display in Report mode but can still be used in custom subtotal calculations, while filtered rows cannot be used by custom subtotals.
To make a hidden row visible again, locate the corresponding step in the Applied steps list and delete it.
Learn more: Hiding rows
Hide Row hides a single row, and its effect on children depends on the expansion state at the time of hiding:
- If the parent is collapsed, child rows will also be hidden.
- If the parent is expanded, then only the parent will be hidden, while all child rows remain visible.
Hide Hierarchy hides the parent and all children, regardless of whether it was expanded at the time of hiding or not.
Learn more: Hide Row and Hide Row Hierarchy
Hide empty rows is a Premium feature. The recommended setup is:
- Turn on "Show items with no data" for the field(s) in the Rows bucket so empty rows are loaded from the data model.
- Enable Hide empty rows β empty data-model rows are then hidden from view.
The reason for this two-step setup is custom subtotals. The default for "Show items with no data" on a Rows-bucket field is false, meaning empty rows are filtered out β and if you add a custom subtotal row relative to a row that is filtered out, the custom subtotal disappears because its anchor row doesn't exist in the dataset coming from Power BI. With "Show items with no data" enabled, the anchor row is loaded and the custom subtotal rows added relative to it still appear, while Hide empty rows hides the empty rows visually.
The typical use case is when you add custom subtotal rows before or after rows that may be empty in the Power BI data model for different filter contexts β e.g. Account X may be empty for Department A but not for Department B.
Two additional toggles control special row types:
- Always show custom rows β toggle it off to hide custom rows that are empty.
- Always show JSON rows β toggle it off to hide rows defined using the JSON row format that are empty. The JSON row format is usually used for specifying a fixed report format β e.g. a P&L that always contains a fixed set of items regardless of whether they are empty or not.
Learn more: Hide empty rows
Can I define my own condition for which empty rows get hidden?
Yes β use the Condition field in the Hide empty rows settings. Row levels are 0-indexed (rows at the root level are at level 0). Examples:
| Condition | Effect |
|---|---|
RowHeader() == "Sales" |
Hide an empty row if its row header is "Sales" |
RowLevel() >= 1 |
Always keep empty rows visible at the root level, but hide them on sub levels |
RowHeader() == "Sales" && RowLevel() >= 1 |
Hide empty rows if the row header equals "Sales" and the row is at level 1 or greater |
Combine conditions with the logical operators && and ||. The functions used are RowHeader() (returns the row header text) and RowLevel() (returns the row's hierarchy level, 0-indexed with root = 0).
Learn more: Hide empty rows
Yes β available from version 8.2.x. The context menu in edit mode contains an option to set the indentation of individual rows. Both custom rows and rows from your dataset are supported for custom indentation.
Learn more: Add custom indent
Use the Column headers settings card in the Format pane. The style you set there applies to all column headers in the visual β unless it is overridden by the Column style settings for an individual column. In other words, an individual per-column header style always takes precedence over the general style set in Column headers. Note that this styling section covers only columns that come from the Power BI data model, not custom columns.
Learn more: Column headers style
Yes. You can specify individual styles for each Value column coming from the data model β for example Header color, Header background, and other Header properties of that column's style settings. Setting any of these overrides the general style defined in the Column headers settings. This applies to Value columns coming from the data model.
Learn more: Individual column styles
Yes. Grid lines for just the column headers (not the whole grid) are enabled from the Column headers formatting pane. They are especially useful when you have enabled Column expansion and have more than 2 levels of stacked columns β the header grid lines make the multi-level stacked headers readable.
Learn more: Column header grid lines
Column expansion lets users collapse and expand columns in the visual β for example, toggling between showing Year only and Year expanded into Months. You can have as many levels of columns as you want, and each column can be expanded or collapsed individually. When a column is collapsed, its children are automatically summarized and the total is displayed in the collapsed column.
Key facts:
- It is a Premium feature.
- It is supported only in version 4 and above of the visual.
- It works in conjunction with the Column subtotals feature β you can have both enabled and things will work as expected.
Learn more: Column expansion
This is a Premium feature. Follow these steps:
- In the Formatting pane, enable column expansion by switching the toggle to On.
- In the Fields pane, add at least 2 fields to the Columns bucket β for example Year and Month. With only one field there is nothing to expand or collapse.
- You can then collapse columns (with automatically summarized totals) and expand them again to view details.
You can also change the size of the column expansion icons with the Expansion icon size setting, available from version 8.2.x onward.
Learn more: Enable column expansion
Yes. Toggle Column expansion β Default expand columns On or Off, and set the Expand to level property to a number. This controls whether columns are automatically expanded to a specific level when the visual is loaded. This is a Premium feature.
Be aware that if the Default expand columns option is enabled, it overrides any custom expansion state set for the columns when a report is saved.
Learn more: Default column expansion
Enable the Column subtotals option. This adds a Total column from the data model for each Value column. A typical use case is displaying periodic values by month while needing a Year total for each measure (e.g., Actual and Budget).
- With multiple Value columns you get one Total column per Value column β e.g., with "Actual" and "Budget" in the Values bucket, you get one total for Actual and one total for Budget.
- Use the Value total label field to specify the caption text of each total column.
- Use the
{{Value}}token in the Value total label text to include the Value column's own name in the caption. When a Value total column is rendered, the token is replaced by the actual name of the Value field. Example: with "Actual" and "Budget" in the Values bucket, setting the label to{{Value}} totalproduces the captions "Actual total" and "Budget total".
Learn more: Column subtotals
Yes β new in v6, Column subtotal placement lets you select whether the total is shown as the last column or as the first column.
Learn more: Column subtotals
Yes β new in v7.2: in the Column subtotals options, select "Per column level". You can then choose which levels of your column hierarchy show column subtotals. For example, with a Year β Quarter β Month hierarchy and column subtotals turned on, opening "Per column level" and turning off the Quarter subtotal removes the Quarter total while keeping the other levels' totals.
Learn more: Column subtotals
Yes β from version 8.0.0.0 there are two types of aggregation for totals, letting developers control the aggregation method applied to the totals column of a measure: either summarize all values, or apply the same formula used for the measure calculation to the totals column.
To reach the setting:
- Navigate to the Format pane and turn on the Column Subtotals option.
- Once column subtotals are enabled, an option called "Aggregation type" appears on a separate slicer card.
- Click the "Aggregation type" card to expand it and select an aggregation type for each measure total.
The two options per measure are:
- "Summarize" β calculates the total by summarizing all individual measure values in the columns of the corresponding level.
- "Default" β applies the same formula used for calculating the measure to the totals column (this was the initial/original implementation of total calculation).
Additional behavior to know:
- Any filters or slicers applied to the report are considered when calculating the total.
- The chosen aggregation type is applied to every column level showing the measure total.
- With the Default total calculation, the same column formula applied to the measure will also be applied to the total value.
Learn more: Row Column totals
Custom columns let report authors add calculated columns to a report without editing the data model or writing complex DAX queries. The feature is especially useful when pivoting data from the data model across Rows, Values AND Columns β without Custom columns, it is not possible to add custom calculated columns to a Power BI report in that scenario. Custom columns are a Premium feature, as are both sub-topics (adding and styling them).
Learn more: Custom columns
This is a Premium feature. Follow these steps:
- Ensure you are in Edit mode.
- Right-click any column (header) and choose "Add column before" or "Add column after".
- Specify the Header and the formula. To build the formula: make sure the Formula bar has focus, then click the columns you want to include in the calculation. The visual automatically inserts the "+" operator between references.
You are not limited to + β the visual automatically adds the + operator when you click columns, but you can change it to -, * or / (minus, multiply or divide) at any time.
Learn more: Add custom columns
Hold Ctrl while clicking a cell to insert an absolute reference (e.g. $(Actual).$(Sales)) instead of a relative one β the syntax uses $() around each part, in the form $(<column/context identifier>).$(<row/field identifier>). Use absolute references when the formula should always point to that specific column/row, regardless of the row or column context in which the formula is evaluated.
Learn more: Add custom columns
This is a Premium feature. Select the step "(Add column)" from the Applied steps list. A style editor will appear below the Applied steps list, where you can style the custom column.
New in v6: when a step in the Applied steps list is selected (the step is shown on the right side), a triangle icon (marker) appears on the column headers of the relevant column that the step affects. If you have a long list of steps that affect different columns, the marker helps you see which column corresponds to the step you're currently on.
Learn more: Styling custom columns
This is a Premium feature. Perform these steps:
- Enter Edit mode.
- Right-click the header of the column you want to hide β notice a step is added to the Applied steps list.
- Choose Hide column from the right-click context menu.
- Optionally, specify a condition using a formula (conditional hiding).
Hidden columns are not displayed in Report/Viewing mode. Note that hiding columns is different from filtering: hidden columns can still be used in calculations even though they are not visible to the user, whereas filtered columns cannot be used in calculations.
Learn more: Hide column
Yes β the Hide Empty Columns option is available from v7.1 and hides empty columns while keeping all custom columns visible. This is useful, for example, when one measure shows the selected period and another shows the same value two years earlier: if a slicer selection moves the comparison to a period with no data, that column becomes empty, and turning on Hide Empty Columns hides it.
Related behavior and interactions:
- Custom columns are anchored to the column they were added relative to. Example: a custom column ("After Co1") added after "Company 1" is anchored to the Company 1 column. If the slicer is set to 2019 and Company 1 has no data for 2019, both Company 1 and the anchored custom column "After Co1" disappear.
- Turn on "Show Items with no data" for the Column headers to make empty columns visible (as empty columns); turn on Hide Empty Columns to hide them again.
- Enable the option to always show Custom Columns to keep a custom column (e.g. "After Co1") visible even when its anchor column (e.g. Company 1) is gone.
Learn more: Hide Empty Columns
Right-click a column header and choose "Add column formula". You can override values coming from the data model, row calculations, or custom column calculations. The calculation will apply to all columns coming from the same field in the Value Field setting. Steps:
- Ensure you are in Edit mode.
- Right-click the column (header) you want to override the calculation/value for.
- Create the formula for the calculation. Column formulas support functions β to use functions, type the function name, then provide the arguments to the function. To reference a value in the data grid, place the caret in the formula editor and click a cell value to insert a reference.
Learn more: Overriding column calculations
Yes β column pinning is available from version 8.2.x. Use the column header context menu (right-click menu), which includes the pin columns option. After scrolling, pinned columns remain displayed (the documented example shows two pinned columns still showing after scrolling). You can also toggle ON/OFF a Pin-icon in the "Column header" section in the formatting pane.
Learn more: Pin columns
In the Formatting β Values pane you can specify the default formatting that applies to all cells in the visual. You can choose from some predefined format strings or specify a (valid) custom format string. The default applies to every cell unless it is overridden per column or per row. For the custom format-string syntax, see Microsoft's documentation on custom format strings in Power BI: https://docs.microsoft.com/en-us/power-bi/create-reports/desktop-custom-format-strings
Learn more: Default formatting
Set the separators in the Values section of the Format pane β available from v7.1. You can change the separators to anything you'd like.
- Default decimal separator:
.(dot) - Default thousand separator:
,(comma)
Documented examples of supported combinations include the opposite of the default (comma as decimal separator, dot as thousand separator) and using a white space as the thousand separator.
Learn more: Thousand and Decimal Separators
You can specify how cells with the value 0 are displayed via the Zero values dropdown. The default is a dash (-), but you can also choose a blank cell or simply 0 (the actual value).
Learn more: Zero values format
Yes β via the Format zeroes option, available from v9.0.0.0. When the Zero values dropdown is set to Display zero, a secondary option called Format zeroes becomes available. Toggling Format zeroes to On makes the visual apply the decimal formatting of the measure to the zero value β for example, if your measure is formatted to show two decimal places, the visual displays 0.00 instead of a plain 0.
If you don't see the toggle, check two prerequisites: (1) it requires version 9.0.0.0 or later, and (2) it only appears when the Zero values dropdown is set to Display zero.
Learn more: Zero values format
You can specify whether negative values are displayed with a minus sign or in parenthesis β for example, -123 or (123). Configure this in the Format pane under Values β Negative values format.
Learn more: Negative values formatting
Yes. You can scale units directly in the visual without having to do it in the model or a DAX query. The scaling only affects the displayed value, not the actual value, so any calculations remain accurate. Note that Scale units is a #Premium feature.
Learn more: Scale units
Available from v8.2.x. In edit mode, the context menu contains an option "Set sign factor". For example, selecting Sales and inverting the sign factor results in the values showing as positive numbers. Unlike scale units, this is not display-only β calculations that build on the inverted row also change.
Parent/child behavior:
- If you change the sign factor of a parent, all child rows will also invert the sign.
- If you change the sign factor of a child row, only that row will change.
Caveat: because a parent is a total of all its child rows, it does not recalculate automatically when you invert a single child. If you want the parent total to recalculate, you need to tick off "Recalculate totals".
Learn more: Invert sign factor
Use the Format function in a column formula:
Format([Column], "format string")
Format() lets a column calculation conditionally apply different format strings to the cells in a column based on which row they are on. If you instead want all values in the column to use the same format string, you will typically just set the format string in the Column styles formatting pane.
Complete documented example β applying a custom format string to the Sales and Accounts Receivables lines only:
- Go to Edit mode.
- Right-click the column header you want to apply custom formatting to, then choose "Add column formula".
- In the Formula editor, enter:
IF(RowHeader() == "Sales" || RowHeader() == "Accounts Receivables", Format([Column], "#,#.00"), [Column])
Tips and caveats:
- To insert the
[Column]token ([Jan]in the example) at the current caret position in the Formula editor, click a cell in the column. -
Note! In the example, the
[Jan],[Feb], etc. columns all come from the Actuals field in the Values bucket, so the rule applies to all the Actuals columns (Jan, Feb, Mar, etc.) β not just Jan, the column you right-clicked.
Learn more: Cell formatting using Format function
You can apply conditional formatting to Value columns from the data model, subtotal columns, and custom columns:
- Ensure you are in edit mode.
- Right-click the column header and choose "Add conditional formatting".
- Set the conditions and choose the style(s).
Learn more: Conditional formatting
The improved formatting release (available from v8.1) introduced a new conditional formatting pane and options:
- You can name the step, so it's easier to find the correct formatting step if you want to alter it later.
- "Apply to" shows which measure or column the formatting is applied to.
- Column Hierarchy levels decide where the formatting should be applied: values, totals, or both.
- Conditions are more flexible than before, and you can add additional conditions.
-
Apply style has been updated:
- Selecting "Default" lets you choose the normal custom1 to custom6 styles.
- Selecting "Custom" lets you format freely ("you are free to format as you please").
There is also a YouTube tutorial: https://www.youtube.com/watch?v=Qxf4rWwtdoE
Learn more: Conditional formatting
Yes β available from v8.2.x. The conditions field has options where you can choose to apply formatting to cells based on selected row options ("Using Row Options as conditions").
Learn more: Conditional formatting
Both are available from v8.3.x:
-
Column headers: Add conditional formatting, select "Apply to" β Column headers, then select the condition, and select the formatting.
-
Color scale (heatmap-style): In "Formatting type", select "Color scale" and choose which type of scale:
- Diverging: lets you pick two colors and a number of ranges.
- Sequential: lets you pick a number of color ranges and a color palette.
Then select where the formatting should be applied: Font or Background.
Learn more: Conditional formatting
Use Conditional Formatting using column index (available from version 9.0.0.0). It applies formatting to a column based on its position (column index) rather than its name or data binding, so your column formatting remains intact even if the column's name or underlying data changes over time.
Exact steps:
- Ensure you are in Edit mode.
- Right-click the column header and choose Add conditional formatting. (Do not use "Add column conditional formatting" β the index option is only valid for standard conditional formatting.)
- In the formatting pane under the Conditions section, select Column Index from the dropdown.
- Once Column Index is selected, the visual temporarily displays zero-based index numbers (0, 1, 2, 3...) above the columns to help you identify the correct position.
- Indicate your condition range (e.g., greater than, equals) using the provided index numbers.
- Choose your formatting style and click Apply. The formatting is only applied to columns that match your index criteria for the selected measure.
Learn more: Conditional formatting
The feature follows strict rules ("How Indexing Works"):
- Lowest level formatting: The system assigns a zero-based index (starts at 0) to each visible column on the lowest level, counting left to right, linked to the selected measure.
- Custom columns are excluded: Any custom columns you have added are skipped and not included in the indexation count.
- Hidden columns are included: Hidden columns in your dataset are still counted in the background calculation to maintain stable indexing.
- Collapsed column groups: If you use column expansion and a group is collapsed, the system still calculates the index of the collapsed columns, but only visually shows the indexes for columns that remain visible.
- Column hierarchy levels (Totals): Even though a Total column gets an index number (shown in the UI), the formatting will only apply if the Column hierarchy levels setting includes Totals (e.g., Values and Totals vs. just Values).
- Measures above columns layout: If the visual is configured with "Measures above columns", the system calculates the measure index based on the default positioning, but the visual displays the column index number next to the lowest level value instead of above the header.
Because the index is positional within the current context, it moves with filtering. Documented example: applying the custom1 style to the first quarter in the current context (index 0); if the end user filters the report page to show only Q3 and Q4, the style is applied to Q3, because it now has column index 0.
Learn more: Conditional formatting
The Financial Reporting Matrix includes a built-in function library for creating formulas that perform custom row and column calculations. The function library is organized into these topics: using functions in column calculations, financial functions, operators, keywords, date functions, logical functions, math functions, text functions, and table functions. A complete list of all supported functions is also maintained at https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/blob/master/docs/Calculations.md.
Learn more: Calculations, Most used functions
Yes β all column calculations support using functions. A function can take one or more inputs (arguments), and each argument can be:
- A hardcoded value, such as a number or a string/text.
- A cell value β a column reference added by clicking a cell while the formula editor is active.
Function arguments are separated by commas. Note that this differs from Excel, where semicolons are argument separators.
Learn more: Using functions in column calculations
You don't have to type column names manually β while the formula editor is active, clicking a cell inserts that column's name into the formula automatically (e.g. [Actual_2018]). You only type the function name, commas, hardcoded values, and the closing parenthesis. To write a CAGR formula in a custom column:
- In edit mode, create a custom column or override a column calculation.
- In the formula editor, type
CAGR(. - Click a cell to specify the beginning value column β the column name is automatically added to the formula.
- Type a comma
,after the beginning value column to split the first and second argument. - Click a cell to specify the ending value column.
- Type a comma after the ending value column to split the second and third arguments.
- Enter the number of years as the third argument, e.g.
2. - Type
)to close the function.
The resulting formula looks like CAGR([Actual_2018], [Actual_2020], 2). The signature is CAGR(beginningValue, endingValue, numOfYears) β it computes compound annual growth rate from a beginning value, an ending value, and the number of years.
Learn more: Using functions in column calculations
The three most-used functions are:
-
CAGR(beginningValue, endingValue, years)β calculates compound annual growth rate. -
YoY(pastValue, presentValue)β calculates year-over-year growth. -
IF(condition, trueValue, falseValue)β works like the Excel IF function.
Learn more: Most used functions
The formula language supports comparison, logical, arithmetic, member access, unary, null coalescing, and assignment operators.
Comparison operators:
| Operator | Meaning | Example / notes |
|---|---|---|
> |
Greater than |
20 > 10 returns true; 10 > 20 returns false |
>= |
Greater than or equal | checks left β₯ right |
< |
Less than |
20 < 10 returns false; 10 < 20 returns true |
<= |
Less than or equal | checks left β€ right |
== |
Equals |
1 == 1 true; 1 == 2 false |
!= |
Not equals |
1 != 1 false; 1 != 2 true |
Logical operators (both short-circuit):
-
&&β conditional AND; the right operand is only evaluated if the left operand is true. -
||β conditional OR; the right operand is only evaluated if the left operand is false.
Arithmetic operators:
-
+β sums numeric operands (1 + 2returns 3); also concatenates strings if one operand is a string (you can alternatively use theCONCATfunction). -
-β subtraction (2 - 1returns 1). -
*β multiplication (2 * 2returns 4). -
/β division (2 / 2returns 1). -
%β modulus, the remainder after division (10 % 2returns 0).
Primary (member access) operators:
-
.(x.y) β member access, e.g."xyx".substring(β¦). -
?.(X?.y) β null-conditional member access; returns null if the left-hand operand is null, e.g.X = null; Y = X?.substring(β¦).
Unary operators:
-
+(+x) β returns the value of the operand. -
-(-x) β numeric negation, e.g.Y = -X;. -
!(!x) β logical negation, e.g.X = !true;(X becomes false).
Null coalescing operator:
-
??β if the left side is null it returns the right side; otherwise it returns the left value.null ?? "Hello"returns"Hello";0 ?? "Hello"returns0.
Assignment operator:
-
=β assigns the right-hand value to the variable or cell on the left, e.g.X = 10;. You can also assign a value to a specific cell with a filtered cell reference:@Amount[ItemID == "A"] = 25.6;(i.e.@ColumnName[RowID == "value"] = newValue). Don't confuse=(assignment) with==(equality comparison, which returns true/false).
Learn more: Operators
-
falseβ Boolean false value. -
trueβ Boolean true value. -
nullβ represents a null reference. -
thisβ returns a reference to the current execution context, with the propertyRowsof typeany[](a JavaScript array). Usethisto access all rows from within a formula.
Learn more: Keywords
Use the Offset function inside the formula field of Add Column Formula or Add Measure. To compare the current month against the last month:
- Right-click a column in February β you need a value for the period before, which January does not have in this view, so February is the first month where a prior-month comparison is possible.
- Click on a value in the Actuals column under February to get the current value.
- Hold the Shift key while clicking a value in the Actuals column under January β this creates an offset reference (offset -1).
While building the formula, the orange arrow in February indicates the starting point for the formula. Any offsets are decided based on their position relative to the orange arrow: clicking January while holding Shift gives offset -1, while clicking March would give offset +1. Clicking normally references the current column.
The Offset function works with any field you add to the Column header, not only months or years.
Learn more: Offset
From version 8.0.0.0, you can add custom measures. In edit mode, right-click a column header and select Add measure before or Add measure after. While the formula field is active, click the items (cells) you want to include in the calculation β the same way you add a custom column.
A custom measure is repeated under each column header, the same as if you placed a new measure in the Values bucket of the visual. Custom measures have the same formatting pane as custom columns (a styling pane appears on the right side, e.g. titled "Column Style (test)"). When you collapse a column header, the custom measure is aggregated to the column level.
Learn more: Add measure
By default, a custom measure total summarizes (sums) across all columns. From version 9.0.0.0, you can use the Show Last Value aggregation type, which makes the measure total display the value from the last visible column in the hierarchy instead β useful for period-end balances or cumulative custom measures. To set it:
- Go into Edit mode.
- Right-click a column header and select Add measure before or Add measure after β or select an existing custom measure from your Applied steps list.
- In the styling pane that appears on the right side (e.g. Column Style (test)), scroll down to the Aggregation dropdown.
- Change the selection to Show Last Value.
The matrix then updates the total column for that specific measure to reflect the value of the last column in the row.
Learn more: Add measure
Four financial functions are documented:
| Function | Description |
|---|---|
CAGR(beginningValue, endingValue, years) |
Calculates the compound annual growth rate. |
YoY(pastValue, presentValue) |
Calculates year-over-year growth. |
AMORLINC(cost : number, date_purchased : Date, first_period : Date, salvage : number, period : number, rate : number [,basis : number]) |
Depreciation function; the basis argument is optional. |
AMORLINCMTH(cost : number, date_purchased : Date, first_period : Date, salvage : number, period : Date, rate : number [,basis : number]) |
Monthly variant; note that unlike AMORLINC, the period argument here is typed as Date (in AMORLINC it is number). The basis argument is optional. |
Learn more: Financial functions
Six date/time entries are documented:
| Function | Description |
|---|---|
DATE(year [,month,day,hours,min,sec,ms]) |
Creates a JavaScript Date object from the specified arguments. Only year is required; month, day, hours, minutes, seconds, and milliseconds are optional. |
DATE(expression) |
A second overload that creates a Date object by evaluating the expression. |
DATEVALUE(year [,month,day,hours,min,sec,ms]) |
Creates a Date object from the specified arguments (same as DATE). |
TODATE(expression[,input format]) |
Converts a date string or number into a Date object. If you do not specify the input format, the date string must be an ISO 8601 date string. TODATE("2001-01-01") returns a Date object representing January 1st, 2001; TODATE("20.12.2006", "DD.MM.YYYY") returns a Date object representing Dec 20th 2006. |
NOW() |
Returns the current Date (a JavaScript Date object). |
FORMATDATE(date : Date | string, format : string) |
Returns a string representation of a date using the specified format and the current locale. The format string supports momentjs formats. Caveat: if the date passed is a string (not a Date object), the string is expected to be in ISO 8601 format. |
Learn more: Date functions
-
IF(<condition>,<true-expression>,<false-expression>)β conditional;IF(1 == 2, "Condition is true", "Condition is false")returns"Condition is false". -
NOT(<expression>)β negates a boolean;NOT(true)returnsfalse. -
COALESCE(β¦args)β returns the first argument that is not null;COALESCE(null,"a",2)returns"a". It only skips nulls. -
ISNULL(<check-expression>,<replacement-expression>)β if check-expression is null, returns replacement-expression, otherwise returns check-expression.ISNULL(null,1)returns1;ISNULL(10 * 1, 100)returns10. -
ISNULL(<check-expression>)β one-argument overload that tests for null: returnstrueif the expression is null, otherwisefalse.ISNULL(null)returnstrue. -
ISNULLORZERO(<check-expression>,<replacement-expression>)β if check-expression is null or 0, returns replacement-expression, otherwise returns check-expression. -
ISNULLORZERO(<check_expression>)β one-argument overload: returnstrueif check-expression is null or 0, otherwisefalse.ISNULLORZERO(null)returnstrue. -
ISNUMBER(value)β checks if the data type of value is a number data type.ISNUMBER(1)returnstrue;ISNUMBER("2")returnsfalse. -
ISNUMERIC(value)β checks whether value is a number or can be converted to one.ISNUMERIC(1)returnstrue;ISNUMERIC("2")returnstrue;ISNUMERIC("a")returnsfalse. -
ISERROR(<expression>)β returnstrueif evaluation of the expression results in an error. -
IFERROR(<check-expression>,<replacement-expression>)β if check-expression results in an error, returns replacement-expression, otherwise returns check-expression. -
ISNULLOREMPTYSTR(<expression>)(also spelledIsNullOrEmptyStr(<expression>)β both casings are documented) β returnstrueif the expression is null or an empty string.ISNULLOREMPTYSTR(null)returnstrue. It can also be applied to a filtered lookup expression, e.g.ISNULLOREMPTYSTR(@ProductID[AccountID == "A100" && MarketID == "NO-V"]). -
NZ(<check-expression>)β if the check-expression is null or an empty string it returns0, otherwise the check-expression is returned.NZ(null)returns0;NZ(1)returns1;NZ(" ")returns0(a single-space string returns0).
Learn more: Logical functions
ISNUMBER(value) checks the actual data type β a string containing digits is not a number type, so ISNUMBER("2") returns false. ISNUMERIC(value) also accepts values that can be converted to a number, so ISNUMERIC("2") returns true. Both return true for 1, and ISNUMERIC("a") returns false.
Learn more: Logical functions
There are 23 math/trigonometry functions. Each accepts x : number | <expression> (a literal number or any expression) unless noted:
| Function | Description | Doc example |
|---|---|---|
ABS(x) |
Returns the absolute value of the argument |
ABS(-1) returns 1
|
ACOS(x) |
Returns the inverse cosine of x |
ACOS(0.65) returns 0.863211β¦
|
ASIN(x) |
Returns the inverse sine of x |
ASIN(0.65) returns 0.70758β¦
|
ATAN(x) |
β | β |
ATAN2(x, y) |
Returns the angle (in radians) from the x-axis to a point | β |
CEILING(x) |
Returns x rounded upwards to the nearest integer | β |
COS(x) |
β | β |
EXP(x) |
Returns E (the base of natural logarithms) to the power of x | β |
FLOOR(x) |
Returns x rounded downward to the nearest integer | β |
LN(x) |
Returns the natural logarithm (base e) of x | β |
LOG(x) |
β | β |
LOG10(x) |
β | β |
MOD(x, y) |
Returns x modulus y | β |
NUM_MIN() |
Returns the minimum value of the Number type (no equivalent NUM_MAX is listed) |
β |
PI() |
Returns PI | β |
POW(x, y) |
Returns x to the power of y | β |
RAND() |
Returns a pseudorandom number between 0 and 1 | β |
ROUND(x) |
Returns x rounded to the nearest integer; no digits/precision parameter is documented | β |
SIGN(x : number) |
Returns -1 for negative values and 1 for positive values |
β |
SIN(x) |
Returns sine of x | β |
SQRT(x) |
Returns the square root of x | β |
SUM(β¦x) |
Returns the sum of the arguments |
SUM(1,2,3) returns 6
|
TAN(x) |
Returns the tangent of an angle | β |
Learn more: Math functions
| Function | Description |
|---|---|
CONCAT(β¦t:string) |
Concatenates a comma-separated list of strings. CONCAT("a","b","c") returns "abc". |
SUBSTRING(input : string, start : number[, length : number) |
Returns a substring of the input string. SUBSTRING("Hello", 1) returns "ello"; SUBSTRING("Hello", 1,2) returns "el". Based on the examples, the start index is 0-based. |
SPLIT(input : string, delimiter : string) |
Returns an array of strings containing the substrings delimited by the delimiter. SPLIT("Hi, everyone", ",") returns ["Hi", "everyone"]. |
LEFT |
Listed with no signature or description. |
LEN |
Listed with no signature or description. |
LOWER |
Converts all characters in a string to lower case. |
REPLACE |
Listed twice, both times with no signature or description. |
RIGHT |
Listed with no signature or description. |
TOSTRING(value) |
Converts a value to a string, e.g. the number 100.123 becomes the string "100.123". |
TOSTRING(value, formatString) |
Similar to the Excel TEXT function β see the dedicated question below. |
TRIM(input) |
Removes leading and trailing whitespace characters from a string. |
UPPER(input) |
Converts all characters in a string to upper case. |
TONUMBER(value) |
Converts a string to a number. If the string cannot be converted to a number, null is returned (it does not throw). |
NEWLINE() |
Returns the newline character β the documented way to embed a line break in a string. |
Learn more: Text functions
Use TOSTRING(value, formatString). The valid format strings depend on the value type:
- When the value is a number, use format strings supported by the numeraljs formatting library (http://numeraljs.com).
- When the value is a Date, use format strings supported by the momentjs formatting library (http://momentjs.com).
Example: TOSTRING(DATE(2016,1,1), "YYYYMMDD") returns "20160101".
Learn more: Text functions
| Function | Description |
|---|---|
ColumnHeader() |
Returns the caption of the column. |
ColumnHeaderParent() |
Returns the parent caption of the column (for grouped/nested, two-level column headers). |
RowHeader() |
Returns the caption/text of the row. Can be used in an IF statement, or a Conditional field. |
RowLevel() |
Returns the level of the row. Can be used in an IF statement or a Conditional field; example use case: apply a style to specific levels only. |
Row().formatString |
Returns the format string applied to the row. |
Row().style |
Returns the styles that are applied to each row. Can be used in formulas or conditional formatting. |
RowHeaderParent() |
Returns the name of the parent of each row, to be used in formulas or conditional formatting conditions. |
Row()."columnName" |
Generic access pattern for extended row metadata stored as a JSON-string (see the question about custom row fields below). |
The documented list of row style names you can reference in formulas and conditional formatting ("Available styles to reference") is exactly: stylesTotal, stylesSubtotal, stylesKPI, overline, underline, custom1, custom2, custom3, custom4, custom5, custom6, bold, and hidden.
Learn more: Table functions
How do I read row metadata, and can I add custom fields to a row for use in formulas and conditional formatting?
Each row is described by a default JSON-string consisting of id, displayName, formula, style, formatString, and signFactor. Documented example:
{
"id": "L1Sum",
"displayName": "1Sum - Reportline",
"formula": "L10+L12",
"style": "bold overline",
"formatString": "#,0",
"signFactor": 1
}You can extend the default JSON-string with any columns you want by adding a new column name and a value, then reference it with Row()."columnName". For example, adding an IsIncome field:
{
"id": "L1Sum",
"displayName": "1Sum - Reportline",
"formula": "L10+L12",
"style": "bold overline",
"formatString": "#,0",
"signFactor": 1,
"IsIncome": 1
}The added field is then referenced with the formula Row().IsIncome, which returns 1, and can be used in conditional formatting. Documented example condition: "If value is greater than 0, and IsIncome == 1, then apply a style with green font color" β i.e. a custom JSON field can be combined with a value comparison in a conditional formatting condition.
Learn more: Table functions
There are 16 statistical functions, all taking variadic arguments (β¦x):
| Function | Description | Doc examples |
|---|---|---|
AVERAGE(β¦x : number | <expression>) |
Returns the average of the numbers passed. Only numbers and arrays of numbers are processed. | β |
AVERAGEA(β¦x : number | <expression>) |
Returns the average; numbers, arrays of numbers, and values representing numbers (such as true, false and string representations of numbers) are processed. |
β |
COUNT(β¦x : number | <expression>) |
Counts the number of numeric values passed. Only numbers and arrays of numbers are processed. |
COUNT(1,2,"test") returns 2; COUNT(ARRAY(1,2,3)) returns 3
|
COUNTA(β¦x : number | <expression>) |
Counts the number of logical values passed; numbers, arrays of numbers, and values representing numbers are processed. |
COUNTA(1,2,"3") returns 3; COUNTA(1,2,"x") returns 3; COUNTA(1,2,null) returns 2; COUNTA(ARRAY(1,2,3,4,true,"")) returns 6
|
COUNTBLANK(β¦x : number | <expression>) |
Counts the number of null values passed. |
COUNTBLANK(null) returns 1; COUNTBLANK(ARRAY(1,null,1,null)) returns 2
|
MAX(β¦x : number | <expression>) |
Returns the max value of the numeric values passed. Only numbers and arrays of numbers are processed. |
MAX(1,4,3,true,null) returns 4
|
MAXA(β¦x : number | <expression> | boolean | string) |
Returns the max value of the numbers or numeric representations of the values passed. |
MAXA(false,null) returns 0; MAXA(0,true) returns 1
|
Additional statistical functions: MIN(β¦x), MINA(β¦x : number | <expression> | boolean | string), STDEV(β¦x), STDEVA(β¦x), STDEVP(β¦x), STDEVPA(β¦x), VAR(β¦x), VARA(β¦x), VARP(β¦x), VARPA(β¦x).
Learn more: Statistical functions
How do the "A"-suffixed statistical variants differ from the plain ones, and how are nulls and booleans handled?
- The plain variants (
AVERAGE,COUNT,MAX) process only numbers and arrays of numbers, ignoring booleans and nulls βMAX(1,4,3,true,null)returns4. - The "A"-suffixed variants (
AVERAGEA,COUNTA,MAXA) also process numeric representations such astrue/falseand numeric strings βMAXA(0,true)returns1(i.e.trueevaluates as 1,false/nullas 0). -
COUNTAcounts even non-numeric strings (COUNTA(1,2,"x")returns3), but null is not counted (COUNTA(1,2,null)returns2). Booleans and empty strings inside arrays are counted:COUNTA(ARRAY(1,2,3,4,true,""))returns6. -
COUNTBLANKis the dedicated null counter:COUNTBLANK(null)returns1;COUNTBLANK(ARRAY(1,null,1,null))returns2. - Statistical functions accept arrays as arguments, per the documented examples (e.g.
COUNT(ARRAY(1,2,3))returns3); theARRAY(...)constructor itself appears only inside these examples and is not separately documented.
Learn more: Statistical functions
Use the Title option in the Format pane.
Learn more: Title
Yes β from v8.1.x.x the visual supports a Report page type tooltip:
- Set up the tooltip as a separate report page (a tooltip-type report page). You can add any visual to this page.
- Configure the tooltip in the General section of the format pane of the visual.
Learn more: Tooltip
In Edit mode, right-click the column and select Add data bar. By default, rows on the same hierarchy level compare against each other β for example, the parent rows "Bergen", "Oslo" and "Stavanger" compare to each other because they are on the same level of the hierarchy, while child rows compare to other child rows.
Learn more: Data bars
Once a data bar is applied, a format panel appears with these settings:
| Setting | Description |
|---|---|
| Minimum | Defaults to the lowest value in the column, but can be set to any value. Example: if a value is -100 but minimum is set to -50, all rows with a value lower than -50 get a full negative bar. |
| Maximum | Same behavior as Minimum, for the top end. |
| Positiv bar / Negative bar | Sets the bar colors for positive and negative values. |
| Axis | Sets the axis color. |
| Hide Axis for empty cell | Creates a break in the axis if the value is empty. |
| Apply for only this column | Turn ON if you only want the data bar for one specific column. Turn it OFF and you get a data bar for every instance of that measure β e.g., with years on the column header and a data bar on the Actual measure, OFF applies a data bar to the Actual column for each year. |
| Bar direction | Sets what should be the positive direction. |
| Compare against | Child Group or RowLevel β see the next question. |
| Optional Condition | A formula field controlling where data bars appear. |
Learn more: Data bars
There are two options:
- Child Group β each child group contains its own Maximum and Minimum value to compare against. For example, the child group under "Bergen" has one maximum value and the child group under "Oslo" has a separate maximum value; the comparison is done within each separate child group.
- RowLevel β each row compares against all other rows on that level. For example, if the middle group has the highest value of 2.17 million, all other rows compare to that as their maximum value.
Learn more: Data bars
Yes β use the Optional Condition field to write an expression specifying where the data bar should appear. Documented examples:
-
RowLevel()>0β excludes data bars on the top level (top level is defined as0), so only child levels get bars. -
RowLevel()==0β shows data bars only on the parent (top-level) rows.
Learn more: Data bars
Enable the Web URL option. Cells containing a valid URL string become clickable, and clicking the cell opens the URL in a new browser window. A typical use case is letting users quickly open attachments or any type of document related to the report lines they are viewing.
Learn more: Web URL
Yes β toggle on URL icon to display a URL icon instead of the URL string.
Learn more: Web URL
Available from version 9.0.0.0:
- Click the cell containing the value you want to copy to select it.
- Press Ctrl+C on your keyboard.
The cell value is copied to your clipboard and is ready to paste into other applications (Excel, Notepad, email, etc.). Note that it is currently only possible to copy a single cell value β copying multiple cells at once is not supported.
Learn more: Copy cell value
Export to Excel is available from version 7.x.x:
- Turn it ON in the format pane and select the position of the Download button.
- Click the download icon to open the export window.
- After clicking Download, an explorer window opens to choose where to save the Excel file.
A tutorial video is available at https://www.youtube.com/watch?v=45PP28bb3h4.
Learn more: Export to Excel
The Excel output contains styling, formatting, values, backgrounds, and outlines as defined in Power BI. Row hierarchies are grouped in Excel (Excel outline groups). Comments are also exported to Excel, where they are added as Notes (from v8.2.x).
Learn more: Export to Excel, Commenting
Yes:
- From version 8.0.x there is an option to hide the download icon β the icon then only shows when you hover over the visual.
- From version 8.2.x you can select the size of the icon, choose whether you want a border, and a transparent background. This was added because users reported the download icon conflicting with their headers/values depending on where they placed it.
Learn more: Export to Excel
A Power BI Admin must allow export from custom visuals in the Admin Portal. Without that setting enabled, export is not possible. See the Microsoft documentation on Export data to file under organizational visuals: https://learn.microsoft.com/en-us/power-bi/admin/organizational-visuals#export-data-to-file.
Learn more: Export to Excel
- Basic commenting: v8.1.x
- Comment formatting and Excel export of comments: v8.2.x
- Adding comments to headers: v8.2.x
- Showing comments outside the current context: v9.1.x
Learn more: Commenting
Turn commenting on in the format pane. Once turned ON, a comment icon appears in the visual; click the icon to start commenting. Four options are configurable in the format pane:
- Icon position β choose where the icon should appear in the visual.
- Date format β select the format for the date stamp on comments.
- Comment title options β select fields to use in the comment title.
- Column header level β select the headers you want to include in the comment title.
Learn more: Commenting
- Add a comment: after clicking the comment icon, select a cell in the matrix. The row and column headers for that cell appear as the comment header, along with the cell value. From v8.2.x you can also add comments to row/column headers.
- Reply: on each comment you can add replies, and each comment displays how many replies have been added to it.
- See the full list: click the back-arrow next to the comment header to see the full list of comments, based on your slicer selection (the list respects the current filter context).
- Edit or delete: all comments can be edited or deleted after creation.
Learn more: Commenting
When the comments panel is closed, the visual shows a red triangle in the top-right corner of cells that contain a comment. The comment icon also shows a number indicating how many comments are available in the current filter context.
Learn more: Commenting
From v8.2.x, the comment box supports familiar formatting options: Bold, Italic, Underline, Font color, Highlight color, and comment box background color. The color picker remembers the last selected colors so the same colors can be reused across comments. Suggested use cases for comment colors:
- One color for each department.
- One color for each report section (e.g., Green = income, Red = costs).
- Criticality (Green = OK, Red = Warning).
Learn more: Commenting
Yes β comments are exported to Excel and added as Notes (from v8.2.x). Caveat: comment background color and font highlighting are NOT exportable; other formatting (bold, italic, underline, font color) is exported.
Learn more: Commenting
From v9.1.x, comments outside the current context are not displayed by default β the panel shows "No comments here yet". To see all comments added, including those outside the current context, flip the toggle at the top of the comment section ("All comments").
Learn more: Commenting
- Comments are stored inside the visual and not written to any data source; they are not reusable across other visuals.
- Comments can only be added in Power BI Desktop and in Power BI Service when editing the report, because comments need to be saved as part of the report.
Learn more: Commenting
All actions you perform while in edit mode are added as steps to the Applied Steps list. Managing steps:
- Edit a step: simply select it in the Applied steps list.
- Reorder: select the step and use the Up/Down buttons at the top of the Applied steps list.
- Delete: select or hover over the step, then press the X next to it.
- Rename: from v8.3, steps can be renamed.
- Search: from v8.3, a search field at the top of the Applied steps list lets you search for steps to narrow down the list.
Learn more: Applied steps
Yes β steps are applied in the order they appear in the list. For example, if you add a step that sets the style for a row and then a later step sets a style for a column, the column style overrides the row style for the cells in that column.
Learn more: Applied steps
The Financial Reporting Matrix includes four buttons that report consumers can interact with directly. Each is enabled and configured individually in the Format pane, and all buttons share a common styling system:
- Commenting β add and view text comments attached to rows or cells.
- Export to Excel β download the matrix data as an Excel file with all formatting applied.
- Search (from v9.1) β search for rows by keyword across all hierarchy levels.
- Sorting β sort rows or columns directly from the visual.
Learn more: Endβuser interaction buttons
Available from version 9.1.x.x. When Group button is enabled, all toolbar buttons are collected into a single grouped control. The icon position, size, and style set under Group button apply to all buttons in the group. Settings:
- Icon position β where the group button appears on the visual (e.g., Bottom-right).
- Automatic hide icon β hides the button until the user hovers over the visual.
- Transparent background β removes the button background fill.
- Border β adds a border around the button.
- Button size β controls the size of the button (Small / Medium / Large).
In the report, the grouped buttons appear as a single "..." icon on the visual. Clicking "..." expands the group to show all enabled buttons; to collapse the buttons again, click X.
Learn more: Endβuser interaction buttons
Available from version 9.1.x.x, Search lets users quickly locate specific rows in the matrix by keyword, without manually scanning the hierarchy β especially useful in large reports with deep row structures. To enable it, go to Format pane β Search and toggle it on. This adds a search button to the visual's toolbar, which can be styled the same way as other toolbar buttons.
Learn more: Search button
- Click the search button in the visual to open the search field.
- Type any text or number into the field and press Apply to execute the search.
The search scans all row labels across the full hierarchy, automatically expanding levels to show matching rows along with their parent rows. To clear an active search and return to the full table, click Reset search.
Important caveat: if Drill Down is enabled, search only scans the hierarchy levels currently visible β rows in collapsed levels are not included in the search.
Learn more: Search button
Yes. As any other Power BI visual, Financial Reporting Matrix can be themed using a JSON theme file.
Learn more: Theming
A ready-made theme template is included in the Theming article on the wiki. It contains the full theme JSON structure with all themable properties and their default values, ready to copy and adapt.
Learn more: Theming
-
<empty>means an empty string""β two double quotes with no whitespace. - All colors use the hex color format
#XXXXXX(for example,#000000is black). The placeholder#someColormeans "use a hex color". - Color properties are written as fill objects, for example
{ "solid": { "color": "#someColor" } }.
Learn more: Theming
Use "financialreportingmatrixD8A502553641450F8EAEB9BA40B2166E". If you import the visual from your Organizational store (not AppSource), you must change the visual id to "financialreportingmatrixD8A502553641450F8EAEB9BA40B2166E_OrgStore" (i.e. append the _OrgStore suffix).
Learn more: Theming
The template has a top-level "name" (the sample uses "My Theme"), a "dataColors" array of hex colors (the sample uses ["#00338D", "#00CCDD", "#00EEFF"]), and a "visualStyles" section keyed by the visual ID, with a "*" wildcard containing all themable property sections.
Learn more: Theming
The theme template covers these sections: customColumns, grid, columnFormatting, columnHeaders, rowHeaders, values, subTotals, rowExpansion, stylesTotal, stylesSubtotal, stylesKPI, stylesCustom1βstylesCustom6, stylesBold, stylesOverline, stylesUnderline.
Learn more: Theming
In the customColumns section:
-
width:100(number) -
columnSeparator:"left | right | both | <empty>"
Learn more: Theming
The grid section offers:
-
verticalGrid:false -
verticalGridThickness:1 -
verticalGridColor: hex color -
horizontalGrid:false -
horizontalGridThickness:1 -
horizontalColor: hex color β note the property is namedhorizontalColor, nothorizontalGridColor -
rowPadding:2 -
outlineColor: hex color -
outlineWeight:1
Learn more: Theming
The columnFormatting section supports:
-
width:100 -
isHidden:falseβ set totrueto hide a column via theme -
color: hex color -
backgroundColor: hex color -
columnSeparatorColor: hex color -
separator:"<empty> | left | right | both" -
formatString:"<empty> | <Power BI format string> | custom" -
customFormatString:"<Power BI format string>"
Learn more: Theming
The columnHeaders section supports:
-
fontColor: hex color -
backgroundColor: hex color -
fontWeightBold:true -
fontStyleItalic:false -
outline:"<empty> | bottom | bottom double | top | top bottom | top bottom double | left | right | left right | top bottom left right"(10 options) -
textSize:9 -
groupAlignment:"left | center | right" -
alignment:"left | center | right" -
wordWrap:true
Learn more: Theming
The rowHeaders section supports:
-
defaultExpandRows:false -
expandToLevel:1 -
fontColor: hex color -
backgroundColor: hex color -
outline:"<empty> | bottom | bottom double | top | top bottom | top bottom double | left | right | left right | top bottom left right" -
textSize:8 -
wordWrap:true
Learn more: Theming
The values section supports:
-
scalingValues:"none | thousands | millions | billions | trillions"β scales values via theme -
negativeValueFormatting:"minus | parentheses"β set to"parentheses"to show negative numbers in parentheses -
zeroValueFormatting:"dash | empty | zero"β display zeros as a dash, blank, or zero -
formatString:"<empty> | <Power BI format string> | custom" -
customFormatString:"<Power BI format string>" -
fontColor: hex color -
backgroundColor: hex color -
outline:"none | bottom | top | left | right | top bottom | left right | top bottom left right" -
textSize:8 -
wordWrap:false
Learn more: Theming
The subTotals section supports:
-
rowGrandTotal:false -
rowGrandTotalLabel:"Your label" -
rowGrandTotalStyle:"\"\"| bold | overline | underline | custom1 | custom2 | custom3 | custom4 | stylesSubtotal | stylesKPI" -
columnTotalsLabel:"Total" -
columnTotalsStyle:"\"\"| bold | overline | underline | custom1 | custom2 | custom3 | custom4 | stylesTotal" - Column subtotals toggle:
columnSubotals(false)
Style options for totals/subtotals: row grand total styles are empty (""), bold, overline, underline, custom1βcustom4, stylesSubtotal, stylesKPI; column totals and row totals styles are empty, bold, overline, underline, custom1βcustom4, stylesTotal.
Learn more: Theming
The rowExpansion section supports:
-
storeExpansionState:trueβ keeps the expansion state when reopening the report -
indentSize:10 -
showExpandCollapseIcon:true -
upwardsExpansion:falseβ set totrueto expand rows upwards (children above parent) -
useRowExpansionStyling:falseβ enables the expansion styling properties below - Expansion styling properties (applied when
useRowExpansionStylingis on):bold(true),fontStyleItalic(true),fontSize(8),color(hex),background(hex),outline("\"\" | bottom | bottom double | top | top bottom | top bottom double"),outlineThickness(1),outlineColor(hex)
Learn more: Theming