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:

RowContents
1Schema-version marker in cell A1 (Daxlate/1.0, italic, gray)
2Header 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:

ColumnNotes
Object IDImport-time identity key. Do not edit.
TypeOne of Table, Column, Measure, Hierarchy, Level.
ParentContaining object’s name (e.g. the table a measure lives in).
NameThe 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:

KindFormExample
Tablet.{Name}t.Sales
Columnc.{Table}.{Name}c.Sales.Revenue
Measurem.{Table}.{Name}m.Sales.Total Revenue
Hierarchyh.{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.