
Xlsx Skill
FreeCreate and manipulate Excel workbooks with Python.
Free · Opens the source repo
What Xlsx Skill does
The Xlsx Skill provides a robust set of tools for creating, reading, and editing Excel .xlsx workbooks using Python and the openpyxl library. This skill enables developers and data analysts to generate styled multi-sheet reports complete with formulas, charts, and various Excel features such as data validation and conditional formatting. Additionally, it offers capabilities to inspect existing workbooks, allowing users to dump data into JSON or CSV formats, list formulas, and manage defined names and tables.
The skill includes several command-line interface (CLI) scripts that facilitate various tasks. For instance, users can create workbooks from JSON specifications, read and analyze the structure of existing files, and edit cell values or formulas. The xlsx_restructure.py script is particularly useful for modifying sheets that contain formulas, ensuring that references are correctly adjusted when rows or columns are inserted or deleted. Furthermore, the skill supports seamless conversion between CSV and Excel formats, making it versatile for data interchange.
This skill is ideal for anyone who frequently works with Excel files in a programmatic way, such as data scientists, analysts, and software developers. It streamlines the process of generating reports and managing data in Excel, which can enhance productivity and reduce manual errors. The reliance on standard libraries and the ability to run headlessly with LibreOffice for recalculating formulas adds to its appeal for automated workflows.
However, it is important to note that this skill does not support the legacy .xls binary format, so users will need to convert such files to .xlsx using tools like LibreOffice before processing them with this skill. Overall, the Xlsx Skill is a powerful addition for those who need to manipulate Excel files programmatically without the overhead of manual editing.
When to use it
Use this skill when you need to generate reports in Excel format, read data from existing workbooks, or modify Excel files programmatically.
When not to use it
Avoid this skill if you need to work with legacy `.xls` files, as it does not support that format directly.
What you can build with it
Automated Report Generation
Generate complex Excel reports with multiple sheets, styled cells, and embedded charts from JSON specifications.
Data Analysis and Inspection
Quickly read and analyze existing Excel workbooks to extract data, formulas, and structure for further processing.
Batch Processing of CSV Files
Convert multiple CSV files into styled Excel workbooks for better presentation and data manipulation.
How to install Xlsx Skill
View source1. Install with the skills CLI
npx skills add nousresearch/hermes-agent/xlsx --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by nousresearchXlsx Skill
Work with Excel .xlsx workbooks using Python and openpyxl: build styled multi-sheet workbooks with formulas and charts, inspect or dump existing files, edit cells and structure, and convert to/from CSV. All helper scripts are argparse CLIs that print JSON and use explicit UTF-8 I/O.
When to Use
- Creating .xlsx reports: multiple sheets, number formats, styling, merged cells, freeze panes, autofilter, conditional formatting, charts, data-validation dropdowns, native Excel tables, defined names, hyperlinks, cell notes, sheet protection.
- Reading a workbook: sheet inventory, dumping data as JSON or CSV, listing formulas vs cached values, notes, defined names, tables.
- Editing existing files: set cells, append rows, insert/delete
rows/columns (reference-aware via
xlsx_restructure.py), copy/rename sheets, tables, names, notes, protection. - Recalculating formulas headlessly via LibreOffice
(
xlsx_recalc.py). - CSV interop with type inference and non-UTF-8 encodings.
- Not for the legacy .xls binary format (use LibreOffice to convert
first:
soffice --headless --convert-to xlsx old.xls).
Prerequisites
- Python 3.10+ with
openpyxl(pip install openpyxl). No other third-party packages are needed; everything else is stdlib. - Optional: LibreOffice (
soffice) for headless recalculation or format conversion.
How to Run
Run the helper scripts with the terminal tool from this skill's
scripts/ directory (every script supports --help):
python scripts/xlsx_create.py spec.json report.xlsx # build from JSON spec
python scripts/xlsx_read.py report.xlsx --sheets # inventory
python scripts/xlsx_read.py report.xlsx --json --sheet Data
python scripts/xlsx_read.py report.xlsx --formulas
python scripts/xlsx_edit.py report.xlsx --sheet Data --set B2=42 --recalc
python scripts/xlsx_restructure.py report.xlsx --sheet Data --insert-rows 3:2
python scripts/xlsx_recalc.py report.xlsx
python scripts/csv_to_xlsx.py data.csv out.xlsx --encoding utf-8
python scripts/xlsx_to_csv.py report.xlsx out.csv --sheet Data
Author the JSON spec with write_file, inspect script JSON output with
read_file or directly from stdout.
Quick Reference
| Task | Command |
|---|---|
| Create workbook from spec | xlsx_create.py spec.json out.xlsx |
| Sheet names + dimensions | xlsx_read.py f.xlsx --sheets |
| Dump sheet as JSON | xlsx_read.py f.xlsx --json --sheet S |
| Dump sheet as CSV | xlsx_read.py f.xlsx --csv --out d.csv |
| List formulas + cached values | xlsx_read.py f.xlsx --formulas |
| Set a cell / formula | xlsx_edit.py f.xlsx --set "A1==SUM(B:B)" |
| Append a row | xlsx_edit.py f.xlsx --append '[1,"x",true]' |
| Insert 2 rows, refs NOT shifted | xlsx_edit.py f.xlsx --insert-rows 3:2 |
| Insert 2 rows, refs shifted | xlsx_restructure.py f.xlsx --insert-rows 3:2 |
| Delete a column, refs shifted | xlsx_restructure.py f.xlsx --delete-cols B |
| Create a native table | xlsx_edit.py f.xlsx --add-table Sales:A1:C9 |
| Append inside a table | --table-append 'Sales=["West",5]' |
| List tables | xlsx_edit.py f.xlsx --list-tables |
| Defined names | --define-name "Rates='Data'!$B$2:$B$9" / --delete-name Rates / xlsx_read.py f.xlsx --names |
| Hyperlink | `--hyperlink "A1=https://example.com |
| Cell note | `--note "B2=Check this |
| Protect sheet (see Pitfalls) | --protect your-password --unlock B2:B9 |
| Recalculate via LibreOffice | xlsx_recalc.py f.xlsx |
| Copy / rename sheet | --copy-sheet Src:New --rename-sheet Old:New |
| Force recalc on open | xlsx_edit.py f.xlsx --recalc |
| CSV -> styled xlsx | csv_to_xlsx.py in.csv out.xlsx |
| xlsx -> CSV | xlsx_to_csv.py f.xlsx out.csv --encoding utf-8 |
Procedure
- Create: write a JSON spec (schema documented in
xlsx_create.py --helpand its docstring). Each sheet supportsrows(scalars or styled cell objects), sparsecellsoverrides,column_widths,row_heights,merges,freeze_panes,autofilter,conditional_formats(cell_is rules and color scales),charts(bar/line/pie from cell ranges),validations(list dropdowns),tables(native Excel tables with a style name), andprotection. Workbook-leveldefined_namesmaps names to refs. Cell objects also takehyperlinkandnote. Typed values: JSON numbers/bools pass through; dates use{"value": "2026-01-31", "type": "date"}. Number formats are Excel format strings: currency"$#,##0.00", percent"0.0%", date"yyyy-mm-dd". - Formulas: set with
"formula": "SUM(B2:B9)"in the spec or--set "C1==SUM(A:A)"in the editor. When writing formulas, add"full_calc_on_load": true(spec) or--recalc(editor); this sets the workbook'sfullCalcOnLoadflag so Excel/LibreOffice recompute everything on open. openpyxl itself NEVER evaluates formulas. - Read:
--sheetsfor inventory (names, dimensions, merged ranges, chart count, tables, protection, defined names),--json/--csvfor data,--formulasto pair each formula string with its cached result,--notesfor cell comments,--namesfor defined names. Cached results exist only if the file was last saved by a real spreadsheet app; files fresh from openpyxl returnnullthere. To materialize results headlessly runxlsx_recalc.py file.xlsx(uses LibreOffice; prints{"recalculated": false, ...}and exits 0 whensofficeis absent), then reload with--data-only. - Edit:
xlsx_edit.pyapplies renames/copies first, then structural row/column changes, then--set/--append. It edits in place unless--outis given — copy the file first if you need the original. - Restructure: for insert/delete on sheets that have formulas,
merges, tables, or filters, use
xlsx_restructure.pyinstead ofxlsx_edit.py. It rewrites formula references on ALL sheets (absolute$refs, ranges, cross-sheet refs), shifts merges, autofilter, freeze panes, validation and conditional-format ranges, table refs, defined names, and row/column dimensions, then prints a JSON report including anot_shiftedlist. Rules and limits:references/restructuring.md. - CSV interop:
csv_to_xlsx.pyinfers int/float/bool/ISO-date per cell and styles the header row;xlsx_to_csv.pywrites ISO dates and blank strings for empty cells. Both default to UTF-8 and accept--encoding(e.g.utf-8-sigfor Excel-friendly BOM,cp1252for legacy Windows exports).
Converting to PDF
LibreOffice converts headlessly (also works for CSV export of a single sheet):
soffice --headless --convert-to pdf report.xlsx --outdir out/
soffice --headless --convert-to csv report.xlsx --outdir out/ # 1st sheet only
Only the first sheet lands in a CSV; for other sheets use
xlsx_to_csv.py --sheet NAME. If soffice is missing, install
LibreOffice or hand the file to the user unconverted.
Pitfalls
- openpyxl does not calculate. Formula results are available only
via
load_workbook(path, data_only=True)and only when the file was previously saved by Excel/LibreOffice. Otherwise you getNone. xlsx_edit.pyinsert/delete does not shift references (raw openpyxl behavior). Usexlsx_restructure.py, which does — but even it cannot move chart anchors, images, or conditional-format RULE formulas; read its JSON report'snot_shiftedlist andreferences/restructuring.md.- Sheet protection is NOT security.
--protectsets the standard xlsx sheet-protection hash: it signals "don't edit this" to well-behaved apps and nothing more. Anyone can strip it by editing the zip's XML or unchecking it in LibreOffice. Never rely on it for confidentiality or integrity; it does not encrypt anything. data_only=Truethen save silently discards all formulas (cached values replace them). Never save a workbook loaded that way unless that is the goal.- Loading strips charts/images: openpyxl does not round-trip charts, so editing a charted workbook and saving drops the charts. Re-add charts after editing, or avoid re-saving charted files.
- CSV locale traps: always pass explicit encodings (the scripts
already do) and remember European CSVs often use
;delimiters and decimal commas — use--delimiter ';'and expect strings like"12,5"to stay strings. - Dates are datetimes: Excel stores dates as serial numbers;
openpyxl returns
datetime/dateobjects. Dumps here emit ISO strings. - Sheet names are capped at 31 chars and reject
[ ] : * ? / \.
Verification
- After creating:
xlsx_read.py out.xlsx --sheetsand confirm sheet names, dimensions, merged ranges, and chart counts match intent. - Dump data with
--jsonand compare against the source values. - After edits: re-dump the touched range; if formulas were written,
confirm
--formulaslists them and that--recalcwas applied. - After
xlsx_restructure.py: read its JSON report, then re-run--formulasand--sheetsto confirm references and ranges landed where expected. - For a full visual check, open in LibreOffice:
soffice --headless --convert-to pdf out.xlsxand inspect the PDF.
Frequently asked questions about Xlsx Skill
Similar skills
Spring Boot Testing
Master testing techniques for Spring Boot 4 applications.
GitHub Issues
Manage GitHub issues efficiently with MCP tools.
Geofeed Tuner
Optimize your IP geolocation feeds in CSV format.
Batch Files
Master Windows batch scripting for automation and task management.
Adobe Illustrator Scripting
Automate your Illustrator workflows with ExtendScript.
Plugin Structure
Create and organize Claude Code plugins effectively.
