查看: 220|回复: 3

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

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在数据处理和系统对接过程中,Excel与JSON是两种非常常见的数据格式。Excel便于人工维护和查看,JSON则适合Web接口、REST API以及程序间的数据交换。把Excel导出为JSON,是从表格数据转换到机器可读格式的常见需求。Free Spire.XLS for Python 是一个无需安装Microsoft Excel即可读写 .xls 和 .xlsx 文件的Python库,适合在服务器环境或自动化任务中使用。本文基于该库介绍三种从Excel导出JSON的编程实现方式,并说明免费版限制和编码处理细节。

环境准备

使用pip安装免费库:
  1. pip install spire.xls.free
复制代码

该库支持Python 3.6及以上版本,兼容Windows、Linux和macOS。在代码中导入所需模块:
  1. from spire.xls import Workbook, FileFormat
  2. import json
复制代码

方式一:将整个工作簿直接转换为JSON

从Spire.XLS for Python 16.7.1版本开始,库原生支持将工作簿保存为JSON格式。这种方式最简单,适合需要一次性导出全部工作表数据的场景。
  1. from spire.xls import Workbook, FileFormat
  2. import os
  3. input_file = "销售数据.xlsx"
  4. output_file = "output/工作簿.json"
  5. os.makedirs("output", exist_ok=True)
  6. workbook = Workbook()
  7. workbook.LoadFromFile(input_file)
  8. workbook.SaveToFile(output_file, FileFormat.Json)
  9. workbook.Dispose()
复制代码

执行后,生成的JSON中每个工作表名称作为顶层键,工作表第一行的标题作为属性名,后续每行数据对应一个JSON对象。例如包含“销售数据”工作表的Excel文件,生成结构大致如下:
  1. {
  2.   "销售数据": [
  3.     {
  4.       "订单编号": "SO-1001",
  5.       "客户名称": "北方科技有限公司",
  6.       "产品名称": "笔记本电脑支架",
  7.       "数量": 3,
  8.       "单价": 349,
  9.       "订单状态": "已完成"
  10.     }
  11.   ]
  12. }
复制代码

如果工作簿包含多个工作表,每个工作表都会在同一JSON文件中对应独立的顶层键。

方式二:将指定工作表导出为JSON

当只需要导出某一个工作表时,可以先获取该工作表,再手动构造字典列表并写入JSON文件。这种方式适用于免费版,也能够让开发者自由控制最终JSON的字段和数据结构。
  1. from spire.xls import Workbook
  2. import json
  3. workbook = Workbook()
  4. workbook.LoadFromFile("销售数据.xlsx")
  5. # 获取第一个工作表
  6. sheet = workbook.Worksheets[0]
  7. # 获取最大行列
  8. rows = sheet.LastRow
  9. cols = sheet.LastColumn
  10. # 提取表头(第一行)
  11. headers = [sheet.Range[1, i + 1].Text for i in range(cols)]
  12. # 逐行构造JSON数据
  13. data = []
  14. for r in range(2, rows + 1):
  15.     row_dict = {}
  16.     for c in range(1, cols + 1):
  17.         row_dict[headers[c - 1]] = sheet.Range[r, c].Text
  18.     data.append(row_dict)
  19. # 写入JSON文件
  20. with open("指定工作表.json", "w", encoding="utf-8") as f:
  21.     json.dump(data, f, ensure_ascii=False, indent=2)
  22. workbook.Dispose()
复制代码

这里关键点是先把第一行数据读成headers列表,然后从第二行开始遍历数据行。通过 sheet.Range[r, c].Text 读取单元格内容,保证最终JSON中的字段名与Excel表头一致。

方式三:将指定单元格区域导出为JSON

如果只需要导出Excel中某个区域的数据,比如A1到D10,可以通过 Worksheet.Range["A1:D10"] 获取目标区域,然后按区域行列数进行遍历。
  1. from spire.xls import Workbook
  2. import json
  3. workbook = Workbook()
  4. workbook.LoadFromFile("销售数据.xlsx")
  5. sheet = workbook.Worksheets[0]
  6. # 获取指定单元格区域
  7. target_range = sheet.Range["A1:D10"]
  8. # 获取区域的行列数
  9. rows = target_range.LastRow - target_range.FirstRow + 1
  10. cols = target_range.LastColumn - target_range.FirstColumn + 1
  11. # 提取表头
  12. headers = [target_range[1, i + 1].Text for i in range(cols)]
  13. # 提取数据
  14. data = []
  15. for r in range(2, rows + 1):
  16.     row_dict = {}
  17.     for c in range(1, cols + 1):
  18.         row_dict[headers[c - 1]] = target_range[r, c].Text
  19.     data.append(row_dict)
  20. with open("指定区域.json", "w", encoding="utf-8") as f:
  21.     json.dump(data, f, ensure_ascii=False, indent=2)
  22. 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方案。开发者可以根据实际数据量、工作表数量和输出结构要求,选择最合适的一种实现。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

感谢楼主分享,正好最近在搞数据对接,这个需求很实用。第一种整簿直接转JSON的方法在16.7.1之后确实方便,省去手写遍历的麻烦;后面两种手动控制字段结构的方式也更灵活,特别是只需要导出部分区域时很直观。编码那部分也提醒得及时,中文不乱码是关键。收藏了,回头试试。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-23 15:37 , Processed in 0.022638 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部