If you’ve ever needed to share structured Python data (like nested dicts or lists) with non-developers, chances are you’ve hit this classic wall:
Can you export that to Excel?
And suddenly, you’re fighting two worlds that just weren’t made for each other.
Most tools expect flat tabular data. Your data isn’t flat. So you end up writing brittle custom converters, or flattening everything and losing structure. And don’t even get me started on round-tripping that back into Python…
I got tired of it. So I built excel-serializer: a Python library that lets you treat Excel like JSON — you can dump()
and load()
complex, nested structures without losing anything.
What it does
- Serialize any Python data structure (dicts, lists, nested combos) to .xlsx
- Read it back with full fidelity — like json.load()
- Structure is preserved across sheets, and stays human-readable/editable
- Bonus: it also comes with a CLI for easy use in scripts or from the terminal
Install it
pip <span>install </span>excel-serializerpip <span>install </span>excel-serializerpip install excel-serializer
Enter fullscreen mode Exit fullscreen mode
Basic usage (Python)
<span>import</span> <span>excel_serializer</span> <span>as</span> <span>es</span><span>data</span> <span>=</span> <span>{</span><span>"</span><span>users</span><span>"</span><span>:</span> <span>[</span><span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>"</span><span>Alice</span><span>"</span><span>,</span> <span>"</span><span>scores</span><span>"</span><span>:</span> <span>[</span><span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span><span>]},</span><span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>"</span><span>Bob</span><span>"</span><span>,</span> <span>"</span><span>scores</span><span>"</span><span>:</span> <span>[</span><span>4</span><span>,</span> <span>5</span><span>,</span> <span>6</span><span>]},</span><span>],</span><span>"</span><span>meta</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>source</span><span>"</span><span>:</span> <span>"</span><span>generated</span><span>"</span><span>,</span> <span>"</span><span>count</span><span>"</span><span>:</span> <span>2</span><span>},</span><span>}</span><span># Write to Excel </span><span>es</span><span>.</span><span>dump</span><span>(</span><span>data</span><span>,</span> <span>"</span><span>data.xlsx</span><span>"</span><span>)</span><span># Read it back </span><span>loaded</span> <span>=</span> <span>es</span><span>.</span><span>load</span><span>(</span><span>"</span><span>data.xlsx</span><span>"</span><span>)</span><span>import</span> <span>excel_serializer</span> <span>as</span> <span>es</span> <span>data</span> <span>=</span> <span>{</span> <span>"</span><span>users</span><span>"</span><span>:</span> <span>[</span> <span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>"</span><span>Alice</span><span>"</span><span>,</span> <span>"</span><span>scores</span><span>"</span><span>:</span> <span>[</span><span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span><span>]},</span> <span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>"</span><span>Bob</span><span>"</span><span>,</span> <span>"</span><span>scores</span><span>"</span><span>:</span> <span>[</span><span>4</span><span>,</span> <span>5</span><span>,</span> <span>6</span><span>]},</span> <span>],</span> <span>"</span><span>meta</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>source</span><span>"</span><span>:</span> <span>"</span><span>generated</span><span>"</span><span>,</span> <span>"</span><span>count</span><span>"</span><span>:</span> <span>2</span><span>},</span> <span>}</span> <span># Write to Excel </span><span>es</span><span>.</span><span>dump</span><span>(</span><span>data</span><span>,</span> <span>"</span><span>data.xlsx</span><span>"</span><span>)</span> <span># Read it back </span><span>loaded</span> <span>=</span> <span>es</span><span>.</span><span>load</span><span>(</span><span>"</span><span>data.xlsx</span><span>"</span><span>)</span>import excel_serializer as es data = { "users": [ {"name": "Alice", "scores": [1, 2, 3]}, {"name": "Bob", "scores": [4, 5, 6]}, ], "meta": {"source": "generated", "count": 2}, } # Write to Excel es.dump(data, "data.xlsx") # Read it back loaded = es.load("data.xlsx")
Enter fullscreen mode Exit fullscreen mode
CLI usage
Let’s say you have a JSON file like this:
<span>{</span><span> </span><span>"people"</span><span>:</span><span> </span><span>[</span><span> </span><span>{</span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>30</span><span>},</span><span> </span><span>{</span><span>"name"</span><span>:</span><span> </span><span>"Bob"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>25</span><span>}</span><span> </span><span>],</span><span> </span><span>"meta"</span><span>:</span><span> </span><span>{</span><span>"created"</span><span>:</span><span> </span><span>"2025-03-26"</span><span>}</span><span> </span><span>}</span><span> </span><span>{</span><span> </span><span>"people"</span><span>:</span><span> </span><span>[</span><span> </span><span>{</span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>30</span><span>},</span><span> </span><span>{</span><span>"name"</span><span>:</span><span> </span><span>"Bob"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>25</span><span>}</span><span> </span><span>],</span><span> </span><span>"meta"</span><span>:</span><span> </span><span>{</span><span>"created"</span><span>:</span><span> </span><span>"2025-03-26"</span><span>}</span><span> </span><span>}</span><span> </span>{ "people": [ {"name": "Alice", "age": 30}, {"name": "Bob", "age": 25} ], "meta": {"created": "2025-03-26"} }
Enter fullscreen mode Exit fullscreen mode
You can convert it to Excel with:
<span>cat </span>people.json | json2xlsx <span>-o</span> people.xlsx<span>cat </span>people.json | json2xlsx <span>-o</span> people.xlsxcat people.json | json2xlsx -o people.xlsx
Enter fullscreen mode Exit fullscreen mode
And convert it back:
xlsx2json <span>-i</span> people.xlsx <span>></span> output.jsonxlsx2json <span>-i</span> people.xlsx <span>></span> output.jsonxlsx2json -i people.xlsx > output.json
Enter fullscreen mode Exit fullscreen mode
That’s it — no flattening, no config, no lost nesting.
Why not use pandas / openpyxl / whatever?
Because most of those tools:
- Expect tabular data (not trees of dicts and lists)
- Flatten nested structures or choke on them
- Don’t offer a load()/dump() API with guaranteed round-tripping
- Require too much boilerplate for simple tasks
excel-serializer
is opinionated but practical: it chooses a clear way to represent nested data across sheets and makes it dead simple to work with.
Try it out
Whether you’re building internal tools, working with analysts, or just want a better way to share structured data, give it a shot — and let me know what breaks
暂无评论内容