Python利用Free Spire.XLS将Excel数据导出为JSO
在数据处理和系统对接过程中,Excel与JSON是两种非常常见的数据格式。Excel便于人工维护和查看,JSON则适合Web接口、REST API以及程序间的数据交换。把Excel导出为JSON,是从表格数据转换到机器可读格式的常见需求。Free Spire.XLS for Python 是一个无需安装Microsoft Excel即可读写 .xls 和 .xlsx 文件的Python库,适合在服务器环境或自动化任务中使用。本文基于该库介绍三种从Excel导出JSON的编程实现方式,并说明免费版限制和编码处理细节。环境准备
使用pip安装免费库:
pip install spire.xls.free
该库支持Python 3.6及以上版本,兼容Windows、Linux和macOS。在代码中导入所需模块:
from spire.xls import Workbook, FileFormat
import json
方式一:将整个工作簿直接转换为JSON
从Spire.XLS for Python 16.7.1版本开始,库原生支持将工作簿保存为JSON格式。这种方式最简单,适合需要一次性导出全部工作表数据的场景。
from spire.xls import Workbook, FileFormat
import os
input_file = "销售数据.xlsx"
output_file = "output/工作簿.json"
os.makedirs("output", exist_ok=True)
workbook = Workbook()
workbook.LoadFromFile(input_file)
workbook.SaveToFile(output_file, FileFormat.Json)
workbook.Dispose()
执行后,生成的JSON中每个工作表名称作为顶层键,工作表第一行的标题作为属性名,后续每行数据对应一个JSON对象。例如包含“销售数据”工作表的Excel文件,生成结构大致如下:
{
"销售数据": [
{
"订单编号": "SO-1001",
"客户名称": "北方科技有限公司",
"产品名称": "笔记本电脑支架",
"数量": 3,
"单价": 349,
"订单状态": "已完成"
}
]
}
如果工作簿包含多个工作表,每个工作表都会在同一JSON文件中对应独立的顶层键。
方式二:将指定工作表导出为JSON
当只需要导出某一个工作表时,可以先获取该工作表,再手动构造字典列表并写入JSON文件。这种方式适用于免费版,也能够让开发者自由控制最终JSON的字段和数据结构。
from spire.xls import Workbook
import json
workbook = Workbook()
workbook.LoadFromFile("销售数据.xlsx")
# 获取第一个工作表
sheet = workbook.Worksheets
# 获取最大行列
rows = sheet.LastRow
cols = sheet.LastColumn
# 提取表头(第一行)
headers = .Text for i in range(cols)]
# 逐行构造JSON数据
data = []
for r in range(2, rows + 1):
row_dict = {}
for c in range(1, cols + 1):
row_dict] = sheet.Range.Text
data.append(row_dict)
# 写入JSON文件
with open("指定工作表.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
workbook.Dispose()
这里关键点是先把第一行数据读成headers列表,然后从第二行开始遍历数据行。通过 sheet.Range.Text 读取单元格内容,保证最终JSON中的字段名与Excel表头一致。
方式三:将指定单元格区域导出为JSON
如果只需要导出Excel中某个区域的数据,比如A1到D10,可以通过 Worksheet.Range["A1:D10"] 获取目标区域,然后按区域行列数进行遍历。
from spire.xls import Workbook
import json
workbook = Workbook()
workbook.LoadFromFile("销售数据.xlsx")
sheet = workbook.Worksheets
# 获取指定单元格区域
target_range = sheet.Range["A1:D10"]
# 获取区域的行列数
rows = target_range.LastRow - target_range.FirstRow + 1
cols = target_range.LastColumn - target_range.FirstColumn + 1
# 提取表头
headers = .Text for i in range(cols)]
# 提取数据
data = []
for r in range(2, rows + 1):
row_dict = {}
for c in range(1, cols + 1):
row_dict] = target_range.Text
data.append(row_dict)
with open("指定区域.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
workbook.Dispose()
使用区域对象时,需要注意行列索引是相对区域左上角计算的,而不是相对于整个工作表。这样设计可以让代码只处理感兴趣的数据块,减少内存占用和无效遍历。
注意事项
一、免费版限制
Free Spire.XLS for Python 在读写.xls(Excel 97-2003)格式时,每个工作簿最多5个工作表,每个工作表最多200行数据。读写.xlsx格式没有这些限制。另外,将Excel转换为其他格式时,仅支持前3页。如果业务数据量较大,建议优先使用.xlsx格式。
二、编码问题
导出的JSON文件中如果包含中文,写入文件时必须指定 encoding="utf-8",并在 json.dump() 中设置 ensure_ascii=False,否则中文会被转义成\uXXXX形式的Unicode编码,影响可读性。
三、资源释放
每次操作完成后建议调用 Dispose() 方法释放底层资源,尤其是在批量处理多个Excel文件时,避免内存占用持续增长。
总结
这三种方式分别覆盖了整簿、单表和指定区域的转换需求。直接SaveToFile方式代码最简洁,但无法自定义字段结构;手动构造方式灵活度更高,适合对JSON结构有定制要求的场景。对于中小规模的数据处理需求,尤其是无图形界面的服务器环境,Free Spire.XLS for Python 提供了一套可落地的Excel转JSON方案。开发者可以根据实际数据量、工作表数量和输出结构要求,选择最合适的一种实现。
Re: Python利用Free Spire.XLS将Excel数据导出为JSO
感谢分享,内容很详细,正好最近在做类似的数据转换。方式二手动构造字典列表的思路很清楚,适合免费版控制字段,我准备直接拿来用。想再请教下楼主:如果Excel表头有空值,或者单元格里有公式/日期这类特殊格式,用 `.Text` 读出来会是什么形式?需不需要额外处理?先谢过啦。Re: Python利用Free Spire.XLS将Excel数据导出为JSO
感谢分享,正好最近在弄Excel转JSON的活儿。第三种方式用区域对象确实灵活,不过想请教下:如果表头行里有空值或者合并单元格,手动构造headers的时候会不会出问题?另外免费版用方式一保存JSON有没有数据行数或工作表数量的限制?Re: Python利用Free Spire.XLS将Excel数据导出为JSO
感谢楼主分享,正好最近在搞数据对接,这个需求很实用。第一种整簿直接转JSON的方法在16.7.1之后确实方便,省去手写遍历的麻烦;后面两种手动控制字段结构的方式也更灵活,特别是只需要导出部分区域时很直观。编码那部分也提醒得及时,中文不乱码是关键。收藏了,回头试试。
页:
[1]