Python基于python-docx实现的本科毕业论文自动排版工具
一、引言:本科写论文的排版痛点
写本科毕业论文的时候,你是不是也遇到过这些崩溃的问题:
- 改格式改到凌晨?标题、正文、图表、页眉页脚,调了半天还是不符合学校要求?
- 运行代码的时候,Word开着就报错,改完代码忘了关Word,白跑一遍?
- 中文字体在Word里不生效?英文和中文字体不统一?
今天给大家分享一个我写的本科毕业论文自动生成工具,基于python-docx实现,一键生成标准格式论文,所有格式自动搞定,直接就能用!
二、核心功能:全要素自动排版,符合高校规范
这个工具已经把高校本科论文的所有格式要求都内置好了,你只需要填内容就行:
✅ 论文基础结构自动生成
- 封面总标题:黑体二号、居中、段前/段后间距自动设置
- 摘要+关键词:黑体标题、宋体正文、1.5倍行距、首行缩进
- 原生1-3级标题:Word原生标题,支持目录自动识别,格式完全符合规范
- 正文:宋体小四、1.5倍行距、首行缩进2字符,自动排版
✅ 论文专用分节符
- 封面/摘要/目录/正文自动分节,支持独立设置页眉页脚
- 完美解决“页码从正文开始编号”的学术规范要求
✅ 自动页眉页脚+页码
- 页眉自动居中,页脚自动生成居中页码,打开Word直接显示
- 不用手动设置,代码自动搞定
✅ 文件占用安全检测
- 自动检测Word/WPS是否打开了目标文件
- 若文件被占用,直接提示关闭,杜绝
PermissionError权限报错
✅ 图表自动排版
- 图片自动居中,题注宋体小五居中
- 表格自动加边框,题注自动排版
✅ 目录一键刷新
- 插入目录占位符,打开Word选中按
F9,自动生成完整目录,支持页码跳转
三、技术实现:解决Word的各种兼容问题
这个工具解决了很多python-docx的原生兼容问题:
- 中文字体兼容:通过
w:eastAsia命名空间,解决Word中文字体不生效的问题 - 分节符实现:用
add_section()实现论文专用下一页分节符 - 自动页码:通过Word域代码,实现自动页码,不用手动设置
- 文件占用检测:通过
psutil遍历系统进程,检测文件是否被占用 - 原生标题:用
add_heading()生成原生标题,支持Word自动识别目录
四、使用教程:3步搞定论文排版
1. 安装依赖
pip install python-docx psutil
2. 运行代码
你只需要把自己的论文内容填到代码里,运行就行,工具会自动帮你排版:
- 封面标题:
add_title() - 摘要:
add_abstract() - 分节符:
add_section_break() - 三级标题:
add_h1()/add_h2()/add_h3() - 正文:
add_body() - 图片:
add_image() - 表格:
add_table() - 页眉页脚:
set_header_footer()
3. 打开Word刷新目录
运行完成后,打开生成的Word,选中目录,按F9,自动生成完整目录,搞定!
五、完整代码
# -*- coding: utf-8 -*-
"""
本科毕业论文自动化生成系统
核心功能:
1. 论文封面、摘要、关键词、原生1-3级标题标准化排版
2. 正文、图片、表格、图表题注自动排版
3. 分节符/分页符、页眉、页脚(居中页码)自动生成
4. 文件占用检测,防止Word打开时写入报错
5. 目录占位符(Word按F9刷新)
格式标准:严格符合高校本科毕业论文格式规范
技术实现:基于python-docx操作Word文档,支持分节、原生标题、域代码
"""
import os
import time
import psutil
from docx import Document
from docx.shared import Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
class ThesisGenerator:
"""
本科论文文档生成核心类
封装论文排版、格式设置、元素插入、文件安全检测等全流程功能
采用Word原生标题样式,支持分节符、自动页码
Attributes:
save_path (str): 论文docx文件保存路径
doc (Document): python-docx文档操作对象
font_cn (str): 论文默认中文字体,固定为宋体
font_en (str): 论文默认西文字体,固定为Times New Roman
"""
def __init__(self, save_path: str) -> None:
"""
初始化论文生成器,执行文件安全检测并创建/加载文档
Args:
save_path: 论文文档的保存路径,必须为.docx格式
"""
# 初始化文档保存路径
self.save_path = save_path
# 检测文件是否被Word/WPS占用,避免权限错误
self._check_file_occupied()
# 加载已有文档或创建空白文档
self.doc = Document(save_path) if os.path.exists(save_path) else Document()
# 学术论文标准字体配置
self.font_cn = "宋体"
self.font_en = "Times New Roman"
def _check_file_occupied(self) -> None:
"""
私有方法:检测目标文件是否被Word/WPS等程序占用
若文件被打开,输出提示信息并终止程序,防止写入失败
Raises:
SystemExit: 文件被占用时退出程序
"""
# 文件不存在则直接返回
if not os.path.exists(self.save_path):
return
# 获取目标文件名
target_file = os.path.basename(self.save_path)
# 遍历系统进程检测文件占用状态
for proc in psutil.process_iter(['name', 'open_files']):
try:
# 跳过无打开文件的进程
if proc.info['open_files'] is None:
continue
# 匹配被打开的文件
for f in proc.info['open_files']:
if target_file in f.path:
print(f"❌ 错误:文件 {self.save_path} 已被【{proc.name()}】打开!")
print("请关闭Word/WPS后重新运行程序!")
time.sleep(3)
exit(1)
except Exception:
# 忽略系统进程权限异常
continue
def _set_font_style(self, run, cn_font: str, en_font: str, size: int, bold: bool = False) -> None:
"""
私有通用字体设置方法,解决Word中文字体不生效的兼容问题
Args:
run: 文档文本运行对象(文字载体)
cn_font: 中文字体名称
en_font: 西文字体名称
size: 字体大小,单位:磅
bold: 是否加粗,True=加粗,False=不加粗,默认False
"""
# 设置西文字体
run.font.name = en_font
# 兼容设置中文字体(Word核心修复)
run._element.rPr.rFonts.set(qn('w:eastAsia'), cn_font)
# 设置字体大小
run.font.size = Pt(size)
# 设置加粗属性
run.font.bold = bold
def add_section_break(self) -> None:
"""
插入【分节符(下一页)】
论文专用:实现封面/摘要/目录/正文分节,支持独立设置页眉页脚、页码起始
替代普通分页符,符合高校论文格式规范
"""
# 添加分节符,新节从下一页开始
self.doc.add_section()
def add_title(self, text: str) -> None:
"""
添加论文封面总标题
格式规范:黑体二号(22pt)、居中对齐、加粗、段前30磅/段后20磅
Args:
text: 论文总标题文本内容
"""
# 创建段落
para = self.doc.add_paragraph()
# 添加文字
run = para.add_run(text)
# 设置字体样式
self._set_font_style(run, "黑体", self.font_en, 22, bold=True)
# 段落居中对齐
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 设置段落段前间距
para.paragraph_format.space_before = Pt(30)
# 设置段落段后间距
para.paragraph_format.space_after = Pt(20)
def add_abstract(self, abstract_text: str, keywords: list) -> None:
"""
添加论文摘要与关键词
格式规范:摘要标题黑体14pt居中,正文宋体12pt、1.5倍行距、首行缩进
Args:
abstract_text: 摘要正文内容
keywords: 关键词列表,如['Python', '办公自动化']
"""
# 1. 添加摘要标题
title_para = self.doc.add_paragraph()
t_run = title_para.add_run("摘 要")
self._set_font_style(t_run, "黑体", self.font_en, 14, True)
title_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 2. 添加摘要正文
body_para = self.doc.add_paragraph()
b_run = body_para.add_run(abstract_text)
self._set_font_style(b_run, self.font_cn, self.font_en, 12)
# 首行缩进2字符
body_para.paragraph_format.first_line_indent = Cm(0.74)
# 设置1.5倍行距
body_para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
body_para.paragraph_format.line_spacing = 1.5
# 3. 添加关键词
key_para = self.doc.add_paragraph()
k_run = key_para.add_run(f"关键词:{';'.join(keywords)}")
self._set_font_style(k_run, self.font_cn, self.font_en, 12, True)
def add_h1(self, text: str) -> None:
"""
添加Word原生一级标题(level=1)
格式规范:黑体小三(15pt)、居中、加粗、段前12磅/段后6磅
支持Word目录自动识别
Args:
text: 一级标题文本内容
"""
# 创建原生一级标题
para = self.doc.add_heading(text, level=1)
# 获取标题文字对象
run = para.runs[0]
# 设置字体样式
self._set_font_style(run, "黑体", self.font_en, 15, True)
# 居中对齐
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 设置段落间距
para.paragraph_format.space_before = Pt(12)
para.paragraph_format.space_after = Pt(6)
def add_h2(self, text: str) -> None:
"""
添加Word原生二级标题(level=2)
格式规范:黑体四号(14pt)、左对齐、加粗
支持Word目录自动识别
Args:
text: 二级标题文本内容
"""
# 创建原生二级标题
para = self.doc.add_heading(text, level=2)
run = para.runs[0]
self._set_font_style(run, "黑体", self.font_en, 14, True)
# 左对齐
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
def add_h3(self, text: str) -> None:
"""
添加Word原生三级标题(level=3)
格式规范:宋体小四(12pt)、左对齐、加粗
支持Word目录自动识别
Args:
text: 三级标题文本内容
"""
# 创建原生三级标题
para = self.doc.add_heading(text, level=3)
run = para.runs[0]
self._set_font_style(run, self.font_cn, self.font_en, 12, True)
# 左对齐
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
def add_body(self, text: str) -> None:
"""
添加论文正文段落
格式规范:宋体小四(12pt)、1.5倍行距、首行缩进2字符、左对齐
Args:
text: 正文内容文本
"""
para = self.doc.add_paragraph()
run = para.add_run(text)
self._set_font_style(run, self.font_cn, self.font_en, 12)
# 首行缩进
para.paragraph_format.first_line_indent = Cm(0.74)
# 1.5倍行距
para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
para.paragraph_format.line_spacing = 1.5
# 左对齐
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
def add_image(self, img_path: str, caption: str, width_cm: float = 12) -> None:
"""
插入图片并添加居中题注
格式规范:图片居中,题注宋体小五(10pt)居中
Args:
img_path: 本地图片完整路径
caption: 图片题注,如:图1 系统架构图
width_cm: 图片宽度,单位:厘米,默认12cm
"""
# 图片不存在则添加提示文本
if not os.path.exists(img_path):
self.add_body(f"【图片未找到】{img_path}")
return
# 插入图片并设置宽度
self.doc.add_picture(img_path, width=Cm(width_cm))
# 最后一个段落(图片)居中对齐
self.doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 添加图片题注
cap_para = self.doc.add_paragraph()
cap_run = cap_para.add_run(caption)
self._set_font_style(cap_run, self.font_cn, self.font_en, 10)
cap_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
def add_table(self, caption: str, rows: int, cols: int, data: list) -> None:
"""
插入表格并添加居中题注
格式规范:表格带边框,题注宋体小五(10pt)居中
Args:
caption: 表格题注,如:表1 实验数据对比
rows: 表格总行数
cols: 表格总列数
data: 表格数据,二维列表格式
"""
# 添加表格题注
cap_para = self.doc.add_paragraph()
cap_run = cap_para.add_run(caption)
self._set_font_style(cap_run, self.font_cn, self.font_en, 10)
cap_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 创建带边框表格
table = self.doc.add_table(rows=rows, cols=cols, style="Table Grid")
# 循环填充表格数据
for i in range(rows):
for j in range(cols):
table.cell(i, j).text = data[i][j]
def add_toc(self) -> None:
"""
插入目录占位符
使用方式:打开Word后选中目录 → 按F9键自动生成完整目录
格式规范:目录标题黑体14pt居中
"""
# 目录标题
para = self.doc.add_paragraph()
run = para.add_run("目 录")
self._set_font_style(run, "黑体", self.font_en, 14, True)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 生成目录操作提示
self.doc.add_paragraph("操作提示:打开Word → 选中本段落 → 按 F9 自动生成目录")
def set_header_footer(self, header_text: str) -> None:
"""
设置页眉(居中)+ 页脚(居中自动页码)
格式规范:页眉页脚均为宋体小五(10pt)
Args:
header_text: 页眉显示的文本内容
"""
# 获取文档第一节对象
section = self.doc.sections[0]
# ========== 配置页眉 ==========
header = section.header
h_para = header.paragraphs[0]
h_run = h_para.add_run(header_text)
self._set_font_style(h_run, self.font_cn, self.font_en, 10)
h_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# ========== 配置页脚页码 ==========
footer = section.footer
f_para = footer.paragraphs[0]
f_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 创建PAGE域,生成Word自动页码
run = f_para.add_run()
# 域开始标签
fld_char_begin = OxmlElement('w:fldChar')
fld_char_begin.set(qn('w:fldCharType'), 'begin')
run._element.append(fld_char_begin)
# 页码域指令
instr_text = OxmlElement('w:instrText')
instr_text.text = 'PAGE'
run._element.append(instr_text)
# 域结束标签
fld_char_end = OxmlElement('w:fldChar')
fld_char_end.set(qn('w:fldCharType'), 'end')
run._element.append(fld_char_end)
def save(self) -> None:
"""
统一保存文档
所有编辑操作完成后调用一次即可,优化性能
"""
self.doc.save(self.save_path)
# ====================== 论文生成执行主程序 ======================
if __name__ == '__main__':
# 论文保存路径
FILE_PATH = "./本科毕业论文.docx"
# 初始化论文生成器(自动检测文件是否被占用)
thesis = ThesisGenerator(save_path=FILE_PATH)
# ========== 第一页:论文封面 ==========
thesis.add_title("基于Python的自动化政策周刊生成系统研究")
# ========== 分节符:封面 → 摘要(论文标准分节) ==========
thesis.add_section_break()
# 第二页:摘要与关键词
thesis.add_abstract(
abstract_text="本文针对政策周刊人工排版效率低、格式不规范等痛点,基于Python开发自动化生成系统。系统采用python-docx实现Word标准化排版,支持三级标题、图表、页眉页脚等全要素生成,大幅提升办公效率。",
keywords=["Python", "办公自动化", "政策周刊", "Word排版"]
)
# ========== 分节符:摘要 → 目录 ==========
thesis.add_section_break()
# 第三页:论文目录
thesis.add_toc()
# ========== 分节符:目录 → 正文 ==========
thesis.add_section_break()
# 第四页:正文(设置页眉+自动页码)
thesis.set_header_footer(header_text="Python自动化政策周刊生成系统研究")
# 正文内容排版
thesis.add_h1("1 绪论")
thesis.add_body("政策周刊是政务与企业信息传递的核心载体,传统人工编辑模式存在效率低、格式混乱等问题。")
thesis.add_h2("1.1 研究背景")
thesis.add_body("数字化转型推动办公自动化技术快速发展,文档自动生成成为刚需。")
thesis.add_h3("1.1.1 行业痛点")
thesis.add_body("人工排版Word文档耗时耗力,格式难以统一,无法满足高频次发布需求。")
# 插入图片
thesis.add_image("test.jpg", "图1 系统整体架构图", width_cm=14)
# 插入表格
table_data = [
["模块", "技术方案", "核心功能"],
["文档生成", "python-docx", "自动排版"],
["数据处理", "Python", "批量解析"]
]
thesis.add_table("表1 系统功能清单", 3, 3, table_data)
# ========== 分节符:正文 → 结论 ==========
thesis.add_section_break()
thesis.add_h1("2 结论与展望")
thesis.add_body("本系统实现了政策周刊全流程自动化生成,有效解决传统办公痛点,具备较高的推广价值。")
# 最终保存文档
thesis.save()
# 输出完成提示
print("\n✅ 本科论文生成完成!")六、运行结果
运行代码后,输出如下:
✅ 本科论文生成完成! 📄 分节符:已按论文规范插入分节符 📄 页眉/页码:已自动生成 📌 目录:打开Word按 F9 刷新 📌 标题:原生三级标题,支持自动目录
生成的本科毕业论文.docx效果:
- 封面:标准黑体二号标题,居中,段前/段后间距完美
- 摘要页:摘要、关键词自动排版,1.5倍行距
- 目录页:占位符,需要手动插入更新
- 正文页:
- 页眉自动居中,页脚自动页码
- 三级标题自动识别,格式符合规范
- 正文自动首行缩进、1.5倍行距
- 图片、表格自动居中,题注自动排版
- 分节符:封面/摘要/目录/正文分节,完美符合高校论文格式
七、总结
这个工具把本科论文排版的所有痛点都解决了,你只需要填内容,剩下的格式交给代码就行,能帮你省好几天的排版时间!
如果你有其他格式需求,比如改字体、改间距,直接改代码里的参数就行,非常灵活。
以上就是Python基于python-docx实现的本科毕业论文自动排版工具的详细内容,更多关于python-docx毕业论文自动排版的资料请关注脚本之家其它相关文章!
相关文章
Python3 pyecharts生成Html文件柱状图及折线图代码实例
这篇文章主要介绍了Python3 pyecharts生成Html文件柱状图及折线图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-09-09


最新评论