在数据处理和系统对接过程中,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[0]
- # 获取最大行列
- rows = sheet.LastRow
- cols = sheet.LastColumn
- # 提取表头(第一行)
- headers = [sheet.Range[1, i + 1].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[headers[c - 1]] = sheet.Range[r, c].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[r, c].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[0]
- # 获取指定单元格区域
- target_range = sheet.Range["A1:D10"]
- # 获取区域的行列数
- rows = target_range.LastRow - target_range.FirstRow + 1
- cols = target_range.LastColumn - target_range.FirstColumn + 1
- # 提取表头
- headers = [target_range[1, i + 1].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[headers[c - 1]] = target_range[r, c].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方案。开发者可以根据实际数据量、工作表数量和输出结构要求,选择最合适的一种实现。 |