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.

Contents


Getting started, licensing & support

Where do I start with Financial Reporting Matrix?

The Getting Started page points you to four resources:

  1. Get the visual β€” how to install the visual (wiki page).
  2. Use Premium features β€” licensing (wiki page).
  3. Video tutorials (wiki page).
  4. Get help (wiki page).

All documentation lives on the wiki of the GitHub repo Profitbase/PowerBI-visuals-FinancialReportingMatrix.

Learn more: Getting started

How do I install the Financial Reporting Matrix visual?

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 (.pbiviz file) from GitHub or Profitbase: Use the GitHub releases page (https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/releases) or https://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

Where can I get the newest version of 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

I downloaded the .pbiviz file β€” how do I start using it?

It is a two-step process:

  1. Go into your Power BI admin portal and register the visual as an Organizational visual.
  2. 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

Why and how do I add the visual as an Organizational 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:

  1. Download the visual file (format: .pbiviz). Pre-releases are available at https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/releases.
  2. Go to https://app.powerbi.com/ and sign in.
  3. Click the settings symbol (gear) in the top right, then select "Admin portal".
  4. Select "Organizational visuals" and click "Add visual", then select "From file".
  5. Browse for the downloaded file, give it a name, optionally update the icon, then click "Add".
  6. 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.
  7. 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

Can I run the AppSource version and the Organizational version side by side?

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

How do I find which version of the visual I'm using?

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

How can I safely test a beta or new version of the visual?

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:

  1. Turn on Developer Mode (in Power BI Desktop).
  2. Import Visual From File.
  3. 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

What do I do after a successful beta test if I want to keep the new version?

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

Which features require a Premium license?

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

How do I purchase a Premium license?

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

How do I assign purchased licenses to users?

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

How do I get a license for Power BI Embedded Capacity or an Enterprise license?

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

Can I avoid entering the license key every time I add the visual?

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

What should I know about exporting the visual to PowerPoint or PDF?

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

Can I supply the license key from my data model instead of typing it into the Format pane?

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:

  1. Ensure your license key is loaded into a table within your Power BI semantic model.
  2. Select the Financial Reporting Matrix visual on your report canvas.
  3. In the Build visual pane, locate the License bucket.
  4. 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

What is the visual's data limit, and can I change it?

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

Is the Financial Reporting Matrix visual secure and certified by Microsoft?

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

Where does the visual's data come from, and does it make network calls?

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

Does the visual store or export any data?

  • Local storage: No β€” the visual does not use the browser localStorage or 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

Who do I contact with security questions about the visual?

Email [email protected], or ask a question in the GitHub issues forum: https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/issues.

Learn more: Security

Where can I find video tutorials for Financial Reporting Matrix?

Check out this Youtube playlist: https://www.youtube.com/playlist?list=PLIKjDnkaTRYxmEMX0kb_zRcfVMYRTruD0.

Learn more: Video tutorials

How do I get help, file an issue, or request a feature?

Use the GitHub issue board: https://github.com/Profitbase/PowerBI-visuals-FinancialReportingMatrix/issues.

When filing an issue:

  1. Check if the issue has been filed or answered before.
  2. Include the version of the visual (helpful).
  3. If possible, provide steps to reproduce.
  4. 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


Data & structure

How do I add data (rows and columns) to the Financial Reporting Matrix visual?

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

What is Measure Placement and where do I find it?

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

What is the difference between the "Default" and "Above Columns" measure placements?

  • 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

Can I show measures as rows instead of columns?

Yes. The In rows measure placement (available from v7.2) lists the measures in the rows of the visual.

Learn more: Measure Placement

Can I use "Add column formula" when measures are placed above columns?

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

What does "Treat columns as measures" do?

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

What is a ragged hierarchy?

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

How do I hide the padded intermediate levels of a ragged hierarchy in rows?

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

Is ragged-hierarchy handling available for columns too?

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

What does the Drill Down feature do?

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

How do I enable Drill Down?

  1. Select the visual and navigate to the Visual section in the Format pane.
  2. Open the Drill Down section.
  3. 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

What are the known limitations of 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


Rows

How do I expand or collapse rows in the matrix?

  • 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

Can rows be automatically expanded to a specific level when the report loads?

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

How do I control the indentation of expanded (child) 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

How do I show or hide the +/- expansion icons?

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

Can I change the appearance of the expand/collapse 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

Can rows expand upwards instead of downwards?

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

Can expanded rows be styled automatically?

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

Can I disable expansion for specific rows only?

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:

  1. Ensure you are in edit mode.
  2. Right-click the row you want to disable expansion for.
  3. Select "Set allow expansion".
  4. 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

