DOCX库尝试

使用Python-docx库创建专业的Word文档

在日常工作和学习中,我们经常需要生成格式规范的Word文档,特别是学术论文、报告等正式文档。手动调整格式既繁琐又容易出错。今天,我将介绍如何使用Python的python-docx库来自动化生成格式化的Word文档。

什么是python-docx?

python-docx是一个强大的Python库,用于创建和修改Microsoft Word (.docx)文件。它提供了丰富的API,让我们能够通过编程方式控制文档的各个方面,包括段落、字体、表格、图片等。

安装python-docx

首先,我们需要安装这个库:

1
pip install python-docx

基础概念

在使用python-docx之前,需要了解几个基本概念:

  • Document(文档):整个Word文档对象
  • Paragraph(段落):文档中的一个段落
  • Run(文字块):段落中具有相同格式的一段连续文字
  • Style(样式):预定义的格式集合

创建和设置文档

让我们从创建一个基本文档开始:

1
2
3
4
5
6
7
8
9
10
11
from docx import Document
from docx.shared import Pt, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH

# 创建文档
doc = Document()

# 设置默认样式
style = doc.styles['Normal']
style.font.name = 'Times New Roman'
style.font.size = Pt(10.5) # 五号字

处理中英文混排

在处理中文文档时,一个常见的需求是设置不同的中英文字体。我们可以通过以下方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

def set_run_font(run, english_font='Times New Roman', chinese_font='宋体', font_size=None, bold=False):
"""设置run的字体"""
if font_size:
run.font.size = font_size
run.font.bold = bold

rpr = run._element.get_or_add_rPr()
rFonts = OxmlElement('w:rFonts')
rFonts.set(qn('w:ascii'), english_font)
rFonts.set(qn('w:eastAsia'), chinese_font)
rpr.append(rFonts)

添加标题和段落

添加标题

python-docx支持多级标题,我们可以根据需要设置不同级别的标题格式:

1
2
3
4
5
6
7
8
def add_heading_1(doc, text):
"""添加一级标题"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(text)
set_run_font(run, chinese_font='黑体', font_size=Pt(14)) # 四号

添加正文段落

正文段落通常需要首行缩进和两端对齐:

1
2
3
4
5
6
7
8
9
def add_paragraph_text(doc, text):
"""添加正文段落"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
p.paragraph_format.first_line_indent = Pt(21) # 2个汉字符缩进
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(text)
set_run_font(run, chinese_font='宋体', font_size=Pt(10.5))

创建表格

python-docx提供了强大的表格功能。以下是创建一个三线表的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def add_table(doc, caption, data):
"""添加表格"""
# 表题
p_caption = doc.add_paragraph()
p_caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p_caption.add_run(caption)
set_run_font(run, chinese_font='宋体', font_size=Pt(9))

# 创建表格
rows, cols = len(data), len(data[0])
table = doc.add_table(rows=rows, cols=cols)
table.style = 'Table Grid'

# 填充数据
for i, row_data in enumerate(data):
for j, cell_text in enumerate(row_data):
cell = table.cell(i, j)
cell.text = str(cell_text)
# 设置单元格格式...

高级功能

添加公式

虽然python-docx不直接支持数学公式,但我们可以添加格式化的公式文本:

1
2
3
4
5
6
7
8
9
10
11
def add_equation(doc, equation_text, chapter_num, eq_num):
"""添加公式"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 公式内容
run = p.add_run(equation_text)
run.font.italic = True

# 公式编号
run_num = p.add_run(f"\t({chapter_num}.{eq_num})")

处理列表和编号

对于带编号的列表,可以使用以下方法:

1
2
3
4
5
6
7
8
9
10
11
def add_sub_item(doc, text, item_type='number', level=1):
"""添加编号项"""
p = doc.add_paragraph()
p.paragraph_format.first_line_indent = Pt(21)

if item_type == 'number':
prefix = f"({level})"
elif item_type == 'circle':
prefix = f"①②③④⑤"[level-1] if level <= 5 else f"({level})"

run = p.add_run(f"{prefix} {text}")

页面设置

有时我们需要控制页面布局:

1
2
3
4
5
6
7
8
9
from docx.shared import Cm

# 设置页边距
sections = doc.sections
for section in sections:
section.top_margin = Cm(2.54)
section.bottom_margin = Cm(2.54)
section.left_margin = Cm(3.17)
section.right_margin = Cm(3.17)

实际应用示例

让我们看一个完整的例子,创建一个简单的报告:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建文档
doc = Document()

# 添加标题
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("项目进度报告")
run.font.size = Pt(16)
run.bold = True

# 添加正文
doc.add_paragraph("本报告总结了项目第一季度的进展情况。")

# 添加表格
table_data = [
["任务", "负责人", "完成度"],
["需求分析", "张三", "100%"],
["系统设计", "李四", "80%"],
["编码实现", "王五", "60%"]
]

table = doc.add_table(rows=4, cols=3)
for i, row in enumerate(table_data):
for j, cell_text in enumerate(row):
table.cell(i, j).text = cell_text

# 保存文档
doc.save("项目报告.docx")

注意事项和技巧

  1. 字体设置:处理中文文档时,要分别设置中英文字体,避免显示问题
  2. 样式复用:可以创建自定义样式,提高代码复用性
  3. 性能优化:处理大文档时,避免频繁创建run对象,尽量批量处理
  4. 错误处理:添加适当的异常处理,确保程序稳定性

总结

python-docx是一个功能强大的库,能够满足大部分Word文档自动化生成的需求。通过合理使用这个库,我们可以:

  • 大幅提高文档生成效率
  • 确保文档格式的一致性
  • 实现批量文档生成
  • 与其他Python库结合,实现数据到文档的自动化流程

掌握python-docx的使用,将为你的办公自动化之路打开一扇新的大门。无论是生成报告、创建模板,还是批量处理文档,都能得心应手。

完整的代码示例请参考文末附录。希望这篇文章能帮助你更好地使用python-docx库!

附录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
from docx import Document
from docx.shared import Pt, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

# =============================================================================
# 辅助函数
# =============================================================================

def set_document_defaults(doc):
"""设置文档的默认字体和段落间距"""
# 设置默认字体
style = doc.styles['Normal']
style.font.name = 'Times New Roman'
style.font.size = Pt(10.5) # 五号字

# 设置中文字体
rpr = style.element.get_or_add_rPr()
rFonts = OxmlElement('w:rFonts')
rFonts.set(qn('w:ascii'), 'Times New Roman')
rFonts.set(qn('w:hAnsi'), 'Times New Roman')
rFonts.set(qn('w:eastAsia'), '宋体')
rFonts.set(qn('w:cs'), 'Times New Roman')
rpr.append(rFonts)

# 设置默认段落格式
p_fmt = style.paragraph_format
p_fmt.line_spacing = Pt(18) # 行距18磅
p_fmt.space_after = Pt(0)
p_fmt.space_before = Pt(0)

def set_run_font(run, english_font='Times New Roman', chinese_font='宋体', font_size=None, bold=False, italic=False):
"""设置run的字体"""
if font_size:
run.font.size = font_size
run.font.bold = bold
run.font.italic = italic

rpr = run._element.get_or_add_rPr()
rFonts = OxmlElement('w:rFonts')
rFonts.set(qn('w:ascii'), english_font)
rFonts.set(qn('w:hAnsi'), english_font)
rFonts.set(qn('w:eastAsia'), chinese_font)
rFonts.set(qn('w:cs'), english_font)
rpr.append(rFonts)

def add_chinese_title(doc, text):
"""添加中文课题名称 - 小二号,黑体,加粗,居中"""
doc.add_paragraph() # 上空一行
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6) # 段前0.5行
p.paragraph_format.space_after = Pt(6) # 段后0.5行

run = p.add_run(text)
set_run_font(run, chinese_font='黑体', font_size=Pt(18), bold=True) # 小二号
doc.add_paragraph() # 下空一行

def add_chinese_abstract_title(doc):
"""添加中文摘要标题 - 四号,黑体,居中"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

run = p.add_run('摘要')
set_run_font(run, chinese_font='黑体', font_size=Pt(14)) # 四号

