在数据处理场景中,JSON 作为轻量级数据交换格式被广泛使用,而 Excel 则是业务分析、数据交付的核心载体。将 JSON 数据结构化转换为 Excel 文件,是日常开发中高频且基础的需求。本文将介绍如何使用免费库 Free Spire.XLS for Python 完成这一转换任务,并提供处理复杂嵌套数据的实用方案。
一、环境准备
1.1 安装依赖
在开始编码之前,需要安装必要的库。Free Spire.XLS for Python 是一个独立的 Excel 操作库,无需本地安装 Microsoft Office 即可创建和编辑 Excel 文件。通过 pip 安装非常简单:
bash
pip install Spire.XLS.Free
安装完成后,无需额外配置,即可在代码中引入并使用核心类库。
1.2 数据准备
本文以典型的结构化JSON数据为例(用户信息列表),示例JSON如下:
json
[
{
"id": 1001,
"name": "张三",
"age": 28,
"email": "zhangsan@example.com",
"is_active": true
},
{
"id": 1002,
"name": "李四",
"age": 32,
"email": "lisi@example.com",
"is_active": false
},
{
"id": 1003,
"name": "王五",
"age": 25,
"email": "wangwu@example.com",
"is_active": true
}
]
二、基础实现:JSON 转 Excel 核心流程
核心思路为:解析 JSON 数据 → 创建 Excel 工作簿/工作表 → 写入表头与数据 → 保存文件。以下是完整实现代码:
python
import json
from spire.xls import *
from spire.xls.common import *
def json_to_excel_basic(json_data, output_path):
# 1. 初始化Excel工作簿
workbook = Workbook()
# 移除默认工作表,创建新工作表
workbook.Worksheets.Clear()
worksheet = workbook.Worksheets.Add("用户数据")
# 2. 解析JSON数据(若为文件读取,可替换为json.load(open("data.json", "r", encoding="utf-8")))
data = json.loads(json_data)
if not data:
raise ValueError("JSON数据为空,无法转换")
# 3. 写入表头(取第一条数据的键作为表头)
headers = list(data[0].keys())
for col_idx, header in enumerate(headers):
worksheet.Range[1, col_idx + 1].Text = header
# 4. 写入数据行
for row_idx, item in enumerate(data, start=2): # 从第2行开始写入数据
for col_idx, key in enumerate(headers):
value = item.get(key, "")
worksheet.Range[row_idx, col_idx + 1].Text = str(value)
# 5. 自动调整列宽
worksheet.AllocatedRange.AutoFitColumns()
# 6. 保存Excel文件
workbook.SaveToFile(output_path, ExcelVersion.Version2016)
workbook.Dispose() # 释放资源
# 测试调用
if __name__ == "__main__":
# 示例JSON字符串(实际场景可从文件/接口读取)
json_str = '''
[
{"id": 1001, "name": "张三", "age": 28, "email": "zhangsan@example.com", "is_active": true},
{"id": 1002, "name": "李四", "age": 32, "email": "lisi@example.com", "is_active": false},
{"id": 1003, "name": "王五", "age": 25, "email": "wangwu@example.com", "is_active": true}
]
'''
try:
json_to_excel_basic(json_str, "基础版JSON转Excel.xlsx")
print("转换完成!")
except Exception as e:
print(f"转换失败:{e}")
关键代码解析
- 工作簿初始化 :
Workbook()创建空工作簿,Worksheets.Clear()移除默认工作表,避免冗余; - 数据解析 :使用 Python 内置
json模块解析数据,兼容字符串/文件两种输入方式; - 表头与数据写入 : 提取第一条 JSON 数据的键作为 Excel 表头,使用
item.get(key, "")避免键缺失报错,统一转换为字符串写入(Text属性),适配布尔、数字、字符串等不同数据类型。 - 资源释放 :
Dispose()方法释放工作簿占用的内存,尤其适合批量转换场景。
三、进阶优化:提升转换质量与健壮性
基础版本满足核心需求,但实际场景中需处理嵌套JSON、样式美化等问题,以下是优化方案。
3.1 处理嵌套 JSON 数据
针对包含嵌套结构的JSON(如用户地址信息),需扁平化处理后写入Excel:
python
import json
from spire.xls import *
from spire.xls.common import *
def flatten_dict(d, parent_key='', sep='_'):
"""递归扁平化嵌套字典"""
items = []
for k, v in d.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_dict(v, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)
def json_to_excel_nested(json_data, output_path):
workbook = Workbook()
workbook.Worksheets.Clear()
worksheet = workbook.Worksheets.Add("嵌套JSON数据")
data = json.loads(json_data)
if not data:
raise ValueError("JSON数据为空")
# 扁平化所有数据,提取完整表头
flattened_data = [flatten_dict(item) for item in data]
headers = list(flattened_data[0].keys())
# 写入表头
for col_idx, header in enumerate(headers):
worksheet.Range[1, col_idx + 1].Text = header
# 写入扁平化后的数据
for row_idx, item in enumerate(flattened_data, start=2):
for col_idx, key in enumerate(headers):
worksheet.Range[row_idx, col_idx + 1].Text = str(item.get(key, ""))
# 自动列宽
worksheet.AllocatedRange.AutoFitColumns()
# 保存文件
workbook.SaveToFile(output_path, ExcelVersion.Version2016)
workbook.Dispose()
# 测试嵌套JSON转换
if __name__ == "__main__":
nested_json = '''
[
{
"id": 1001,
"name": "张三",
"age": 28,
"contact": {
"email": "zhangsan@example.com",
"phone": "13800138000"
},
"address": {
"province": "北京",
"city": "北京市"
}
},
{
"id": 1002,
"name": "李四",
"age": 32,
"contact": {
"email": "lisi@example.com",
"phone": "13900139000"
},
"address": {
"province": "上海",
"city": "上海市"
}
}
]
'''
try:
json_to_excel_nested(nested_json, "嵌套JSON转Excel.xlsx")
print("嵌套JSON转换完成!")
except Exception as e:
print(f"转换失败:{e}")
3.2 美化 Excel 样式(表头高亮、字体设置)
为提升Excel可读性,可对表头设置样式:
python
# 在写入表头后添加样式设置代码
header_range = worksheet.Range[1, 1, 1, len(headers)]
# 设置表头背景色
header_range.Style.Color = Color.get_SkyBlue()
# 设置表头字体加粗
header_range.Style.Font.IsBold = True
# 设置表头文字居中
header_range.Style.HorizontalAlignment = HorizontalAlignType.Center
四、总结
通过结合 Python 内置的 json 模块和 Free Spire.XLS for Python 库,我们可以高效地将 JSON 数据转换为结构化的 Excel 文件。核心要点如下:
- 基础流程:解析 JSON → 创建 Excel 工作簿 → 写入表头/数据 → 保存文件,关键是适配 Excel 的 1 起始索引;
- 进阶优化:通过递归扁平化处理嵌套 JSON,通过样式设置提升 Excel 可读性;
- 最佳实践 :转换前校验 JSON 数据有效性,转换后调用
Dispose()释放工作簿资源。
该方案无需依赖 Office 组件,轻量化且易于集成到 Python 项目中,适用于数据导出、报表生成等常见业务场景。