What is Stepped Layout and how do I use it?

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

Can I sort rows and columns by data values instead of alphabetical order?

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:

  1. 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.
  2. 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.
  3. 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

Can I customize the appearance of the sort button?

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

How do I apply alternating row colors (banded rows)?

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

How do I add a grand total row to the bottom of the matrix?

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

How do I configure the built-in row subtotals (label, style, placement)?

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

Can I add my own subtotal rows at any level of the hierarchy?

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:

  1. Ensure you are in edit mode (click in the right upper corner of the visual to enter edit mode).
  2. In edit mode, right-click the row where you want to insert a subtotal before or after.
  3. 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).
  4. Optionally, set a custom row style and a format string.

Learn more: Custom subtotals (rows)

Why did my custom subtotal row disappear?

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

How do I change the style of a single row?

  1. Ensure you are in Edit mode.
  2. Right-click the row you want to apply a custom style to and choose "Update row style".
  3. In the editor tools (above the column headers), choose the style and/or format to apply.
  4. 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

How do I apply a row style to all rows at once, with or without conditions?

  1. Ensure you are in Edit mode.
  2. Right-click above the row header.
  3. Select the style you want to apply.
  4. (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()==1 applies 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

Can I select and update several rows at the same time?

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

What is "Set row options" and what does the "Is Cost" option do?

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:

  1. Allow expand/collapse of row β€” lets you turn expansion ON or OFF for individual rows.
  2. 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

How do I hide a specific row from the report?

Hiding rows is a Premium feature:

  1. Ensure you are in Edit mode.
  2. Right-click the row you want to hide (notice that a step is added to the Applied steps list).
  3. 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

What's the difference between "Hide Row" and "Hide Row Hierarchy"?

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

How do I hide rows that are empty in the current filter context?

Hide empty rows is a Premium feature. The recommended setup is:

  1. Turn on "Show items with no data" for the field(s) in the Rows bucket so empty rows are loaded from the data model.
  2. 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

Can I change the indentation of individual 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


Columns

How do I set one style for all column headers at once?

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

Can I style each Value column differently (different header color, background, etc.)?

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

Can I show grid lines only around the column headers?

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

What is Column expansion?

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

How do I enable column expansion?

This is a Premium feature. Follow these steps:

  1. In the Formatting pane, enable column expansion by switching the toggle to On.
  2. 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.
  3. 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

Can I control how far columns are expanded when the report first loads?

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

How do I add a Total column next to my monthly Value columns?

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}} total produces the captions "Actual total" and "Budget total".

Learn more: Column subtotals

Can I place the column subtotal before the detail columns instead of after?

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

Can I show column subtotals only for some levels of a multi-level column hierarchy?

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

Can I control how a measure's total column is calculated?

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:

  1. Navigate to the Format pane and turn on the Column Subtotals option.
  2. Once column subtotals are enabled, an option called "Aggregation type" appears on a separate slicer card.
  3. 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

What are Custom columns?

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

How do I add a custom column to the matrix?

This is a Premium feature. Follow these steps:

  1. Ensure you are in Edit mode.
  2. Right-click any column (header) and choose "Add column before" or "Add column after".
  3. 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

How do I insert an absolute reference in a custom column formula?

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

How do I style a custom column after adding it?

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

How do I hide a specific column from the report?

This is a Premium feature. Perform these steps:

  1. Enter Edit mode.
  2. Right-click the header of the column you want to hide β€” notice a step is added to the Applied steps list.
  3. Choose Hide column from the right-click context menu.
  4. 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

Can the visual automatically hide empty columns?

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

How do I override column values coming from the data model?

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:

  1. Ensure you are in Edit mode.
  2. Right-click the column (header) you want to override the calculation/value for.
  3. 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

Can I pin (freeze) columns so they stay visible while scrolling?

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


Values & number formatting

How do I set a default number format for all cells in the visual?

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

How do I change the thousand and decimal separators (e.g., for European number formats)?

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

How are zero values displayed, and can I change it?

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

Can I make zero values follow the measure's decimal formatting (e.g., show 0.00 instead of 0)?

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

How do I show negative numbers in parentheses instead of with a minus sign?

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

Can I scale the displayed units (thousands/millions) without changing my data model or writing DAX?

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

How do I flip the sign of values (e.g., show Sales as positive)?

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

How can I format cells differently within the same column depending on the row?

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:

  1. Go to Edit mode.
  2. Right-click the column header you want to apply custom formatting to, then choose "Add column formula".
  3. 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

How do I add conditional formatting to a column?

You can apply conditional formatting to Value columns from the data model, subtotal columns, and custom columns:

  1. Ensure you are in edit mode.
  2. Right-click the column header and choose "Add conditional formatting".
  3. Set the conditions and choose the style(s).