def add_chinese_abstract_content(doc, abstract_text):
"""添加中文摘要内容 - 五号宋体,首行缩进2个汉字符"""
p = doc.add_paragraph()
p.paragraph_format.first_line_indent = Pt(21) # 2个汉字符缩进
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(abstract_text)
set_run_font(run, chinese_font='宋体', font_size=Pt(10.5)) # 五号

def add_chinese_keywords(doc, keywords):
"""添加中文关键词 - 标题加粗,内容五号宋体"""
p = doc.add_paragraph()
p.paragraph_format.line_spacing = Pt(18)

# 关键词标题
run_title = p.add_run('关键词:')
set_run_font(run_title, chinese_font='宋体', font_size=Pt(10.5), bold=True)

# 关键词内容
run_content = p.add_run(keywords)
set_run_font(run_content, chinese_font='宋体', font_size=Pt(10.5))

def add_english_title(doc, text):
"""添加英文课题名称 - 小二号,Times New Roman,加粗,居中"""
doc.add_page_break() # 换页
doc.add_paragraph() # 上空一行

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

run = p.add_run(text)
set_run_font(run, font_size=Pt(18), bold=True) # 小二号
doc.add_paragraph() # 下空一行

def add_english_abstract_title(doc):
"""添加英文摘要标题 - 四号Times New Roman,居中"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

run = p.add_run('Abstract')
set_run_font(run, font_size=Pt(14)) # 四号

def add_english_abstract_content(doc, abstract_text):
"""添加英文摘要内容 - 五号Times New Roman,首行缩进2个汉字符"""
p = doc.add_paragraph()
p.paragraph_format.first_line_indent = Pt(21)
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(abstract_text)
set_run_font(run, font_size=Pt(10.5)) # 五号

def add_english_keywords(doc, keywords):
"""添加英文关键词 - 标题加粗,内容五号Times New Roman"""
p = doc.add_paragraph()
p.paragraph_format.line_spacing = Pt(18)

# 关键词标题
run_title = p.add_run('Keywords: ')
set_run_font(run_title, font_size=Pt(10.5), bold=True)

# 关键词内容
run_content = p.add_run(keywords)
set_run_font(run_content, font_size=Pt(10.5))

def add_heading_1(doc, text, chapter_num=None):
"""添加1级标题 - 四号,黑体,居中"""
doc.add_page_break() # 换页
doc.add_paragraph() # 空一行

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

if chapter_num:
full_text = f"{chapter_num} {text}"
else:
full_text = text

run = p.add_run(full_text)
set_run_font(run, chinese_font='黑体', font_size=Pt(14)) # 四号

def add_heading_2(doc, text, section_num):
"""添加2级标题 - 五号,黑体,顶格"""
p = doc.add_paragraph()
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

run = p.add_run(f"{section_num} {text}") # 序号与题名之间空一格
set_run_font(run, chinese_font='黑体', font_size=Pt(10.5)) # 五号

def add_heading_3(doc, text, section_num):
"""添加3级标题 - 五号,黑体,缩进2个汉字符"""
p = doc.add_paragraph()
p.paragraph_format.first_line_indent = Pt(21) # 缩进2个汉字符
p.paragraph_format.line_spacing = Pt(18)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)

run = p.add_run(f"{section_num} {text}") # 序号与题名之间空一格
set_run_font(run, chinese_font='黑体', font_size=Pt(10.5)) # 五号

def add_paragraph_text(doc, text):
"""添加正文段落 - 五号,宋体,两端对齐,首行缩进2个汉字符"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
p.paragraph_format.first_line_indent = Pt(21)
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(text)
set_run_font(run, chinese_font='宋体', font_size=Pt(10.5)) # 五号

