Paste JSON and download a real workbook, where numbers stay numbers and dates stay dates. The same table comes as a PDF or CSV too. Your JSON never leaves this page.
Valid JSON.
Parsed and rendered on this page7 rows from $.data.orders[*], with 7 columns.
Drag to reorder, or Alt and an arrow key. Select a column to rename it, change its type or hide it.
| ID | Date | Customer name | Customer country | Status | Total | Items |
|---|---|---|---|---|---|---|
| A-1001 | Sep 2, 2026 | Folio & Sons | IE | paid | $1,440.00 | 3 |
| A-1002 | Sep 3, 2026 | Atelier Vink | NL | paid | $320.50 | 1 |
| A-1003 | Sep 7, 2026 | Marlborough Books | IE | refunded | $89.99 | 2 |
| A-1004 | Sep 11, 2026 | Atelier Vink | NL | paid | $1,600.00 | 1 |
| A-1005 | Sep 15, 2026 | Papierfabriek Deckle | NL | pending | $275.00 | 2 |
| A-1006 | Sep 21, 2026 | Folio & Sons | IE | paid | $48.00 | 1 |
| A-1007 | Sep 28, 2026 | Ledger & Co | GB | paid | $712.40 | 2 |
| Total | $4,485.89 | |||||
The workbook has the same columns, with numbers, money, and dates as real cells you can sort and sum.
Every export on this page is a quario definition: the report.json in the panel. It names the rows and the columns, and says how to present each value. Store it with your code and render it with your data. You get the same workbook, PDF, or CSV from a server, a worker, or the browser.
{
"data": "$.data.orders[*]",
"style": {
"family": "sans",
"size": 9
},
"header": [
{
"type": "text",
"value": "Orders",
"style": {
"family": "serif",
"size": 15,
"bold": true,
"spaceAfter": 12
}
}
],
"detail": {
"columns": [
{
"header": "ID",
"value": "{{ @.id }}"
},
{
"header": "Date",
"value": "{{ @.date }}",
"style": {
"format": "date"
}
},
{
"header": "Customer name",
"value": "{{ @.customer.name }}"
},
{
"header": "Customer country",
"value": "{{ @.customer.country }}"
},
{
"header": "Status",
"value": "{{ @.status }}"
},
{
"header": {
"value": "Total",
"style": {
"align": "right"
}
},
"value": "{{ round(@.total, 2) }}",
"style": {
"align": "right",
"format": "currency"
}
},
{
"header": {
"value": "Items",
"style": {
"align": "right"
}
},
"value": "{{ count(@.items) }}",
"style": {
"align": "right"
}
}
],
"header": {
"style": {
"family": "mono",
"size": 7,
"uppercase": true,
"color": "#6b7a82",
"paddingBottom": 3,
"borderBottomWidth": 0.5,
"borderBottomStyle": "solid",
"borderBottomColor": "#cfd8dd"
}
},
"row": {
"style": {
"paddingTop": 2,
"paddingBottom": 2,
"borderBottomWidth": 0.25,
"borderBottomStyle": "solid",
"borderBottomColor": "#e6ecef"
}
},
"total": {
"style": {
"bold": true,
"align": "right",
"paddingTop": 5,
"borderTopWidth": 0.75,
"borderTopStyle": "solid",
"borderTopColor": "#1e1f22"
},
"rows": [
{
"cells": [
{
"value": "Total",
"span": 5
},
{
"value": "{{ round($.total0, 2) }}",
"style": {
"format": "currency"
}
},
{
"value": ""
}
]
}
]
}
},
"aggregates": {
"total0": "sum:[email protected]"
}
}customer.name, and a list inside a row becomes a count.