Stop flattening your JSON just to export it to Excel

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-serializer
pip <span>install </span>excel-serializer
pip 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.xlsx
cat 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.json
xlsx2json <span>-i</span> people.xlsx <span>></span> output.json
xlsx2json -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

PyPI
GitHub Repo

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

原文链接:Stop flattening your JSON just to export it to Excel

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Only difficult to make people show their true colors.
只有困难才能使人显出自己的本色
评论 抢沙发

请登录后发表评论

    暂无评论内容