def add_equation(doc, equation_text, chapter_num, eq_num):
"""添加公式 - 居中,五号宋体"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = 1.5 # 1.5倍行距

# 公式内容
run = p.add_run(equation_text)
set_run_font(run, chinese_font='宋体', font_size=Pt(10.5), italic=True)

# 公式编号右对齐
run_num = p.add_run(f"\t({chapter_num}.{eq_num})")
set_run_font(run_num, chinese_font='宋体', font_size=Pt(10.5))

def add_table(doc, table_num, chapter_num, caption, data):
"""添加表格 - 采用三线表"""
doc.add_paragraph() # 上空一行

# 表题
p_caption = doc.add_paragraph()
p_caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
p_caption.paragraph_format.line_spacing = Pt(18)

run = p_caption.add_run(f"表{chapter_num}.{table_num} {caption}")
set_run_font(run, chinese_font='宋体', font_size=Pt(9)) # 小五号

# 创建表格
rows, cols = len(data), len(data[0])
table = doc.add_table(rows=rows, cols=cols)
table.style = 'Table Grid'

# 填充数据
for i, row_data in enumerate(data):
for j, cell_text in enumerate(row_data):
cell = table.cell(i, j)
cell.text = str(cell_text)
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(18)

for run in p.runs:
set_run_font(run, chinese_font='宋体', font_size=Pt(9)) # 小五号
if i == 0: # 表头加粗
run.bold = True

doc.add_paragraph() # 下空一行

def add_figure(doc, fig_num, chapter_num, caption):
"""添加图片占位符和图题"""
doc.add_paragraph() # 上空一行

# 图片占位符
p_placeholder = doc.add_paragraph("[--- 在此插入图片 ---]")
p_placeholder.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 图题
p_caption = doc.add_paragraph()
p_caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
p_caption.paragraph_format.line_spacing = Pt(18)

run = p_caption.add_run(f"图{chapter_num}.{fig_num} {caption}")
set_run_font(run, chinese_font='宋体', font_size=Pt(9)) # 小五号

doc.add_paragraph() # 下空一行

def add_sub_item(doc, text, item_type='number', level=1):
"""添加三级以下标题或段落号
item_type: 'number' for (1), 'letter_upper' for A., 'letter_lower' for a., 'circle' for ①
"""
p = doc.add_paragraph()
p.paragraph_format.first_line_indent = Pt(21) # 缩进2个汉字符
p.paragraph_format.line_spacing = Pt(18)

if item_type == 'number':
prefix = f"({level})"
elif item_type == 'letter_upper':
prefix = f"{chr(64 + level)}."
elif item_type == 'letter_lower':
prefix = f"{chr(96 + level)}."
elif item_type == 'circle':
prefix = f"①②③④⑤⑥⑦⑧⑨⑩"[level-1] if level <= 10 else f"({level})"

run = p.add_run(f"{prefix} {text}")
set_run_font(run, chinese_font='黑体', font_size=Pt(10.5)) # 五号黑体

def add_references(doc, references):
"""添加参考文献"""
add_heading_1(doc, "参考文献")

for i, ref in enumerate(references, 1):
p = doc.add_paragraph()
p.paragraph_format.line_spacing = Pt(18)

run = p.add_run(f"[{i}] {ref}")
set_run_font(run, chinese_font='宋体', font_size=Pt(10.5)) # 五号

# =============================================================================
# 使用示例
# =============================================================================

if __name__ == "__main__":
# 1. 创建文档并设置默认格式
doc = Document()
set_document_defaults(doc)

# 2. 添加中文课题名称
add_chinese_title(doc, "轨道交通设施设备电气参数高精度采集与服役状态智能感知技术")

# 3. 添加中文摘要
add_chinese_abstract_title(doc)
add_chinese_abstract_content(doc,
"本研究针对轨道交通设施设备电气参数采集精度不高、状态监测不够智能的问题,"
"提出了一种基于宽频段高精度采集技术的智能感知方案。通过集成11种传统采集器功能,"
"实现了对电气参数的精准监测和服役状态的智能评估。实验结果表明,该技术能够有效"
"提高采集精度和监测效率,为轨道交通的安全运营提供了可靠保障。本研究的创新点在于"
"将多种采集功能集成到单一设备中,大大简化了系统结构,降低了维护成本。")

# 4. 添加中文关键词
add_chinese_keywords(doc, "轨道交通,电气参数,高精度采集,智能感知,状态监测")

# 5. 添加英文课题名称
add_english_title(doc,
"High-Precision Acquisition and Intelligent Perception Technology for "
"Electrical Parameters and Service Status of Rail Transit Facilities")

# 6. 添加英文摘要
add_english_abstract_title(doc)
add_english_abstract_content(doc,
"This study addresses the issues of low precision in electrical parameter "
"acquisition and insufficient intelligence in condition monitoring of rail "
"transit facilities. A intelligent perception scheme based on wide-band "
"high-precision acquisition technology is proposed. By integrating 11 "
"traditional collector functions, accurate monitoring of electrical parameters "
"and intelligent assessment of service status are achieved.")

# 7. 添加英文关键词
add_english_keywords(doc, "rail transit, electrical parameters, high-precision acquisition, intelligent perception, condition monitoring")

# 8. 添加第一章
add_heading_1(doc, "绪论", "1")

# 9. 添加二级标题
add_heading_2(doc, "研究背景与意义", "1.1")
add_paragraph_text(doc,
"随着我国轨道交通事业的快速发展,对设施设备运行状态的实时监测和智能评估"
"提出了更高的要求。传统的监测方法存在采集精度低、响应速度慢、智能化程度"
"不高等问题,难以满足现代轨道交通安全运营的需求。")

# 10. 添加三级标题
add_heading_3(doc, "国内外研究现状", "1.1.1")
add_paragraph_text(doc,
"近年来,国内外学者在轨道交通电气参数监测方面开展了大量研究工作。"
"专利CN109142844B集成了11种传统采集器功能,通过宽频段高精度采集技术"
"实现了电气参数的精准监测。")

# 11. 添加公式示例
add_equation(doc, "P = U × I × cosφ", 1, 1)

# 12. 添加段落号示例
add_sub_item(doc, "采集精度提高到0.1%", 'number', 1)
add_sub_item(doc, "响应时间缩短至10ms", 'number', 2)
add_sub_item(doc, "支持多通道同步采集", 'number', 3)

# 13. 添加段内层次号示例
add_paragraph_text(doc, "系统具有以下特点:")
add_sub_item(doc, "高精度采集能力", 'circle', 1)
add_sub_item(doc, "实时数据处理", 'circle', 2)

# 14. 添加表格示例
table_data = [
["参数名称", "传统方法", "本文方法", "提升幅度"],
["采集精度", "1%", "0.1%", "90%"],
["响应时间", "100ms", "10ms", "90%"],
["通道数量", "4", "16", "300%"]
]
add_table(doc, 1, 1, "技术参数对比", table_data)

# 15. 添加图片示例
add_figure(doc, 1, 1, "系统架构示意图")

# 16. 添加参考文献
references_list = [
"张三, 李四. 轨道交通电气参数监测技术研究[J]. 中国铁道科学, 2023, 44(2): 15-22.",
"Wang X, Liu Y. High-precision data acquisition system for railway applications[J]. "
"IEEE Transactions on Industrial Electronics, 2022, 69(5): 4521-4530.",
"王五, 赵六. 基于物联网的轨道交通智能监测系统设计[J]. 铁道学报, 2023, 45(3): 88-95.",
"Johnson M, Smith K. Intelligent condition monitoring in rail transit systems[J]. "
"Transportation Research Part C, 2021, 128: 103-115.",
"陈七. 城市轨道交通供电系统状态监测与故障诊断[M]. 北京: 科学出版社, 2022.",
"李八, 周九. 轨道交通设备全生命周期管理技术[J]. 城市轨道交通研究, 2023, 26(4): 45-52.",
"Brown A. Advanced sensor technologies for railway infrastructure monitoring[J]. "
"Sensors and Actuators A: Physical, 2022, 335: 113-125.",
"钱十, 孙十一. 基于大数据的轨道交通设备健康评估方法[J]. 交通运输工程学报, 2023, 23(2): 178-186.",
"Taylor R, Anderson P. Machine learning applications in railway predictive maintenance[J]. "
"Expert Systems with Applications, 2023, 213: 118-132.",
"郑十二. 智能轨道交通系统关键技术研究进展[J]. 中国科学: 技术科学, 2023, 53(6): 891-905."
]
add_references(doc, references_list)

# 17. 保存文档
doc.save("学术论文格式化文档.docx")
print("文档已保存为: 学术论文格式化文档.docx")

效果如下所示: