
在许多 Python 项目中,尤其是涉及 API 对接、数据分析或业务报表的场景,开发者经常需要通过代码实现 Excel 转 JSON 或 JSON 转 Excel。这两种格式各有所长:JSON 适用于结构化数据的交换与存储,而 Excel 则广泛用于业务环境中数据的共享、编辑与展示。
本教程提供一份面向开发者的 JSON 与 Excel 互转完整指南,涵盖嵌套数据处理、Excel 格式设置以及常见转换与编码问题的解决方法。我们将使用 Python 内置的 json 模块处理 JSON 数据,并借助 Spire.XLS for Python 读写 .xlsx、.xls 和 .csv 格式的 Excel 文件,无需安装 Microsoft Excel 或其他第三方软件。
主要内容包括:
- 安装 Spire.XLS for Python
- 为什么选择 Spire.XLS 而非通用库?
- 在 Python 中将 JSON 转换为 Excel
- 在 Python 中将 Excel 转换为 JSON
- 实战示例:处理嵌套 JSON 与复杂 Excel 格式
- 常见错误与解决方法
- 常见问题
- 总结
安装 Spire.XLS for Python
本教程使用该库来生成和解析 Excel 文件(.xlsx、.xls、.csv),完成 JSON 与 Excel 的互转。
首先,从 PyPI 安装 Spire.XLS for Python 包:
pip install spire.xls
对于小型项目,也可以选择 Free Spire.XLS for Python:
pip install spire.xls.free
Spire.XLS for Python 支持 Windows、Linux 和 macOS,无需安装 Microsoft Excel 或任何 COM 组件。
为什么选择 Spire.XLS 而非开源库?
许多开源 Python 库能够胜任简单的 Excel 操作,比如基础数据导出或简单格式设置。需求仅限于简单表格输出时,这些工具通常可以快速完成任务。
然而,当项目需要丰富的 Excel 格式、多工作表报表,或不依赖 Microsoft Office 的独立方案时,Spire.XLS for Python 凭借完整的 Excel 功能集脱颖而出。
| 能力 | 开源库 | Spire.XLS for Python |
|---|---|---|
| 高级 Excel 格式设置 | ? 仅支持基础样式 | ✅ 完整的报表样式 API |
| 无 Office/COM 依赖 | ✅ 完全独立 | ✅ 完全独立 |
| 支持 .xls、.xlsx、.csv | 主要支持 .xlsx 和 .csv;.xls 可能需要额外包 | ✅ 完整支持 .xls、.xlsx、.csv |
| 图表、图片、形状 | ? 有限或无支持 | ✅ 内置完整支持 |
如果你的开发团队需要生成精美的 Excel 文件,无论是复杂布局、可视化元素还是面向业务的样式,Spire.XLS 都是一个高效的一体化方案。
在 Python 中将 JSON 转换为 Excel
本节介绍如何使用 Python 将结构化 JSON 数据转换为 Excel 文件。当你需要将 API 响应或内部数据导出为 .xlsx 报表,供业务人员或分析师使用时,这一功能非常实用。
第一步:准备 JSON 数据
我们先准备一份员工记录的 JSON 列表:
[
{"员工编号": "E001", "姓名": "张伟", "部门": "人力资源部"},
{"员工编号": "E002", "姓名": "李明", "部门": "信息技术部"},
{"员工编号": "E003", "姓名": "王芳", "部门": "财务部"}
]
这是 API 返回或日志文件中常见的结构。更复杂的嵌套结构请参见实战示例部分。
第二步:使用 Spire.XLS 将 JSON 转换为 Excel
from spire.xls import Workbook, FileFormat
import json
# 从文件加载 JSON 数据
with open("employees.json", "r", encoding="utf-8") as f:
data = json.load(f)
# 创建新的 Excel 工作簿并获取第一个工作表
workbook = Workbook()
sheet = workbook.Worksheets[0]
# 将表头写入第一行
headers = list(data[0].keys())
for col, header in enumerate(headers):
sheet.Range[1, col + 1].Text = header
# 从第二行开始写入数据行
for row_idx, row in enumerate(data, start=2):
for col_idx, key in enumerate(headers):
sheet.Range[row_idx, col_idx + 1].Text = str(row.get(key, ""))
# 自动调整所有已使用列的列宽
for i in range(1, sheet.Range.ColumnCount + 1):
sheet.AutoFitColumn(i)
# 保存 Excel 文件并释放资源
workbook.SaveToFile("output/employees.xlsx", FileFormat.Version2016)
workbook.Dispose()
代码说明:
- Workbook() 初始化 Excel 文件,默认包含三个工作表。
- workbook.Worksheets[] 访问指定的工作表。
- sheet.Range(row, col).Text 向指定单元格写入字符串数据(索引从 1 开始)。
- 第一行包含基于 JSON 键名的列标题,每个 JSON 对象写入下方的新行。
- workbook.SaveToFile() 将 Excel 工作簿保存到磁盘。可以通过 FileFormat 枚举指定格式,例如 Version97to2003 保存为 .xls,Version2007 及以上版本保存为 .xlsx,CSV 保存为 .csv。
生成的 Excel 文件(employees.xlsx),包含员工编号、姓名和部门列。

如果需要纯文本输出格式,也可以使用 Spire.XLS for Python 将 Excel 工作表转换为 CSV 文件。
在 Python 中将 Excel 转换为 JSON
本节介绍如何使用 Python 将 Excel 数据转换回结构化 JSON。当你需要将 .xlsx 文件导入 Web 应用、API 或需要 JSON 输入的数据管道时,这是常见的需求。
第一步:加载 Excel 文件
首先,使用 Workbook.LoadFromFile() 加载 Excel 文件,然后通过 workbook.Worksheets[0] 选择工作表,从而获取需要转换为 JSON 格式的数据。
from spire.xls import Workbook
# 加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("products.xlsx")
sheet = workbook.Worksheets[0]
第二步:提取 Excel 数据并写入 JSON
import json
# 获取最后一行和最后一列的索引
rows = sheet.LastRow
cols = sheet.LastColumn
# 从第一行提取表头
headers = [sheet.Range[1, i + 1].Text for i in range(cols)]
data = []
# 使用表头将每行映射为字典
for r in range(2, rows + 1):
row_data = {}
for c in range(cols):
value = sheet.Range[r, c + 1].Value
row_data[headers[c]] = value
data.append(row_data)
# 写入 JSON 输出
with open("products_out.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
代码说明:
- sheet.LastRow 和 sheet.LastColumn 检测实际使用的单元格范围。
- 第一行用于提取字段名(表头)。
- 每行映射为一个字典,组成 JSON 对象列表。
- sheet.Range[row, col].Value 返回单元格的显示值。如果文本内容、原始数值或真正的日期对象,可使用 .Text、.NumberValue 或 .DateTimeValue。
使用 Python 从 Excel 数据生成的 JSON 文件:

如果还不熟悉在 Python 中读取 Excel 文件,请参阅完整指南:如何使用 Spire.XLS 在 Python 中读取 Excel 文件。
实战示例:处理嵌套 JSON 与 Excel 格式设置
在实际的 Python 应用中,JSON 数据通常包含嵌套的字典或列表,例如联系方式、配置分组或进度记录。同时,Excel 输出需要遵循清晰、可读的布局,以满足业务或报表需求。
本节演示如何使用 Python 和 Spire.XLS 展平嵌套 JSON 数据并格式化生成的 Excel 工作表,包括合并单元格、应用样式和自动调整列宽。这些功能有助于将复杂数据以清晰的表格形式呈现。
我们使用示例文件 projects_nested.json 来演示整个过程。
第一步:展平嵌套 JSON
示例 JSON 文件(projects_nested.json):
[
{
"项目编号": "PRJ001",
"项目名称": "人工智能研究",
"负责人": {
"姓名": "王建国",
"邮箱": "wangjg@ lab.cn"
},
"阶段": [
{"阶段名称": "设计", "状态": "已完成"},
{"阶段名称": "开发", "状态": "进行中"}
]
},
{
"项目编号": "PRJ002",
"项目名称": "云平台迁移",
"负责人": {
"姓名": "李志强",
"邮箱": "lizq@ infra.cn"
},
"阶段": [
{"阶段名称": "评估", "状态": "已完成"}
]
}
]
我们将展平所有嵌套结构,包括"负责人"这样的对象,并将"阶段"等列表汇总为字符串字段。每条 JSON 记录变成一行扁平数据,即使是复杂的嵌套数据也能以可读的摘要形式紧凑地呈现在列中。
import json
# 辅助函数:展平嵌套数据,将字典列表汇总为字符串
# 例如:[{"a":1},{"a":2}] → "a: 1; a: 2"
def flatten(data, parent_key='', sep='.'):
items = {}
for k, v in data.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.update(flatten(v, new_key, sep=sep))
elif isinstance(v, list):
if all(isinstance(i, dict) for i in v):
items[new_key] = "; ".join(
", ".join(f"{ik}: {iv}" for ik, iv in i.items()) for i in v
)
else:
items[new_key] = ", ".join(map(str, v))
else:
items[new_key] = v
return items
# 加载并展平 JSON
with open("projects_nested.json", "r", encoding="utf-8") as f:
raw_data = json.load(f)
flat_data = [flatten(record) for record in raw_data]
# 从展平后的数据中收集所有唯一键作为表头
all_keys = set()
for item in flat_data:
all_keys.update(item.keys())
headers = list(sorted(all_keys)) # 一致的、排序后的列顺序
此版本的 flatten() 将字典列表转换为简洁的摘要字符串(例如"阶段名称: 设计, 状态: 已完成; 阶段名称: 开发, 状态: 进行中"),使复杂结构在 Excel 输出中更加紧凑易读。
第二步:使用 Spire.XLS 格式化并导出 Excel
接下来,我们将展平后的项目数据导出为 Excel,并使用 Spire.XLS for Python 的格式化功能来改善布局和可读性,包括设置字体、颜色、合并单元格以及自动调整列宽,从而获得专业的报表外观。
from spire.xls import Workbook, Color, FileFormat
# 创建工作簿和工作表
workbook = Workbook()
sheet = workbook.Worksheets[0]
sheet.Name = "项目报表"
# 标题行:合并并设置样式
col_count = len(headers)
sheet.Range[1, 1, 1, col_count].Merge()
sheet.Range[1, 1].Text = "项目报表(展平 JSON 数据)"
title_style = sheet.Range["A1"].Style
title_style.Font.IsBold = True
title_style.Font.Size = 14
title_style.Font.Color = Color.get_White()
title_style.Color = Color.get_DarkBlue()
# 从展平后的键名生成表头行
for col, header in enumerate(headers):
cell = sheet.Range[2, col + 1]
cell.BorderAround() # 为单元格或单元格区域添加外边框
#cell.BorderInside() # 为单元格区域添加内边框
cell.Text = header
style = cell.Style
style.Font.IsBold = True
style.Color = Color.get_LightGray()
# 数据行
for row_idx, row in enumerate(flat_data, start=3):
for col_idx, key in enumerate(headers):
sheet.Range[row_idx, col_idx + 1].Text = str(row.get(key, ""))
# 自动调整列宽和行高
for col in range(len(headers)):
sheet.AutoFitColumn(col + 1)
for row in range(len(flat_data)):
sheet.AutoFitRow(row + 1)
# 保存 Excel 文件
workbook.SaveToFile("output/projects_formatted.xlsx", FileFormat.Version2016)
workbook.Dispose()
这样就能从嵌套 JSON 文件生成一份格式整洁、样式美观的 Excel 工作表,适用于报表、汇报展示或仪表盘。
代码说明
- sheet.Range[].Merge():将一组单元格合并为一个。此处用于报表标题行(A1:F1)。
- .Style.Font / .Style.Color:用于自定义单元格的字体属性(加粗、字号、颜色)和背景填充。
- .BorderAround() / .BorderInside():为单元格区域添加外边框/内边框。
- AutoFitColumn(n):自动调整第
n列的列宽以适应内容。
使用 Python 展平 JSON 数据后生成的 Excel 文件:

JSON 与 Excel 互转中的常见错误与解决方法
JSON 与 Excel 之间的转换有时会遇到格式、编码或数据结构方面的问题。以下是常见问题及其解决方法:
| 错误 | 解决方法 |
|---|---|
| JSONDecodeError 或输入格式错误 | 确保语法有效;避免使用 eval();使用 json.load() 并展平嵌套对象。 |
| TypeError: Object of type ... is not JSON serializable | 使用 json.dump(data, f, default=str) 将不可序列化的值转换为字符串。 |
| Excel 文件无法加载或崩溃 | 确保文件未在 Excel 中打开;使用正确的扩展名(.xlsx 或 .xls)。 |
| UnicodeEncodeError 或字符乱码 | 在 json.dump() 中设置 encoding="utf-8" 和 ensure_ascii=False。 |
总结
借助 Spire.XLS for Python,JSON 与 Excel 之间的互转变得高效且可靠。你可以轻松将 JSON 数据转换为格式完善的 Excel 文件(包含表头和样式),也能顺畅地将 Excel 工作表转换回结构化 JSON。该库还能帮助你避免编码错误、嵌套数据复杂性以及 Excel 文件格式陷阱等常见问题。
无论是数据导出、报表生成还是 API 响应处理,Spire.XLS 都能提供一致且高效的方式来实现 .json 与 .xlsx 格式的双向转换。
想要无限制使用所有功能?申请免费临时许可证,即可获取 Spire.XLS for Python 的完整访问权限。
常见问题
Q1:如何在 Python 中将 JSON 转换为 Excel?
可以使用 Python 的 json 模块加载结构化 JSON 数据,然后用 Spire.XLS 等库将其导出为 .xlsx 文件。Spire.XLS 支持写入表头、格式化 Excel 单元格,以及通过展平处理嵌套 JSON。具体步骤请参见上文的 JSON 转 Excel 部分。
Q2:如何在 Python 中解析 JSON 数据?
使用 Python 内置的 json 模块解析 JSON 非常简单:用 json.load() 从文件解析 JSON,或用 json.loads() 解析 JSON 字符串。解析后的结果通常是字典列表,可以遍历并导出为 Excel 或其他格式。
Q3:可以使用 Spire.XLS 在 Python 中将 Excel 导出为 JSON 吗?
可以。Spire.XLS for Python 支持读取 Excel 文件并将工作表数据转换为字典列表,然后用 json.dump() 写入 JSON。整个过程包括提取表头、检测已使用的行和列,以及可选地处理格式化内容。详细实现请参见 Excel 转 JSON 部分。







