目录
-
- [Excel 转 JSON 的常见应用场景](#Excel 转 JSON 的常见应用场景)
- [安装所需的 Python Excel 库](#安装所需的 Python Excel 库)
- [准备 Excel 示例文件](#准备 Excel 示例文件)
- [1. 将整个 Excel 工作簿转换为 JSON](#1. 将整个 Excel 工作簿转换为 JSON)
-
- [将 XLS 文件转换为 JSON](#将 XLS 文件转换为 JSON)
- [2. 将指定工作表导出为 JSON](#2. 将指定工作表导出为 JSON)
- [3. 将指定单元格区域导出为 JSON](#3. 将指定单元格区域导出为 JSON)
- [4. 将 Excel 数据转换为自定义 JSON 结构](#4. 将 Excel 数据转换为自定义 JSON 结构)
- 常见问题
-
- [可以将 XLS 文件转换为 JSON 吗?](#可以将 XLS 文件转换为 JSON 吗?)
- [Excel 转 JSON 会保留格式吗?](#Excel 转 JSON 会保留格式吗?)
- 可以只导出多个指定工作表吗?
- 转换前如何删除空白行?
- 总结

Excel 的 .xls 和 .xlsx 格式仍然广泛用于业务数据的收集、审核和共享,但在 Web 应用、REST API、数据库以及系统间数据交换中,JSON 通常更加常用。
使用 Python 将 Excel 转换为 JSON 并不复杂。真正需要考虑的是:要导出整个工作簿,还是只导出某个工作表或单元格区域?生成的 JSON 是否还需要符合特定的接口或应用结构?
本文将介绍以下四种常见场景:
- 将整个 Excel 工作簿转换为 JSON
- 将指定工作表导出为 JSON
- 将指定单元格区域导出为 JSON
- 将 Excel 数据转换为自定义 JSON 结构
Excel 转 JSON 的常见应用场景
Excel 转 JSON 常用于以下数据处理和系统集成场景:
- 将 Excel 中的业务记录提交到 REST API
- 为 Web 或 JavaScript 应用准备数据
- 将表格记录导入文档型数据库
- 在不同服务之间交换结构化数据
- 将人工维护的业务表格转换为机器可读格式
具体采用哪种转换方式,取决于 Excel 文件的组织结构以及 JSON 的后续用途。
安装所需的 Python Excel 库
本文使用 Spire.XLS for Python 。该库支持直接将 .xls 和 .xlsx 文件转换为 JSON,也可以访问指定工作表和单元格区域,用于局部导出或构建自定义 JSON。
通过以下命令安装:
bash
pip install spire.xls
自定义 JSON 示例还会使用 Python 的 json 模块。由于该模块是内置的,因此无需另外额外安装 JSON 库。
准备 Excel 示例文件
本文使用的输入文件名为"销售数据.xlsx"。文件中包含以下工作表:
| 工作表 | 用途 |
|---|---|
| 销售数据 | 测试完整工作簿和指定区域转换 |
| 产品 | 测试指定工作表和自定义 JSON |
其中,"销售数据"工作表包含订单编号、客户名称、产品名称、销售区域、数量、单价、下单日期和订单状态等字段;"产品"工作表包含产品编号、产品名称、产品分类、价格和库存状态。
1. 将整个 Excel 工作簿转换为 JSON
要将整个 Excel 工作簿转换为 JSON,先使用 Workbook.LoadFromFile() 加载文件,再调用 Workbook.SaveToFile(),并将输出格式指定为 FileFormat.Json。
python
import os
from spire.xls import Workbook, FileFormat
input_file = "销售数据.xlsx"
output_file = "output/完整工作簿.json"
os.makedirs("output", exist_ok=True)
workbook = Workbook()
try:
# 加载 Excel 工作簿
workbook.LoadFromFile(input_file)
# 将整个工作簿保存为 JSON
workbook.SaveToFile(
output_file,
FileFormat.Json,
)
finally:
workbook.Dispose()
生成的 JSON 中,每个工作表名称会作为一个顶层键。工作表第一行中的标题会转换为 JSON 属性名,后续每一行数据则会转换为一个 JSON 对象。例如,"销售数据"工作表生成的结构类似下面这样:
json
{
"销售数据": [
{
"订单编号": "SO-1001",
"客户名称": "北方科技有限公司",
"产品名称": "笔记本电脑支架",
"销售区域": "华东",
"数量": 3,
"单价": 349,
"下单日期": "2026-06-12",
"订单状态": "已完成"
}
]
}
如果工作簿包含多个工作表,每个工作表都会在同一个 JSON 文件中对应一个独立的顶层键。
将 XLS 文件转换为 JSON
如果要转换旧版 .xls 文件,只需修改输入文件名后缀:
python
input_file = "销售数据.xls"
其他代码无需调整。.xls 和 .xlsx 文件均可以使用相同的 LoadFromFile() 和 SaveToFile() 方法完成转换。
2. 将指定工作表导出为 JSON
一个工作簿中可能包含说明、历史数据、计算过程、临时导入数据或基础字典等工作表,而这些内容并不一定需要出现在最终的 JSON 中。
这种情况下,可以将需要导出的工作表复制到一个新的工作簿,再将新工作簿保存为 JSON。
下面的示例仅导出"产品"工作表:
python
import os
from spire.xls import Workbook, FileFormat
input_file = "销售数据.xlsx"
output_file = "output/产品工作表.json"
target_sheet_name = "产品"
os.makedirs("output", exist_ok=True)
source_workbook = Workbook()
target_workbook = Workbook()
try:
# 加载源工作簿
source_workbook.LoadFromFile(input_file)
# 获取需要导出的工作表
source_sheet = source_workbook.Worksheets[
target_sheet_name
]
# 删除新工作簿中默认创建的工作表
target_workbook.Worksheets.Clear()
# 将指定工作表复制到新工作簿
target_workbook.Worksheets.AddCopy(source_sheet)
# 将新工作簿保存为 JSON
target_workbook.SaveToFile(
output_file,
FileFormat.Json,
)
finally:
target_workbook.Dispose()
source_workbook.Dispose()
源文件不会被修改。由于新工作簿中只保留了"产品"工作表,因此生成的 JSON 也只包含该工作表的数据。
按索引选择工作表
除了通过名称获取工作表,也可以使用索引:
python
source_sheet = source_workbook.Worksheets[1]
工作表索引从 0 开始,因此索引 1 表示第二个工作表。
在本文提供的示例文件中,第二个工作表正是"产品"。
通过名称选择工作表更直观;当工作表名称不固定、但排列位置固定时,也可以使用索引。
3. 将指定单元格区域导出为 JSON
有些工作表除了数据表格外,还可能包含标题、说明、统计结果或多个独立的数据区域。
如果直接导出整个工作表,可能会包含不需要的数据。此时可以只复制指定的单元格区域,再将其转换为 JSON。
下面的示例将"销售数据"工作表中的 A1:D10 区域导出为 JSON:
python
import os
from spire.xls import (
Workbook,
FileFormat,
CopyRangeOptions,
)
input_file = "销售数据.xlsx"
output_file = "output/指定区域.json"
os.makedirs("output", exist_ok=True)
source_workbook = Workbook()
target_workbook = Workbook()
try:
# 加载源工作簿
source_workbook.LoadFromFile(input_file)
# 获取"销售数据"工作表
source_sheet = source_workbook.Worksheets[
"销售数据"
]
# 获取需要导出的单元格区域
source_range = source_sheet.Range["A1:D10"]
# 删除新工作簿中的默认工作表
target_workbook.Worksheets.Clear()
# 创建用于保存选定数据的工作表
target_sheet = target_workbook.Worksheets.Add(
"选定数据"
)
# 创建与源区域大小相同的目标区域
target_range = target_sheet.Range["A1:D10"]
# 将源区域复制到新工作簿
source_range.Copy(
target_range,
CopyRangeOptions.All,
)
# 保存为 JSON
target_workbook.SaveToFile(
output_file,
FileFormat.Json,
)
finally:
target_workbook.Dispose()
source_workbook.Dispose()
生成的 JSON 中,"选定数据"会作为顶层键。
A1:D10 的第一行会作为属性名称,后续各行则会转换为 JSON 对象。
选择区域时应包含标题行,否则生成的 JSON 无法使用正确的字段名称。
4. 将 Excel 数据转换为自定义 JSON 结构
前面三种方法使用的是 Spire.XLS 默认生成的 JSON 结构。
如果生成的 JSON 需要符合某个 REST API、数据库模型或前端应用的数据格式,就需要读取指定单元格,并使用 Python 的 json 模块重新组织数据。
例如,"产品"工作表包含以下字段:
| 列 | 字段 |
|---|---|
| A | 产品编号 |
| B | 产品名称 |
| C | 产品分类 |
| D | 价格 |
| E | 库存状态 |
现在需要将这些中文字段转换为下面的应用数据结构:
json
{
"sourceFile": "销售数据.xlsx",
"worksheet": "产品",
"recordCount": 6,
"data": {
"products": [
{
"id": "P001",
"name": "笔记本电脑",
"category": "电子产品",
"pricing": {
"amount": 8999,
"currency": "CNY"
},
"inStock": true
},
{
"id": "P002",
"name": "无线鼠标",
"category": "电脑配件",
"pricing": {
"amount": 199,
"currency": "CNY"
},
"inStock": false
}
]
}
}
上面仅展示前两条产品记录,完整运行代码后会导出"产品"工作表中的全部数据。
完整代码如下:
python
import json
import os
from spire.xls import Workbook
input_file = "销售数据.xlsx"
output_file = "output/自定义产品数据.json"
os.makedirs("output", exist_ok=True)
workbook = Workbook()
try:
# 加载 Excel 工作簿
workbook.LoadFromFile(input_file)
# 获取"产品"工作表
sheet = workbook.Worksheets["产品"]
products = []
true_values = {
"true",
"yes",
"y",
"1",
"in stock",
"是",
"有货",
}
false_values = {
"false",
"no",
"n",
"0",
"out of stock",
"否",
"缺货",
}
# 第一行为标题,因此从第 2 行开始读取
for row in range(
2,
sheet.AllocatedRange.LastRow + 1,
):
product_id = (
sheet.Range[row, 1]
.Text
.strip()
)
# 跳过没有产品编号的行
if not product_id:
continue
product_name = (
sheet.Range[row, 2]
.Text
.strip()
)
category = (
sheet.Range[row, 3]
.Text
.strip()
)
# 读取数值类型的价格
price_cell = sheet.Range[row, 4]
price = (
price_cell.NumberValue
if price_cell.HasNumber
else None
)
# 将库存状态转换为布尔值
stock_text = (
sheet.Range[row, 5]
.Text
.strip()
.lower()
)
if stock_text in true_values:
in_stock = True
elif stock_text in false_values:
in_stock = False
else:
in_stock = None
product = {
"id": product_id,
"name": product_name,
"category": category,
"pricing": {
"amount": price,
"currency": "CNY",
},
"inStock": in_stock,
}
products.append(product)
# 构建最终 JSON 对象
result = {
"sourceFile": os.path.basename(input_file),
"worksheet": sheet.Name,
"recordCount": len(products),
"data": {
"products": products,
},
}
# 写入自定义 JSON 文件
with open(
output_file,
"w",
encoding="utf-8",
) as json_file:
json.dump(
result,
json_file,
indent=4,
ensure_ascii=False,
)
finally:
workbook.Dispose()
这段代码主要完成了以下转换:
- "产品编号"映射为
id - "产品名称"映射为
name - "产品分类"映射为
category - "价格"被放入嵌套的
pricing对象 - 固定添加币种字段
currency - 将"是""否""有货""缺货"等文本转换为 JSON 布尔值
- 在 JSON 外层添加源文件、工作表名称和记录数量
产品编号通过 Text 读取,因此类似 000123 的编号不会丢失前导零。
价格使用 HasNumber 判断单元格是否包含数值,再通过 NumberValue 获取实际数值,因此写入 JSON 后会保持数字类型,而不是字符串。
ensure_ascii=False 可以让中文内容直接写入 JSON,避免被转换成 Unicode 转义字符。
常见问题
可以将 XLS 文件转换为 JSON 吗?
可以。Spire.XLS 同时支持 .xls 和 .xlsx 文件。只需修改输入文件扩展名,无需改变转换逻辑:
python
input_file = "销售数据.xls"
Excel 转 JSON 会保留格式吗?
不会。JSON 保存的是结构化数据,而不是 Excel 的显示样式。
字体、颜色、边框、列宽、行高以及合并单元格等格式不会作为普通 JSON 数据保留。
可以只导出多个指定工作表吗?
可以。可以将需要的工作表依次复制到一个新工作簿中,再将新工作簿保存为 JSON。
也可以先从已加载的工作簿中删除不需要的工作表:
python
workbook.Worksheets.RemoveAt(sheet_index)
转换前如何删除空白行?
可以使用行对象的 IsBlank 属性判断空白行,并在导出前将其删除:
python
for row_index in range(
sheet.Rows.Length - 1,
0,
-1,
):
if sheet.Rows[row_index].IsBlank:
sheet.DeleteRow(row_index + 1)
从下往上删除,可以避免删除行后导致后续行索引发生变化。
总结
使用 Python 将 Excel 转换为 JSON,可以让表格数据更方便地用于 Web 应用、API、数据库和自动化处理流程。
本文介绍了如何将整个 XLS 或 XLSX 工作簿转换为 JSON、导出指定工作表或单元格区域,以及根据接口要求构建自定义 JSON 结构。
根据目标系统的数据格式选择直接导出或自定义映射,即可将 Excel 中的业务数据转换为便于后续处理和集成的结构化 JSON。