Learn more: Conditional formatting

What options does the improved conditional formatting pane (v8.1) offer?

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

Can I conditionally format cells based on row options instead of values?

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

Can I apply conditional formatting to column headers, and are color scales supported?

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

How do I keep conditional formatting working when column names or underlying data change?

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:

  1. Ensure you are in Edit mode.
  2. 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.)
  3. In the formatting pane under the Conditions section, select Column Index from the dropdown.
  4. 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.
  5. Indicate your condition range (e.g., greater than, equals) using the provided index numbers.
  6. 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

What are the exact indexing rules for column-index 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


Calculations & formula functions

What can I use the formula language for, and where is it documented?

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

Can I use functions in column calculations, and what can function arguments be?

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

How do I build a formula that references columns, for example a CAGR calculation?

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:

  1. In edit mode, create a custom column or override a column calculation.
  2. In the formula editor, type CAGR(.
  3. Click a cell to specify the beginning value column β€” the column name is automatically added to the formula.
  4. Type a comma , after the beginning value column to split the first and second argument.
  5. Click a cell to specify the ending value column.
  6. Type a comma after the ending value column to split the second and third arguments.
  7. Enter the number of years as the third argument, e.g. 2.
  8. 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

Which functions are used the most?

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

What operators can I use in formulas?

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 + 2 returns 3); also concatenates strings if one operand is a string (you can alternatively use the CONCAT function).
  • - β€” subtraction (2 - 1 returns 1).
  • * β€” multiplication (2 * 2 returns 4).
  • / β€” division (2 / 2 returns 1).
  • % β€” modulus, the remainder after division (10 % 2 returns 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" returns 0.

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

What keywords does the formula language support?

  • false β€” Boolean false value.
  • true β€” Boolean true value.
  • null β€” represents a null reference.
  • this β€” returns a reference to the current execution context, with the property Rows of type any[] (a JavaScript array). Use this to access all rows from within a formula.

Learn more: Keywords

How do I compare a column against the previous column, such as current month vs. last month?

Use the Offset function inside the formula field of Add Column Formula or Add Measure. To compare the current month against the last month:

  1. 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.
  2. Click on a value in the Actuals column under February to get the current value.
  3. 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

How do I add a custom measure?

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

How do I make a custom measure's total show the last period's value instead of a sum?

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:

  1. Go into Edit mode.
  2. 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.
  3. In the styling pane that appears on the right side (e.g. Column Style (test)), scroll down to the Aggregation dropdown.
  4. 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

Which financial functions are available?

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

Which date and time functions are available?

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

Which logical functions are available?

  • 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) returns false.
  • 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) returns 1; ISNULL(10 * 1, 100) returns 10.
  • ISNULL(<check-expression>) β€” one-argument overload that tests for null: returns true if the expression is null, otherwise false. ISNULL(null) returns true.
  • 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: returns true if check-expression is null or 0, otherwise false. ISNULLORZERO(null) returns true.
  • ISNUMBER(value) β€” checks if the data type of value is a number data type. ISNUMBER(1) returns true; ISNUMBER("2") returns false.
  • ISNUMERIC(value) β€” checks whether value is a number or can be converted to one. ISNUMERIC(1) returns true; ISNUMERIC("2") returns true; ISNUMERIC("a") returns false.
  • ISERROR(<expression>) β€” returns true if 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 spelled IsNullOrEmptyStr(<expression>) β€” both casings are documented) β€” returns true if the expression is null or an empty string. ISNULLOREMPTYSTR(null) returns true. 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 returns 0, otherwise the check-expression is returned. NZ(null) returns 0; NZ(1) returns 1; NZ(" ") returns 0 (a single-space string returns 0).

Learn more: Logical functions

What is the difference between ISNUMBER and ISNUMERIC?

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

Which math functions are available?

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

Which text functions are available?

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

How do I format a number or date as a string with a specific format (the Excel TEXT equivalent)?

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

Which table functions can I use to reference rows and columns in formulas?

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

Which statistical functions are available?

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) returns 4.
  • The "A"-suffixed variants (AVERAGEA, COUNTA, MAXA) also process numeric representations such as true/false and numeric strings β€” MAXA(0,true) returns 1 (i.e. true evaluates as 1, false/null as 0).
  • COUNTA counts even non-numeric strings (COUNTA(1,2,"x") returns 3), but null is not counted (COUNTA(1,2,null) returns 2). Booleans and empty strings inside arrays are counted: COUNTA(ARRAY(1,2,3,4,true,"")) returns 6.
  • COUNTBLANK is the dedicated null counter: COUNTBLANK(null) returns 1; COUNTBLANK(ARRAY(1,null,1,null)) returns 2.
  • Statistical functions accept arrays as arguments, per the documented examples (e.g. COUNT(ARRAY(1,2,3)) returns 3); the ARRAY(...) constructor itself appears only inside these examples and is not separately documented.

