Documentation · Reference
XLSX and CSV file format
The schema of the round-trip workbook: one sheet per culture, the column layout Daxlate reads back, and the rules that decide whether a row imports.
Last updated:
Daxlate exports translations as either XLSX (via ClosedXML) or CSV (via
CsvHelper). A file that has a report layer exports two sheets, Model and
Report (or paired .model.csv + .report.csv); a model-only file exports
just the model layer. This page documents the model sheet in detail, then the
report sheet.
Model sheet layout #
The model worksheet is named Model (single-layer exports from older builds
named it Translations). Its rows:
| Row | Contents |
|---|---|
| 1 | Schema-version marker in cell A1 (Daxlate/1.0, italic, gray) |
| 2 | Header row, bold, with a beige background |
| 3+ | One row per translatable object |
The header row freezes so column titles stay visible as the translator scrolls. The first four columns also freeze so the identity columns stay visible as they scroll right across the culture columns.
Columns #
Four fixed informational columns come first:
| Column | Notes |
|---|---|
Object ID | Import-time identity key. Do not edit. |
Type | One of Table, Column, Measure, Hierarchy, Level. |
Parent | Containing object’s name (e.g. the table a measure lives in). |
Name | The object’s name in the model (the default-culture caption). |
Then, for each culture in the model, two columns:
Caption ({culture}) Description ({culture})
The model’s default culture columns get a shaded background so it’s clear which column is the source of truth.
Which of the two columns are written follows the grid’s VIEW switch at export time: Caption writes caption columns only, Description writes description columns only, Both writes both. Every object still gets a row in every mode, including ones with no description yet.
Object ID convention #
Daxlate composes IDs from the object’s kind and qualified name:
| Kind | Form | Example |
|---|---|---|
| Table | t.{Name} | t.Sales |
| Column | c.{Table}.{Name} | c.Sales.Revenue |
| Measure | m.{Table}.{Name} | m.Sales.Total Revenue |
| Hierarchy | h.{Table}.{Name} | h.Date.Calendar |
| Hierarchy Level | {HierarchyId}.l{Ordinal} | h.Date.Calendar.l1 |
Renaming an object in the model changes its ID. On re-import, rows with an unknown Object ID are surfaced as warnings in the preview dialog and skipped; the import does not silently drop them.
Schema version #
Cell A1 of the XLSX (or the first comment line of the CSV) carries the
schema version. The reader rejects files from a newer major version with a
clear warning and treats missing markers as 1.0 for back-compat with
exports made before versioning was added.
The current marker is Daxlate/1.0. Bumps are minor for additive
columns (new columns are ignored with a warning) and major for breaking
changes (e.g. a different Object ID convention).
Report sheet #
For a file with a report layer, a second sheet named Report carries the
report-canvas text (visual titles, headers, buttons, text boxes). It uses a
wide, translator-friendly shape: one row per text element with a single
Value ({culture}) column per language, rather than the caption/description
pair the model sheet uses, so a translator fills every language for a string on
one line. Import content-detects whether a file is a model sheet, a report
sheet, or a two-sheet workbook and applies the matching layer.
On disk, report translations live next to the file as a per-file sidecar named
{file}.daxlate.csv, the functional CSV Power BI reads at refresh. The model
translations live inside the .pbit; get a copy of them from Export. See
Translate report visuals.
CSV layout #
CSV uses the same column layout, comma-separated. Line 1 holds the schema marker as a comment:
# Daxlate/1.0
Object ID,Type,Parent,Name,Caption (en-US),Description (en-US),Caption (fr-FR),Description (fr-FR)
t.Sales,Table,,Sales,Sales,,Ventes,
c.Sales.Revenue,Column,Sales,Revenue,Revenue,,Chiffre d'affaires,
UTF-8 with BOM, CRLF line endings, for Excel double-click compatibility.
Empty cells #
A blank cell means “not translated yet” and is left untouched on import; it does not clear an existing translation. This matches XLIFF, gettext, and the mainstream translation platforms, so handing back a half-finished file never wipes the rows a translator hasn’t reached. The import preview reports how many blanks it skipped. To remove a translation, clear it in the grid or drop the language from the Cultures dropdown. See Excel round-trip for the full re-import flow.