
将 Word 文档转换为 JSON 是构建自动化文档处理流水线、向 AI 模型输送内容,或将 DOCX 文件中的结构化数据迁移到数据库和 API 时的常见需求。与 CSV 或 XML 不同,JSON 是一种灵活的层级格式,可以在单一输出中表示段落、表格和嵌套的文档结构。
然而,Word 文件本身并不支持 JSON 导出。.docx 文件是由节、段落、样式和表格组成的富文本文档,而非结构化数据源。将其转换为 JSON 时,需要决定如何将内容映射为有意义的结构。
本教程演示如何使用 Spire.Doc for Python 在 Python 中将 Word 转换为 JSON。你将学习三种由浅入深的方法:提取纯段落文本、将 Word 表格转换为 JSON 数组,以及在层级化 JSON 输出中保留完整的文档结构(包括标题、段落和表格)。本教程中的示例同时适用于 Spire.Doc 支持的 DOCX 和旧版 DOC 文件。
快速导航
- Word 是如何转换为 JSON 的?
- 安装所需库
- 方法一:将 Word 文本转换为 JSON
- 方法二:将 Word 表格转换为 JSON
- 方法三:在 JSON 中保留文档结构
- Word 转 JSON 的适用场景
- 局限性与最佳实践
- 常见问题
- 总结
1. Word 是如何转换为 JSON 的?
Word 文档是由节、段落和表格组成的富文本格式,而非结构化数据格式。将 Word 转换为 JSON 时,并没有统一的标准来规定内容的表示方式,合适的结构取决于 JSON 的用途:
| 目标 | 推荐结构 | 关键特征 |
|---|---|---|
| AI 向量化 / 语义搜索 | 段落数组 | 扁平的文本字符串列表,每段一条 |
| 全文搜索索引 | 带元数据的文本块 | 段落附带节索引和样式信息 |
| 从表格导入数据库 | 表格行对象 | 以表头为键的字典,每行一条 |
| RAG 流水线 / 知识库 | 层级结构 | 嵌套的节,包含标题、段落和表格 |
| 文档归档 / 数据交换 | 完整文档模型 | 包含节、样式、元数据和所有内容类型 |
例如,一个包含标题和段落的 Word 文档可以用 JSON 表示为:
{
"document": [
{"type": "heading", "level": 1, "text": "项目概述"},
{"type": "paragraph", "text": "本报告汇总了季度业绩情况。"}
]
}
本教程的三种方法分别对应上述结构选择:
选择与你的目标匹配的方法,也可以组合多种方法的元素来构建自定义结构。
2. 安装所需库
本教程使用 Spire.Doc for Python 来读取和解析 DOC/DOCX 文件。通过 pip 安装:
pip install spire.doc
也可以下载 Spire.Doc for Python 并手动集成。
安装完成后,在 Python 脚本中导入该库:
from spire.doc import Document, FileFormat
from spire.doc.common import *
Spire.Doc 提供了加载 Word 文档、遍历节/段落/表格以及提取文本内容等 API,足以构建完整的 Word 转 JSON 流水线。
3. 方法一:将 Word 文本转换为 JSON
将 Word 转换为 JSON 最简单的方式是提取文档中所有段落文本,存入 JSON 数组。当你只需要纯文本内容而不需要结构元数据时(例如全文搜索、AI 文本向量化或简单的内容导出),这种方式非常适用。
3.1 从 Word 文档中读取段落
Spire.Doc 将 Word 文档表示为 Section(节) 的集合,每个节包含若干 Paragraph(段落)。要提取所有文本,需要遍历每个节及其中的每个段落。
from spire.doc import Document
from spire.doc.common import *
input_file = "项目报告.docx"
document = Document()
document.LoadFromFile(input_file)
paragraphs = []
for i in range(document.Sections.Count):
section = document.Sections.get_Item(i)
for j in range(section.Paragraphs.Count):
paragraph = section.Paragraphs.get_Item(j)
text = paragraph.Text
if text.strip():
paragraphs.append(text)
document.Close()
每个段落的 .Text 属性返回纯文本内容,不含格式信息。if text.strip() 检查用于过滤 Word 中作为间距或布局元素存在的空段落。
3.2 将提取的文本序列化为 JSON
假设上一步提取的段落数据存储在 paragraphs 列表中,可以将其序列化为 JSON 并保存到文件:
import json
output_file = "paragraphs.json"
result = {
"source": input_file,
"paragraph_count": len(paragraphs),
"paragraphs": paragraphs
}
with open(output_file, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
输出示例
以下 JSON 片段展示了生成的输出文件结构:
{
"source": "项目报告.docx",
"paragraph_count": 3,
"paragraphs": [
"季度销售报告",
"本文档概述了各区域的销售业绩情况。"
]
}
转换结果
下图展示了源 Word 文档和提取段落后生成的 JSON 文件。

3.3 说明
为什么要逐个遍历 Section 和 Paragraph,而不是一次性提取所有文本?因为 Word 文档是层级结构:一个文档包含一个或多个节(每个节有独立的页面布局),每个节又包含若干段落。在这一层级进行遍历,可以灵活控制要包含或跳过哪些内容,比如过滤空段落或仅提取特定节的内容。
将段落存储为 JSON 数组是最直接的结构。每个元素都是一个字符串,下游系统可以轻松消费。此方法适用于:
- 全文索引:将段落文本送入 Elasticsearch 等搜索引擎
- AI 文本向量化:将段落转换为向量表示,用于语义搜索
- 简单内容导出:从 Word 文件中提取可读文本,不含格式
不过,这种方法会丢失结构信息。标题、正文和列表项都会被同等对待。如果需要区分它们,请参见方法三。
如果只是想从 Word 文档中提取文本内容而无需转换为 JSON,也可以参考我们的在 Python 中从 Word 文档提取文本的指南。
4. 方法二:将 Word 表格转换为 JSON
在许多 Word 文档(报表、发票、产品清单、配置表)中,最有价值的内容往往在表格里,而非段落中。将 Word 表格转换为 JSON,可以提取结构化的行列数据,直接加载到数据库、API 或数据分析工具中。
为什么表格需要特殊处理
Word 中的表格以行和单元格的网格形式存储,每个单元格包含自己的段落。与段落文本不同,表格数据具有天然的二维结构,可以自然地映射为 JSON 对象。第一行通常是列标题,后续行是数据记录。
从 Word 文档中提取表格
以下代码读取 Word 文档中的所有表格,以第一行作为列标题,将每个后续行转换为一个 JSON 对象:
import json
from spire.doc import Document
from spire.doc.common import *
input_file = "销售数据.docx"
output_file = "tables.json"
document = Document()
document.LoadFromFile(input_file)
all_tables = []
for i in range(document.Sections.Count):
section = document.Sections.get_Item(i)
for t in range(section.Tables.Count):
table = section.Tables.get_Item(t)
rows_data = []
if table.Rows.Count < 2:
continue
header_row = table.Rows[0]
headers = []
for c in range(header_row.Cells.Count):
cell_text = header_row.Cells[c].Paragraphs[0].Text.strip()
headers.append(cell_text)
for r in range(1, table.Rows.Count):
row = table.Rows[r]
row_dict = {}
for c in range(row.Cells.Count):
cell_text = row.Cells[c].Paragraphs[0].Text.strip()
row_dict[headers[c] if c < len(headers) else f"Column_{c}"] = cell_text
rows_data.append(row_dict)
all_tables.append({
"table_index": t,
"headers": headers,
"row_count": len(rows_data),
"rows": rows_data
})
document.Close()
result = {
"source": input_file,
"table_count": len(all_tables),
"tables": all_tables
}
with open(output_file, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
输出示例
以下 JSON 片段展示了生成的输出文件结构,每行表格数据以表头为键映射为 JSON 对象:
{
"source": "销售数据.docx",
"table_count": 1,
"tables": [
{
"table_index": 0,
"headers": ["区域", "产品", "销量", "营收"],
"row_count": 3,
"rows": [
{"区域": "华北", "产品": "笔记本电脑", "销量": "120", "营收": "114000"},
{"区域": "华南", "产品": "笔记本电脑", "销量": "80", "营收": "76000"}
]
}
]
}
转换结果
下图展示了 Word 文档中的表格数据如何转换为结构化 JSON 记录。

说明
代码将第一行视为标题行,后续行中每个单元格的值映射到对应的标题键。这会生成一个 JSON 对象数组,是表格数据最常见也最实用的格式。
关键注意事项:
table.Rows.Count < 2跳过只有标题行或为空的表格row.Cells[c].Paragraphs[0].Text提取每个单元格中第一段的文本。为简化示例,此处只读取第一段。如果单元格包含多个段落,需要遍历整个Paragraphs集合并拼接结果:
cell_text = "\n".join(
row.Cells[c].Paragraphs[p].Text.strip()
for p in range(row.Cells[c].Paragraphs.Count)
if row.Cells[c].Paragraphs[p].Text.strip()
)
headers[c] if c < len(headers) else f"Column_{c}"处理数据行的单元格数多于标题行的情况
此方法非常适合从 Word 文档中的报表、发票、产品目录和配置表中提取结构化数据。生成的 JSON 可以直接加载到数据库、用于 Web API 或由数据分析工具处理。
如果需要从结构化 JSON 数据生成 Word 文档,请参阅我们的在 Python 中将 JSON 转换为 Word 的教程,其中介绍了如何从 JSON 对象和数组直接创建 Word 内容和表格。
5. 方法三:在 JSON 中保留文档结构
方法一和方法二将段落和表格视为独立的、彼此隔离的元素。但实际上,Word 文档具有有意义的层级关系:标题引出章节,段落提供细节,表格在特定上下文中呈现结构化数据。
在 JSON 中保留这种层级关系,产出的结果对于知识库构建、RAG(检索增强生成)流水线和文档理解系统来说要实用得多。你得到的不再是扁平的文本列表,而是一个保留了原文逻辑脉络的结构化表示。
如何在层级化 JSON 结构中保留标题、段落和表格
具体做法是遍历每个节正文中的所有子对象,判断每个对象的类型(段落或表格),并据此构建结构化的 JSON 表示。对于段落,可以通过检查 StyleName 属性来识别标题。
import json
from spire.doc import *
from spire.doc.common import *
input_file = "项目报告.docx"
output_file = "structured_output.json"
HEADING_STYLES = {
"Heading1": 1,
"Heading2": 2,
"Heading3": 3,
"Heading4": 4,
}
def get_heading_level(style_name):
return HEADING_STYLES.get(style_name, None)
def extract_table_data(table):
rows_data = []
if table.Rows.Count < 1:
return {"headers": [], "rows": []}
header_row = table.Rows[0]
headers = []
for c in range(header_row.Cells.Count):
headers.append(header_row.Cells[c].Paragraphs[0].Text.strip())
for r in range(1, table.Rows.Count):
row = table.Rows[r]
row_dict = {}
for c in range(row.Cells.Count):
cell_text = row.Cells[c].Paragraphs[0].Text.strip()
row_dict[headers[c] if c < len(headers) else f"Column_{c}"] = cell_text
rows_data.append(row_dict)
return {"headers": headers, "rows": rows_data}
document = Document()
document.LoadFromFile(input_file)
sections_data = []
for i in range(document.Sections.Count):
section = document.Sections.get_Item(i)
content_items = []
for j in range(section.Body.ChildObjects.Count):
obj = section.Body.ChildObjects.get_Item(j)
if isinstance(obj, Paragraph):
text = obj.Text.strip()
if not text:
continue
heading_level = get_heading_level(obj.StyleName)
if heading_level:
content_items.append({
"type": "heading",
"level": heading_level,
"text": text
})
else:
content_items.append({
"type": "paragraph",
"text": text
})
elif isinstance(obj, Table):
table_data = extract_table_data(obj)
content_items.append({
"type": "table",
"row_count": len(table_data["rows"]),
"data": table_data
})
sections_data.append({
"section_index": i,
"content": content_items
})
document.Close()
result = {
"source": input_file,
"section_count": len(sections_data),
"sections": sections_data
}
with open(output_file, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
输出示例
以下 JSON 片段展示了标题、段落和表格在层级化输出结构中的表示方式:
{
"source": "项目报告.docx",
"section_count": 1,
"sections": [
{
"section_index": 0,
"content": [
{
"type": "heading",
"level": 1,
"text": "季度销售报告"
},
{
"type": "paragraph",
"text": "本报告概述了各区域的销售业绩情况。"
},
{
"type": "heading",
"level": 2,
"text": "区域明细"
},
{
"type": "table",
"row_count": 3,
"data": {
"headers": ["区域", "产品", "销量", "营收"],
"rows": [
{"区域": "华北", "产品": "笔记本电脑", "销量": "120", "营收": "114000"}
]
}
}
]
}
]
}
转换结果
下图展示了标题、段落和表格如何在层级化 JSON 结构中得以保留。

说明
此方法与前两种的根本区别在于:它使用 section.Body.ChildObjects 按文档顺序遍历所有内容元素,而非分别遍历段落和表格。这样可以保留标题、段落和表格的原始顺序与交错关系。
关键设计决策:
- 通过
StyleName检测标题:Word 中的标题是应用了"Heading1"、"Heading2"等样式的段落。检查样式名可以区分标题与正文,并记录标题级别。注意,具体的标题样式名可能因 Word 模板或语言设置而异(例如带空格的"Heading 1",或中文环境下的"标题 1")。为处理这些差异,可以在查找前对样式名进行归一化:
def get_heading_level(style_name):
normalized = style_name.lower().replace(" ", "")
heading_map = {"heading1": 1, "heading2": 2, "heading3": 3, "heading4": 4}
return heading_map.get(normalized, None)
ChildObjects遍历:与section.Paragraphs(仅返回段落)或section.Tables(仅返回表格)不同,ChildObjects按原始顺序返回所有元素。这对保留文档的逻辑结构至关重要。- 结构化 JSON 输出:每个内容项都包含
type字段(heading、paragraph或table),下游系统可以据此对不同内容类型进行相应处理。
此方法特别适用于:
- RAG 和 AI 流水线:标题结构支持按章节切分文档,提升检索精度
- 知识库构建:层级化 JSON 可以直接映射为树状知识图谱
- 文档理解:保留标题与其关联内容的关系,便于对文档各章节进行语义分析
如果需要从 Word 文档中提取特定类型的内容(如标题、段落或表格),请参阅我们的在 Python 中读取 Word 文档的教程,其中更详细地介绍了内容提取技术。
6. Word 转 JSON 的适用场景
Word 转 JSON 适用于任何需要从 Word 文档中大规模提取结构化数据的场景,常见用例包括:
- AI 和 RAG 文档处理:将 Word 文档转换为 JSON 数据块,用于 LLM 应用中的向量化和检索。方法三的层级结构支持按章节切分,比扁平文本分割的检索效果更好。
- 知识库构建:从以 .docx 文件存储的技术文档、政策文件或操作手册中构建结构化知识库。
- 批量数据提取:从数百份 Word 报表、发票或表单中提取数据,将结果加载到数据库或数据仓库中。
- 合同与简历解析:将法律合同、人事文档或简历转换为结构化 JSON,用于自动化分析和比对。
- API 和 Web 应用的数据交换:通过 REST API 以 JSON 形式提供 Word 文档内容,使 Web 和移动应用无需直接处理 .docx 文件即可消费文档数据。
7. 局限性与最佳实践
局限性
- 没有通用的 Word JSON 结构标准:与 CSV 或 XML 不同,目前没有普遍接受的 Word 内容 JSON 表示格式。你需要根据具体用例来设计结构。
- 复杂格式无法捕获:本教程中的方法提取文本内容和基本的结构元数据(标题级别、表格数据),但不包括字体、颜色、图片、页面布局、页眉/页脚或脚注。如果你的应用需要这些元素,需要额外编写提取逻辑。
- 合并单元格需要特殊处理:Word 表格可以包含合并单元格(水平和垂直均支持)。方法二的逐行提取假设的是规则网格,包含合并单元格的文档可能会产生意外结果。
- 大型文档可能需要分块处理:对于数百页或包含数十个表格的文档,建议逐节或逐表处理,以控制内存占用。
最佳实践
- 先设计 JSON 结构,再编写代码:明确你需要什么(仅文本?标题?表格?完整结构?),然后选择合适的提取方法。
- 用样本文档验证输出:Word 文档的结构和格式差异很大,请用实际文档集中的代表性样本测试转换逻辑。
- 显式指定编码:写入 JSON 文件时始终指定
encoding="utf-8",避免非 ASCII 文本的编码问题。 - 在
json.dump中使用ensure_ascii=False:这可以保留输出中的 Unicode 字符,而非将其转义,对于包含非英文文本的文档尤为重要。
8. 常见问题
可以在 Python 中将 DOCX 转换为 JSON 吗?
可以。使用 Spire.Doc for Python 加载任意 .docx 文件,遍历其中的节、段落和表格,然后用 Python 内置的 json 模块将提取的内容序列化为 JSON。本教程演示了三种方法,从简单的文本提取到完整的结构保留。
开发者最好的 Word 转 JSON 工具是什么?
对于需要批量处理、自动化或自定义 JSON 结构的开发者来说,使用 Spire.Doc 的 Python 方案比在线转换器更灵活。在线工具适用于一次性转换,但无法应对大规模处理、自定义输出格式或集成到自动化流水线中的需求。
可以将 Word 表格转换为 JSON 吗?
可以。遍历 Word 文档中的表格并逐行提取单元格文本,即可将表格数据转换为 JSON 对象数组。本教程的方法二演示了基于表头的键映射方式。
Word 有原生的 JSON 导出选项吗?
没有。Microsoft Word 没有提供内置的 JSON 导出格式。Word 文件可以保存为 DOCX、PDF、HTML、RTF 和纯文本,但转换为 JSON 需要通过编程方式读取文档结构并映射为 JSON 结构。
将 Word 转换为 JSON 时可以保留标题和结构吗?
可以。遍历每个节正文中的所有子对象并检查段落样式名,可以识别标题、正文段落和表格,然后构建保留文档逻辑组织的层级化 JSON 结构。本教程的方法三提供了完整实现。
可以在线将 Word 转换为 JSON 吗?
可以,市面上有在线 Word 转 JSON 工具,能处理一次性转换。但在线工具仅支持单文件处理,且无法自定义 JSON 结构。对于批量处理、自动化流水线或自定义输出结构,使用 Spire.Doc 的 Python 方案更实用,扩展性也更好。
9. 总结
本文演示了如何使用 Spire.Doc for Python 在 Python 中将 Word 文档转换为 JSON。我们介绍了三种复杂度递增的方法:将段落文本提取为扁平 JSON 数组、将 Word 表格转换为结构化 JSON 对象,以及在单一 JSON 输出中保留完整的文档层级(包括标题、段落和表格)。
每种方法各有侧重:纯文本提取适用于索引和向量化,表格提取适用于数据迁移和报表解析,完整结构保留适用于知识库构建和 RAG 流水线。选择与你的需求匹配的方法,并根据具体用例扩展 JSON 结构即可。
Spire.Doc for Python 除了 JSON 转换外,还提供全面的 Word 文档处理能力,包括文档创建、格式设置、邮件合并和格式转换。你可以申请 30 天免费许可证来评估所有功能。







