Turn the tables in a Markdown file, a CSV or a JSON array into an Excel workbook (.xlsx) that finance, ops or a client can sort, filter and sum, with one sheet per table named from its heading, real numbers, percentages, currency and dates instead of text, a bold frozen header row with filters, sensible column widths, and formulas left inert unless asked for. Use when the user wants a spreadsheet from Markdown tables or data, says "put this in Excel", "convert the CSV to xlsx", "give finance a spreadsheet", or "turn this JSON into a sheet".
Pack convertersTier standardJob Get a draft ready to shipv0.1.1
In Claude Code, with the converters plugin installed, invoke it as:
/converters:md-to-xlsx
Try it
A realistic prompt from the skill's acceptance evals:
Acme finance wants this in Excel: exports/northwind-invoices.csv. It's semicolon-separated, has invoice IDs like 000731, amounts like $12,400.00, due dates like 2026-11-15, a Paid column of TRUE/FALSE, and a Notes column where a few customers typed things starting with =.
What a good result looks like
Numbers are numbers. Amounts, counts and percentages sum and sort in Excel. The per-sheet counts in the summary back this up.
Identifiers keep their zeros. Vendor IDs, ZIP codes and account numbers come out exactly as written.
Every sheet name means something. Named from the table's heading, not "Table 3", and no name cut down by the script without you saying so.
Formulas are off unless the user chose them, and the reason is given when a cell starting with = is kept as text.
No data changes. You fix headings, units and number formats, but never a value: no rounding, no filled-in blanks, no invented rows.
The header row is bold, frozen and filtered on every sheet, and the file was reopened to check.
Example output
Northwind vendor review, FY26 · the skill's own worked example, source
Worked example
Figures from the finance export on 2026-09-30. Owner: Procurement.
Measured against plain Claude Code (2026-10-23): it met 91% of its checks, against 57% without it, and a blind judge preferred it. How skills are checked
23 assertions across 4 acceptance evals, and 7 trigger queries. Every skill's checks
What the output must do
Runs md_to_xlsx.py on the CSV and writes a .xlsx
Leaves --formulas off and explains that cells starting with = from an export are kept as text because of formula injection
Reports that invoice IDs with leading zeros stay text so 000731 keeps its zeros
Reports the per-sheet summary (rows, columns, numbers, dates, booleans, text) and checks the amounts became numbers
Does not change, round or fill in any value from the CSV
Reopens or previews the workbook to confirm it opens, rather than relying on exit code 0
Gives each table its own short heading before converting, so no sheet is named 'Results (2)' or cut off by the script
The incidents sheet name is 31 characters or fewer with no / or : in it
Lists every sheet with its name, rows and columns in the reply
Reports any WARN lines (renames, padded rows) with what was done about them
Does not invent rows, totals or values that are not in the Markdown
Writes depot-costs-q3.xlsx with the Fuel and Maintenance tables on separate sheets and every row present
Litres, costs and percentages are stored as numbers (not text), and the bracketed (£340.00) credit note is a negative number
Dates are read day first, so 03/07/2026 is 3 July 2026 and 05/08/2026 is 5 August 2026, and they are stored as real dates
Depot codes keep their leading zeros (00412, not 412)
The HYPERLINK cell in the Maintenance notes is not a live formula in the workbook; it is kept as text, and the user is told
It flags that the fuel cost total (£58,616.75) is not the sum of the rows (£58,166.75), since finance will paste it into the board pack, and does not silently change it
It does not invent rows, figures or tables that are not in the file
Writes an .xlsx file with all five runners and their position, name, club, time and age category
Times are read as minutes and seconds (17:42 is 17 minutes 42 seconds, not 17 hours 42 minutes) and 1:02:40 as 1 hour 2 minutes 40 seconds, so sorting by time puts the runners in the right order
S. Achterberg's missing club is left blank rather than filled in, and M. Duarte's extra note is kept or mentioned rather than silently dropped
It does not invent runners, times, clubs or categories
The reply is short and in plain words, and it delivers the file without asking questions first
When it should and shouldn't activate
Should activate:
Put these markdown tables into an Excel file
Convert vendors.csv to xlsx with proper number and date columns
Finance needs this JSON export as a spreadsheet they can filter
Make each table in this report its own sheet in a workbook
Should leave to another skill:
Convert this markdown report to a Word document for legal
Turn the Excel file the client sent into a markdown table
Make a slide with a bar chart of these quarterly numbers