Excel to YAML Converter
The settings were agreed in a spreadsheet and the service reads YAML. Each row becomes a mapping, each column gets one type, and every value a parser would misread comes back quoted.
To convert Excel to YAML, drop your .xlsx above. The first sheet with data converts immediately and the rest are listed so you can switch. Each row becomes one mapping in a YAML sequence keyed by the header row, each column is given a single type, blank cells become null, and values a YAML reader would coerce are quoted. Nothing is uploaded.
Want to drop or rename columns first? Open the app
A spreadsheet is a good place to decide and a bad place to ship
Forty rows of per-service settings are easy to review side by side in a sheet, where you can sort by environment and spot the one row with no owner. The same forty rows as indented YAML are forty blocks nobody proofreads.
So the workflow that keeps appearing is: decide in the sheet, ship the file. Feature flags, replica counts, alert thresholds, plan tiers, per-tenant overrides. Product fills in the spreadsheet, the application reads YAML, and somebody in the middle is currently doing the translation by hand.
This is that translation, done the same way every time, with the failure modes of YAML handled rather than discovered.
Worked example: a deployment matrix
A sheet with the columns you would actually have:
service environment replicas log_level autoscale cost_centre released
billing-api production 6 info TRUE 01730 2026-01-08
billing-api staging 2 debug FALSE 01730 2026-01-06
web-frontend production 4 warn TRUE 02139 2026-01-12
And the YAML:
- service: billing-api
environment: production
replicas: 6
log_level: info
autoscale: true
cost_centre: '01730'
released: '2026-01-08'
- service: billing-api
environment: staging
replicas: 2
log_level: debug
autoscale: false
cost_centre: '01730'
released: '2026-01-06'
- service: web-frontend
environment: production
replicas: 4
log_level: warn
autoscale: true
cost_centre: '02139'
released: '2026-01-12'
autoscale became real booleans because Excel's TRUE and FALSE are booleans. cost_centre is quoted because unquoted it is the number 1730 and your cost centre has stopped existing. released is quoted because bare it is a YAML 1.1 timestamp, and a config that expected a string now holds a date object.
Sheets, and the modal that is not here
A real workbook has a data sheet, a notes sheet, a pivot somebody built once, and a tab called Sheet3 that is empty. The useful behaviour is to convert the first sheet that has data and show the rest, not to stop and ask.
That is what happens. You get a result immediately, with every sheet name listed under it, and switching re-runs the conversion. If the first sheet is empty, the first one with data is used and a note says so rather than handing you an error with no picker on the screen to fix it with.
How Excel's own types are read
A workbook already knows what its cells are, which makes this easier than reading a CSV, and slightly stranger. A cell formatted as a date is read as a date and written as a quoted ISO string. A cell containing a formula is read as its computed value, because that is what the sheet shows and what the reader means.
A number formatted to two decimal places is read as its underlying value, not its display text, so a cell showing 1,840.50 comes through as 1840.5. That surprises people, and it is correct: the comma and the trailing zero were the format, not the number. If the exact display text matters, format the column as text in Excel before you export.
A merged cell contributes its value to the top-left cell of the merge and blanks elsewhere, which is what the file itself says. Merged header cells are the most common reason a converted sheet has a column called column_3 in it.
The quoting rules in one place
- Anything that reads as a boolean.
no,yes,y,n,on,off. Norway's country code is the famous casualty. - Anything that reads as a number but is not one.
01730,1.10,1e5,+44. - Anything that reads as a date. An ISO date bare in YAML is a timestamp, so it is quoted.
- Anything that reads as null.
~, and the bare word null typed as text. - Everything else stays bare, because a file where every value is quoted is a file nobody reads carefully, and the point of YAML over JSON is that people read it.
Frequently Asked Questions
My workbook has five sheets. Which one is converted?
The first one with data, immediately, and all five names are listed under the result so you can switch with one click. There is no modal to answer before you see anything, which is the pattern most converters use and the one that makes a quick check slow.
Why is my cost centre in quotes?
Because 01730 unquoted in YAML is the number 1730 and the leading zero is gone. Quoting keeps it the string it is. The same applies to anything that would read as a number, a boolean, a date or a null.
Why does a cell showing 1,840.50 come out as 1840.5?
Because the comma and the trailing zero were the cell's number format, not the value. Excel stores the number and paints the format. If the display text is what matters, format that column as text in Excel before you export.
Do formulas come through?
As their computed values, which is what the sheet shows and what you almost always mean. The formula itself is not carried into the YAML, because YAML has nothing to do with it.
What do blank cells become?
Real nulls, not empty strings. In a config that distinction usually decides whether a default applies, which makes it one of the few places where being pedantic saves an incident rather than causing an argument.
Is the file uploaded?
No. The workbook is read in your browser tab with SheetJS and nothing is sent, stored or logged. That matters for a spreadsheet more than for most files, because the workbook you convert often has three other sheets in it you did not think about.
Ship the sheet as a config file
One mapping per row, one type per column, quotes exactly where a parser needs them.
Back to the converter