30/07/2026
Live Databricks data in Excel: connect existing reports, auto-refresh, and enforce role-based access
Most companies have a data access gap that nobody put on a roadmap. IBM Think (November 2025), citing Gartner data, reports that analytics and business intelligence tools are used by only 29% of employees on average.[1] That means most people in most organisations work without direct access to governed data. Original research by Acuity Training (February 2026) found that the average office worker spends 38% of their working time in spreadsheets and checks one every 16 minutes.[2] The data already exists in governed platforms, but most of the actual work happens in spreadsheets that have no direct connection to it. This is not a technology adoption lag so much as a structural gap.
In this post we show how to connect an existing Excel report to live Databricks data in five minutes, using a budget tracker as the demo. We also cover a governance benefit that goes beyond data freshness: because every Refresh goes through Unity Catalog, the same file automatically shows each person only the data their role permits, with no extra files and no manual filtering needed.
The same manual cycle across functions
The same cycle appears across functions. A sales ops manager copies pipeline numbers out of the CRM into a tracker. An HR business partner updates a headcount file manually each month. An operations lead circulates a report built on last week’s figures. Corporate FP&A teams are the best-documented case: the FP&A Trends Survey 2025 found that nearly half their time is still spent on data collection and validation: pulling figures from ERPs, CRMs and other operational systems into spreadsheets, consolidating them across sources, and checking for discrepancies, rather than the analysis and decision support that FP&A exists to provide.[3] The AFP FP&A Benchmarking Survey 2025 found that 96% of FP&A professionals use spreadsheets for planning and 93% for reporting on a daily or weekly basis, with 61% citing unreliable data as their top challenge.[4] The demo in this post uses a budget tracker, but the pattern holds regardless of function.
Take the budget tracker in this demo: each month, someone exports the latest bookings from the CRM, pastes the CSV into the file, and updates the totals. By October, that is nine exports, nine manual pastes, and a file that has been updated nine times.
Installing the Add-in
Before installing, a workspace admin needs to enable the Excel Connector preview in the Databricks workspace settings. Once that is done, individual users can install the Add-in themselves. There is an admin-managed route through the Microsoft 365 admin center that deploys the Add-in to the whole organisation or a specific group in one step, but the self-service path below is all you need to follow this demo.
The starting point is the same on both platforms. Download the add-in file from the Databricks documentation page,[5] open it in a text editor, and add your workspace URLs inside the AppDomains block. Add one entry per workspace, so you can include all your Databricks workspaces at once. Paste each URL as plain text without formatting.
<AppDomains>
<!-- DO NOT CHANGE -->
<AppDomain>https://www.databricks.com</AppDomain>
<AppDomain>https://login.databricks.com</AppDomain>
<!-- ADD YOUR WORKSPACE URL BELOW -->
<AppDomain>https://adb-xxxxxxxxxxxx.xx.azuredatabricks.net</AppDomain>
</AppDomains>
Save the file as .xml. The full platform-specific steps for loading it into Excel and signing in are in the Databricks documentation.[5]
Connecting the Add-in to an existing report
The Add-in replaces the manual export step entirely. Before connecting, copy the sample data to your own catalog. This ensures every query appears in the audit log, which you need in the auditing section.[7]
CREATE TABLE excel_addon.default.bookings AS SELECT * FROM samples.wanderbricks.bookings;
For most use cases no SQL is needed at all. The Select data import method lets you browse and filter any Unity Catalog table directly from the Add-in panel, choose which columns to include, apply basic filters, set a row limit, and import. This works well when the table is already shaped correctly. For this demo, the actuals need some transformation: grouping individual bookings by month and summing revenue. That is why the Write SQL method is used here.
SELECT DATE_FORMAT(check_in, 'MMM yyyy') AS month, COUNT(*) AS actual_bookings, SUM(total_amount) AS actual_revenue FROM excel_addon.default.bookings WHERE status = 'confirmed' AND YEAR(check_in) = 2024 GROUP BY DATE_FORMAT(check_in, 'MMM yyyy'), MONTH(check_in) ORDER BY MONTH(check_in)
The query groups confirmed 2024 bookings by calendar month, sums revenue, and returns a formatted label (Jan 2024) the Dashboard formulas use as a lookup key. The numeric month in GROUP BY keeps ORDER BY in calendar sequence rather than alphabetical.
Set the output destination to the Actuals sheet at A4 and click Save and import. The query fills the sheet and the Dashboard formulas pick up the results immediately. Save and import stores the query definition inside the workbook, so anyone who opens the file can Refresh it later from the Imports tab. If you are still refining the query, use Import results instead, available from the dropdown next to the button: it runs the query without saving it, so recipients will not have a Refresh option.[6]

