在數據處理場景中,JSON 作為輕量級數據交換格式被廣泛使用,而 Excel 則是業務分析、數據交付的核心載體。將 JSON 數據結構化轉換為 Excel 文件,是日常開發中高頻且基礎的需求。本文將介紹如何使用免費庫 Free Spire.XLS for Python 完成這一轉換任務,並提供處理複雜嵌套數據的實用方案。
一、環境準備
1.1 安裝依賴
在開始編碼之前,需要安裝必要的庫。Free Spire.XLS for Python 是一個獨立的 Excel 操作庫,無需本地安裝 Microsoft Office 即可創建和編輯 Excel 文件。通過 pip 安裝非常簡單:
pip install Spire.XLS.Free
安裝完成後,無需額外配置,即可在代碼中引入並使用核心類庫。
1.2 數據準備
本文以典型的結構化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 工作簿/工作表 → 寫入表頭與數據 → 保存文件。以下是完整實現代碼:
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:
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可讀性,可對錶頭設置樣式:
# 在寫入表頭後添加樣式設置代碼
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 項目中,適用於數據導出、報表生成等常見業務場景。