Python 将 Excel(XLS/XLSX)转换为 JSON:导出工作簿、工作表、单元格区域与自定义 JSON 结构

目录

    • [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 结构)
    • 常见问题
    • 总结

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。

相关推荐
天l志1 小时前
Chrome Extension + 本地服务:浏览器页面上下文采集与远程执行技术设计
python·谷歌浏览器
CodexDave1 小时前
Python 自动化接单实战(九):Windows 免环境交付如何打包与诊断
windows·python·自动化·python自动化·pyinstaller·软件交付·windows打包
CTA量化套保1 小时前
2026年量化入门路线,概念规则和简单实现逐步走
人工智能·python
米码收割机1 小时前
【Python】Python Django+Vue3校园自习室预约管理系统(源码+文档+PPT)【独一无二】
开发语言·python·django
AstartesEternal1 小时前
python第二次作业(列表,字典)
开发语言·python
拉特莉的祈祷机1 小时前
绿色测试日志为什么可能已经失效:用 AET 绑定命令与当前代码
python
三金121382 小时前
Python的一些内置模块
python
NPE~2 小时前
RAG 实战教程:从零构建企业智能问答 Agent
python·ai·实战·rag·agent搭建
BaoshengTT3 小时前
2026年双流区汽车贴膜种类及挑选要点保圣威固7V不凡门店
python