Support matrix
What the five published targets do with a declaration, in one place, so you do not hold five contracts in your head at once. The cells come from the engine’s specification at the version these docs describe.
This page isn’t normative. Each target’s own page states its contract, and this one indexes them without overriding any. Where a cell and a target page disagree, the target page is right.
A cell names the fate of the declaration and then says what it comes to. A fate is one of resolved, approximated, withdrawn, unread, and not applicable for a target with no such concept to answer with. A cell marked (best-effort) describes what that target does today and may change without a breaking change. Everything else is that target’s contract. Rows about an engine or target behaviour rather than a declaration carry plain prose.
True in every target
- A hidden cell keeps its slot, rendering an empty
<td>, an empty styled cell, or an empty field. - Grouping is the walk order everywhere. No target reorders bands.
- The report default is the outermost layer of the style stack.
- An image item’s target-blind semantics: a nullish
sourceskips it, invalid bytes throw, a hidden one emits nothing. - The marking’s wording is the engine’s. A target owns only where it goes.
- Definition problems throw synchronously from
render. Render errors reject located.
Page and pagination
| Declaration or behaviour | html |
pdf |
xlsx |
csv |
docx |
Stated in |
|---|---|---|---|---|---|---|
page.header / page.footer content |
unread — the closures are never called | resolved — drawn on every page, height reserved | unread — the closures are never called | unread — the closures are never called | resolved — a section header and footer. This target reads each band twice, at page 1 and page 2 of 2; a first-page part rides only where the two differ | Page bands |
| A render error inside a page band | never raised — the band isn’t evaluated | raised, located, at render | never raised | never raised | raised, located, at render — this target calls the closures | Page bands |
break: "page" / reset: "page" |
approximated — a q-break class, inert without host print CSS |
resolved — a fresh page per instance; reset restarts the numbering |
withdrawn — no page to break | withdrawn — no page to break | resolved — pageBreakBefore on the instance’s first paragraph; reset a nextPage section with pgNumType at 1 |
Group definition |
columns (page columns) |
resolved — a CSS multicol container; balancing and gutter the browser’s (best-effort) | resolved — strips of the page; gutter and balancing (best-effort) | withdrawn — no page to strip | withdrawn — no strips here | resolved — section cols, equal width; approximated past three in Google Docs |
Page columns |
page.margin |
resolved — an @page margin rule |
resolved — the four sides of the page box | withdrawn — a grid has no page | withdrawn — a record has no page | resolved — pgMar, all four sides |
PDF › Options |
Report-header height |
withdrawn — a CSS height pins the body box, not the page top | resolved — pins a box from the page top | withdrawn — no page top to pin from | withdrawn — no page top to pin from | withdrawn — no portable way to pin a box from the page top | PDF › Options |
Structure
| Declaration or behaviour | html |
pdf |
xlsx |
csv |
docx |
Stated in |
|---|---|---|---|---|---|---|
| The group tree | resolved — nested q-group containers carrying the group name |
resolved — outline entries, nested by depth, and a half-line gap | resolved — that order alone; group boundaries add no rows | resolved — that order alone | resolved — Heading<n> from this target’s own styles.xml, so no theme typography leaks |
Group definition |
Column width |
approximated — a <col> width a browser may widen past |
resolved — the share exactly; width-less columns measured from content | withdrawn — no table for a share to be a share of | withdrawn — a record has no width | approximated — declared shares exact in a fixed tblGrid; width-less columns divide the remainder evenly |
XLSX › Widths are withdrawn |
Slot width |
resolved — a percentage on the slot, width-less slots flexing | resolved — the share exactly; the rest divided evenly | withdrawn — the same ground as column widths | withdrawn — a record has no width | resolved — a fixed table with no borders, shares exact | Split item |
span |
resolved — a colspan on the cell |
resolved — one box drawn across the columns | resolved — merged in header and total rows, never over data | resolved — the first field carries it, the rest empty | resolved — gridSpan |
Span |
| Keeping table headers in view | the reference sheet’s thead rule, under print fragmentation |
the header row repeats after every page break and at a new strip | a freeze pane at the first table’s header row | not applicable — a file has no view | resolved — tblHeader repeats the row after every page break |
XLSX › Freeze |
Style
| Declaration or behaviour | html |
pdf |
xlsx |
csv |
docx |
Stated in |
|---|---|---|---|---|---|---|
uppercase |
resolved — text-transform, which the browser applies locale-sensitively |
resolved — capitalised before measuring, Unicode default case mapping | withdrawn — capitalising the cell would turn presentation into data | withdrawn — a record carries no style | resolved — capitalised before writing, Unicode default case mapping | Style declarations |
| Padding and the box | resolved — sides inline, box-sizing: border-box |
resolved — insets wrap width; a sliced item keeps the sides it owns | borders approximated (solid → thin); padding withdrawn |
withdrawn — a record carries no style | resolved per cell (tcMar, tcBorders, shd); approximated on an item — pBdr and shading, padding as the border space |
Style declarations |
spaceBefore / spaceAfter |
resolved — margins that add rather than collapse | resolved — the cursor skips; dropped at a fresh page or strip top | withdrawn — a grid has no flow | withdrawn — a record carries no style | resolved — paragraph spacing before/after | Style declarations |
format |
resolved — stringified at the markup edge through format() |
resolved — the same, from the instance locale | resolved — a number format; the cell stays typed | withdrawn — the field carries the typed value instead | resolved — stringified at the markup edge through format() |
Style declarations |
| What the target supplies where the author declared nothing | nothing — every visual default is the host stylesheet’s | report header bold 14, group header bold, 10 pt base, cell padding | report header bold 14, group header bold, 10 pt base | nothing — a record has no presentation | report header bold 14, group header bold, 10 pt base, 6 pt / 2 pt cell padding, a half-line gap before a group instance | HTML › Styles |
A family name that’s not a generic |
resolved — quoted as the family, or the host’s fonts mapping |
approximated — falls back to sans unless the host embeds the face |
resolved — passed through for the reader’s application | withdrawn — a record carries no style | resolved — named on the run for the reader to substitute, never embedded | Style declarations |
valign |
resolved — vertical-align, a row’s reaching its cells |
resolved — the lines placed in the slack a row or slot leaves | resolved — undeclared writes nothing, so the application’s own default stands | withdrawn — a record carries no style | resolved — vAlign on the cell |
Style declarations |
| What the host supplies | the stylesheet — every visual default — and what a family name means |
the TrueType faces through fonts — and which scripts come out right is the parser’s, not quario’s |
the reader’s application, which resolves an unmapped family name |
nothing | nothing — no fonts option, no stylesheet | PDF › Text |
Text and values
| Declaration or behaviour | html |
pdf |
xlsx |
csv |
docx |
Stated in |
|---|---|---|---|---|---|---|
| A cell that’s one bare interpolation | display text — a Date as ISO 8601 UTC |
display text — a Date as ISO 8601 UTC |
a native number, boolean, or date cell | the typed value as text — a Date as ISO 8601 UTC |
display text — a Date as ISO 8601 UTC |
Event stream |
| Literal markup in template text | live markup — literal text passes verbatim | literal text | literal text | literal text | literal text | String syntaxes |
| A cell of more than one styled run | resolved — one <span> per run, carrying that run’s whole style |
resolved — face, size and colour per run; the line takes the largest | resolved — worksheet rich text, and a run’s background is inert |
withdrawn — runs flatten to their joined text | resolved — one <w:r> per run, its own shading included |
XLSX › Styled runs |
| Characters outside WinAnsi | intact | ? on the base-14 faces; an embedded face by its own cmap |
intact | intact | intact — the parts are UTF-8 XML | PDF › Text |
| A newline inside a cell | a break, through the reference sheet’s pre-line rule |
a hard line break, with wrapping still applied within each line | wrapText, so the break shows in the grid |
a quoted field whose record spans lines | a <w:br/>, a hard line break |
HTML › Classes and the stylesheet |
Cell text beginning with = |
plain text | plain text | an inert string — never a formula, and never mangled | apostrophe-prefixed: the author’s text changes | plain text | CSV › Injection guard |
Output
| Declaration or behaviour | html |
pdf |
xlsx |
csv |
docx |
Stated in |
|---|---|---|---|---|---|---|
| An image item | an <img> holding a data: URI — needs img-src data: |
drawn at the size fit dictates, never split across a page |
a floating drawing anchored to one row — wholly best-effort | no record of its own; an empty field in a slot | inline (wp:inline) at the size fit dictates, capped at the text column; never floating |
Image item |
Image alt |
resolved — the alt attribute, escaped |
withdrawn — no tagged structure to carry it | withdrawn — a floating drawing carries none | withdrawn — a record carries none | resolved — docPr descr |
Image item |
| The unlicensed marking | a badge element before the report root | a diagonal line on every page; its geometry (best-effort) | a row-1 banner and the workbook description | one trailing line — weaker than the other three | the first paragraph of every footer part, before any authored content | License keys |
| Determinism | an identical fragment | byte-identical output | the model is stable, the bytes aren’t | an identical string | identical bytes on every supported runtime, while the writer is fflate | PDF › Determinism |