时间:2026-03-05 13:49
人气:
作者:admin
在数据处理场景中,JSON 作为轻量级数据交换格式被广泛使用,而 Excel 则是业务分析、数据交付的核心载体。将 JSON 数据结构化转换为 Excel 文件,是日常开发中高频且基础的需求。本文将介绍如何使用免费库 Free Spire.XLS for Python 完成这一转换任务,并提供处理复杂嵌套数据的实用方案。
在开始编码之前,需要安装必要的库。Free Spire.XLS for Python 是一个独立的 Excel 操作库,无需本地安装 Microsoft Office 即可创建和编辑 Excel 文件。通过 pip 安装非常简单:
pip install Spire.XLS.Free
安装完成后,无需额外配置,即可在代码中引入并使用核心类库。
本文以典型的结构化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 工作簿/工作表 → 写入表头与数据 → 保存文件。以下是完整实现代码:
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() 移除默认工作表,避免冗余;json 模块解析数据,兼容字符串/文件两种输入方式;item.get(key, "") 避免键缺失报错,统一转换为字符串写入(Text 属性),适配布尔、数字、字符串等不同数据类型。Dispose() 方法释放工作簿占用的内存,尤其适合批量转换场景。基础版本满足核心需求,但实际场景中需处理嵌套JSON、样式美化等问题,以下是优化方案。
针对包含嵌套结构的JSON(如用户地址信息),需扁平化处理后写入Excel:
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}")
为提升Excel可读性,可对表头设置样式:
# 在写入表头后添加样式设置代码
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 文件。核心要点如下:
Dispose() 释放工作簿资源。该方案无需依赖 Office 组件,轻量化且易于集成到 Python 项目中,适用于数据导出、报表生成等常见业务场景。