How Unity Catalog enforces access per user
The dashboard above shows the full dataset as it comes back for your account. Now say you want Marketing to have access to the same file and the same query, but with the revenue numbers masked. Unity Catalog handles that at query time, so no changes to the file or the query are needed.
Demoing column masking on your own account
To demo the masking without needing a workspace admin or group setup, create the masking function targeting your own user. It returns NULL for your account and the actual value for everyone else. The Excel formulas in the after file detect that NULL and display MASKED in the revenue, variance, and avg booking value columns:
CREATE OR REPLACE FUNCTION excel_addon.default.mask_revenue(revenue DOUBLE)
RETURNS DOUBLE
RETURN CASE WHEN current_user() = ‘your.email@domain.com’ THEN NULL ELSE revenue END;
Current_user() evaluates at query time to whoever is running the query, so the same function applies correctly to every user without any per-user configuration. Returning NULL rather than a placeholder value means Unity Catalog cleanly withholds the data, and the MASKED detection formulas in Excel can distinguish a masked cell from a genuinely empty one.
Apply the mask to the column:
ALTER TABLE excel_addon.default.bookings
ALTER COLUMN total_amount SET MASK excel_addon.default.mask_revenue;
Every query against total_amount from anywhere, including the Excel Add-in, now passes through the masking function automatically. No changes to the Excel file or the query are needed.
Testing the masking
Run Insert on the Actuals sheet with the same query. Booking counts and booking trend populate, but the revenue and avg booking value columns show MASKED, because Unity Catalog returns NULL for your account and the Excel formulas detect the blank revenue against a filled booking count. The Dashboard cascades the same: variance, var% and avg booking value also show MASKED, and the Status column shows Masked instead of Ahead or Behind.

Sharing the file
When you click Save and import, the query is stored inside the workbook and travels with the file when shared. Anyone with edit access can view it through the Add-in panel, so treat the query text as visible to recipients. The cell values themselves are static until someone Refreshes, meaning whatever your credentials pulled sits in those cells at the time of sharing. Before sharing, either clear the Actuals sheet entirely or run one final Save and import as the lowest-permission user, so recipients open a file that already reflects their access level. Refresh re-runs the saved query under their own credentials: if they do not have access to the underlying table in Unity Catalog, the refresh fails rather than returning partial data.
Auditing who accessed the data
After connecting, run this in your Databricks workspace:
SELECT
event_time,
user_identity.email AS user,
action_name
FROM system.access.audit
WHERE to_json(request_params) LIKE '%excel_addon.default.bookings%'
ORDER BY event_time DESC
LIMIT 10
event_time, user_identity.email, and action_name give the timestamp, who ran the query, and the operation type. metadataAndPermissionsSnapshot is a data read, logged each time the Add-in inserts or refreshes. The LIKE filter on request_params matches the table name across all event types. Note that system.access.audit has ingestion latency, so recent activity may not appear immediately.

Remove the mask before proceeding, or the live queries in the formula functions section will return masked results:
ALTER TABLE excel_addon.default.bookings
ALTER COLUMN total_amount DROP MASK;
DROP FUNCTION IF EXISTS excel_addon.default.mask_revenue;
Embedding Databricks data in formulas
The import approach shown above fills a fixed range on the Actuals sheet. The Add-in also supports embedding live Databricks data directly inside Excel formulas. The Formula Functions sheet in the demo file shows both. Two functions make this work: DATABRICKS.TABLE and DATABRICKS.SQL.
DATABRICKS.TABLE
Imports a Unity Catalog table directly into a cell range. Specify the fully qualified table name, an optional column selection array, and a row limit. In the Formula Functions sheet the formula selects three columns and limits the result to five rows:
=DATABRICKS.TABLE("excel_addon.default.bookings", {"booking_id","check_in","total_amount"}, 5)

