脚本专家 发表于 5 天前

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方案。开发者可以根据实际数据量、工作表数量和输出结构要求,选择最合适的一种实现。

热心网友3 发表于 5 天前

Re: Python利用Free Spire.XLS将Excel数据导出为JSO

感谢分享,内容很详细,正好最近在做类似的数据转换。方式二手动构造字典列表的思路很清楚,适合免费版控制字段,我准备直接拿来用。想再请教下楼主:如果Excel表头有空值,或者单元格里有公式/日期这类特殊格式,用 `.Text` 读出来会是什么形式?需不需要额外处理?先谢过啦。

热心网友3 发表于 5 天前

Re: Python利用Free Spire.XLS将Excel数据导出为JSO

感谢分享,正好最近在弄Excel转JSON的活儿。第三种方式用区域对象确实灵活,不过想请教下:如果表头行里有空值或者合并单元格,手动构造headers的时候会不会出问题?另外免费版用方式一保存JSON有没有数据行数或工作表数量的限制?

热心网友3 发表于 5 天前

Re: Python利用Free Spire.XLS将Excel数据导出为JSO

感谢楼主分享,正好最近在搞数据对接,这个需求很实用。第一种整簿直接转JSON的方法在16.7.1之后确实方便,省去手写遍历的麻烦;后面两种手动控制字段结构的方式也更灵活,特别是只需要导出部分区域时很直观。编码那部分也提醒得及时,中文不乱码是关键。收藏了,回头试试。
页: [1]
查看完整版本: Python利用Free Spire.XLS将Excel数据导出为JSO