Learn more: Statistical functions


Report features

How do I set the title of the visual?

Use the Title option in the Format pane.

Learn more: Title

Does the visual support tooltips?

Yes β€” from v8.1.x.x the visual supports a Report page type tooltip:

  1. Set up the tooltip as a separate report page (a tooltip-type report page). You can add any visual to this page.
  2. Configure the tooltip in the General section of the format pane of the visual.

Learn more: Tooltip

How do I add a data bar to a column?

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

What settings are available for 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

What do the "Compare against" options for data bars mean?

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

Can I control which rows get data bars with a condition?

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 as 0), so only child levels get bars.
  • RowLevel()==0 β€” shows data bars only on the parent (top-level) rows.

Learn more: Data bars

How do I make cells containing URLs clickable?

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

Can I show an icon instead of the raw URL text in a cell?

Yes β€” toggle on URL icon to display a URL icon instead of the URL string.

Learn more: Web URL

How do I copy a cell value from the visual?

Available from version 9.0.0.0:

  1. Click the cell containing the value you want to copy to select it.
  2. 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

How do I enable and use Export to Excel?

Export to Excel is available from version 7.x.x:

  1. Turn it ON in the format pane and select the position of the Download button.
  2. Click the download icon to open the export window.
  3. 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

What is included in the exported Excel file?

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

Can I hide or restyle the Excel download icon?

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

Why is Export to Excel not working?

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

Which versions of the visual support commenting?

  • 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

How do I enable and configure 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

How do I add, reply to, and browse comments?

  • 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

How can I tell which cells have comments?

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

What text formatting is available inside comments?

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:

  1. One color for each department.
  2. One color for each report section (e.g., Green = income, Red = costs).
  3. Criticality (Green = OK, Red = Warning).

Learn more: Commenting

Do comments get exported to Excel?

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

Why don't I see comments I know exist?

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

What are the limitations of 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

What is the Applied Steps list and how do I manage it?

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

Does the order of applied steps matter?

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

Which end-user interaction buttons does the visual include?

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

What is the Group button and how does it work?

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

What does the Search button do and how do I enable it?

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

How do end users search for rows?

  1. Click the search button in the visual to open the search field.
  2. 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


Theming

Can the Financial Reporting Matrix visual be styled with a Power BI theme file?

Yes. As any other Power BI visual, Financial Reporting Matrix can be themed using a JSON theme file.

Learn more: Theming

Where do I find a theme template for the Financial Reporting Matrix?

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

What do the placeholders and conventions in the theme template mean?

  • <empty> means an empty string "" β€” two double quotes with no whitespace.
  • All colors use the hex color format #XXXXXX (for example, #000000 is black). The placeholder #someColor means "use a hex color".
  • Color properties are written as fill objects, for example { "solid": { "color": "#someColor" } }.

Learn more: Theming

What visual ID do I use in visualStyles for the Financial Reporting Matrix?

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

What does the top-level structure of the theme file look like?

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

Which property sections of the visual can be themed?

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

What custom-column settings can be themed?

In the customColumns section:

  • width: 100 (number)
  • columnSeparator: "left | right | both | <empty>"

Learn more: Theming

What grid settings can be themed, and what are their defaults?

The grid section offers:

  • verticalGrid: false
  • verticalGridThickness: 1
  • verticalGridColor: hex color
  • horizontalGrid: false
  • horizontalGridThickness: 1
  • horizontalColor: hex color β€” note the property is named horizontalColor, not horizontalGridColor
  • rowPadding: 2
  • outlineColor: hex color
  • outlineWeight: 1

Learn more: Theming

What per-column formatting settings can be themed?

The columnFormatting section supports:

  • width: 100
  • isHidden: false β€” set to true to 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

What column-header settings can be themed?

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

What row-header settings can be themed?

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

What value-cell settings can be themed?

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

What subtotal and total settings can be themed?

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

What row-expansion settings can be themed?

The rowExpansion section supports:

  • storeExpansionState: true β€” keeps the expansion state when reopening the report
  • indentSize: 10
  • showExpandCollapseIcon: true
  • upwardsExpansion: false β€” set to true to expand rows upwards (children above parent)
  • useRowExpansionStyling: false β€” enables the expansion styling properties below
  • Expansion styling properties (applied when useRowExpansionStyling is 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


⚠️ **GitHub.com Fallback** ⚠️