DATABRICKS.SQL
Runs a parameterised SQL query from a formula cell, re-running automatically when the referenced cell changes. In the Formula Functions sheet, B17 holds the status filter with a dropdown for confirmed, pending, or cancelled. The formula in A20 references it:
=DATABRICKS.SQL("SELECT check_in, check_out, total_amount FROM excel_addon.default.bookings WHERE status = :status ORDER BY check_in DESC LIMIT 10", A17:B17)

Change B17 to “pending” and recalculate (Ctrl+Alt+F9) to show pending bookings instead. A17:B17 passes the parameter as a range, with A17 holding the name and B17 the value. Use the import panel when you need a saved query colleagues can Refresh; use the formula functions when you want data wired directly into spreadsheet logic.
Locale note: if you are on a European locale, replace commas with semicolons between arguments and backslashes inside arrays, as shown in the Formula Functions sheet.
Demo
The demo covers four things in sequence: connecting the Add-in and inserting a live query into an existing Excel report; running the same Insert as Finance and then as Marketing to show Unity Catalog enforcing column-level access in real time; querying the audit log to see exactly who has accessed the data and when; and using DATABRICKS.TABLE and DATABRICKS.SQL to embed live Databricks data directly inside Excel formulas.
Closing
Once connected, the monthly export cycle stops. The data team stops fielding the same recurring request, the analyst stops pasting CSV rows into cells each month, and anyone with file access can refresh against the source of truth whenever they need current numbers. Beyond data freshness, there is a governance benefit that CSV exports cannot replicate: because every refresh runs through Unity Catalog, each person automatically receives only the data their permissions allow, with no extra files and no manual filtering required.
The Add-in also supports writes. You can push a cell range from Excel directly back to Databricks to create or overwrite a table.[8] For teams that maintain manually curated inputs, such as budget targets or headcount plans, in a spreadsheet, this provides a path to bring that data into the lakehouse alongside operational data, keeping everything in one governed place. It is worth thinking through the implications before writing from many spreadsheets into a governed catalog, but for teams already maintaining inputs in Excel, the capability is available.
The shift is operational rather than technical. The Add-in does not ask teams to change how they work. It connects the spreadsheets people already use to the data that already exists in Databricks, applies Unity Catalog access controls at every refresh, and logs exactly who accessed what and when. The gap between governed data and the people who actually need it closes without anyone changing tools.
Written by

Arne Vanhoof
Manager @ Aivix

Tom Thevelein
Technical lead @ Aivix
Sources
- Attanapola, K. & Iyer, A. (November 2025). “A new era in BI: Overcoming low adoption to make smart decisions accessible for all.” IBM Think. ibm.com/think/insights/business-intelligence-adoption
- Richardson, B. (Updated 3 February 2026). “Excel Statistics: Facts & Figures [Original Research].” Acuity Training. acuitytraining.co.uk/news-tips/new-excel-facts-statistics/
- FP&A Trends Group (2025). “FP&A Trends Survey 2025.” fpa-trends.com
- Association for Financial Professionals (2025). “AFP FP&A Benchmarking Survey 2025: Technology & Data.” financialprofessionals.org
- Databricks (Last updated May 2026). “Set up the Databricks Excel Add-in.” Databricks Documentation. docs.databricks.com/aws/en/integrations/excel-setup
- Databricks (Last updated Jun 2026). “Import and query data using the Databricks Excel Add-in.” Databricks Documentation. docs.databricks.com/aws/en/integrations/excel-query
- Databricks (Last updated Mar 2026). “Wanderbricks dataset.” Databricks Documentation. docs.databricks.com/aws/en/discover/wanderbricks-dataset
- Databricks (Last updated Jun 2026). “Write data back to Databricks using the Databricks Excel Add-in.” Databricks Documentation. docs.databricks.com/aws/en/integrations/excel-write-back
