Python docx书写的通用设置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在之前完成的一个项目中,有一个模块需要用到Python的docx库来自动生成对应格式的word文档,但是实际操作发现docx的格式调整花费不少时间,在此总结和分享个人的使用心得


一、依赖库

from docx import Document
from docx.shared import Pt, Cm, Mm
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

二、Document

1、创建document

#书写word的第一层,创建一个空白的文档
document = Document()   

一个建议:
要生成一个新的文档时,都需要一个空白的模板文档。如果第一次创建文档,并在上面修改,保存的时候也只会保存自身,这样在创建第二个文档的时候又要创建一个空白文档,比较麻烦。因此个人会预先指定一个空白文档给后面的文件做模板,具体代码如下:

demo_path = os.path.join(abspath, 'demo.docx')
if not os.path.exists(demo_path):
    document = Document()
    # document.add_paragraph(' ')# 如果报错试试先写入内容
    document.save(demo_path)
doc = Document(demo_path)

这样当我们保存doc在别的地方时,不会影响到模板文件的内容。

2、document的格式设置

documnet层对应word文档的全局设置,一经设置,整篇生效
下面是一些 通用的设置(doc对应Document类)

# 在doc开头调用进行设置
def docxinitial(doc):
    # 设置正文字体类型、大小
    doc.styles["Normal"].font.name = u'宋体'
    doc.styles["Normal"].font.size = Pt(12)
    doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    # 设置页眉
    header = doc.sections[0].header
    pheader = header.paragraphs[0]  # 获取页眉的第一个段落
    ph = pheader.add_run('权利要求书')
    ph.font.name = u'黑体'  # 设置页眉字体样式
    ph._element.rPr.rFonts.set(qn('w:eastAsia'), u'黑体')
    ph.font.size = Pt(16)  # 设置页眉字体大小
    ph.bold = True  # 页眉字体加粗
    pheader.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 页眉对齐方式设为居中

# 在doc结尾处调用进行设置
# 通过sections(节)进行设置时,节对应文档中的每一页
# 每个节在没输入内容之前是不存在的,因此在最后才对每个节逐一进行设置
def setsectionformat(doc):
    for sec in doc.sections:
        # 设置页面边距(左上25毫米,右下15毫米)
        sec.top_margin = Cm(2.5)
        sec.left_margin = Cm(2.5)
        sec.right_margin = Cm(1.5)
        sec.bottom_margin = Cm(1.5)
        # 设置纸张大小(A4)
        sec.page_height = Mm(297)
        sec.page_width = Mm(210)
        # 设置页眉页脚距离
        sec.header_distance = Cm(1.5)
        sec.footer_distance = Cm(0.2)

# 例如:
doc = Document(demo_path)
docxinitial(doc)
doc.add_run('需要填充的内容')
setsectionformat(doc)

三、Paragraph

paragraph(以下简称para)是往文档中写入内容的基础,每一个para对应section中的段落

1、para的基本设置:

# 往doc中添加段落
para = doc.add_paragraph()
# 设置行前后间距,行间距(前后间距和行间距效果不相同,具体自行测试)
para.paragraph_format.space_before = Pt(0)
para.paragraph_format.space_after = Pt(0)
para.paragraph_format.line_spacing = Pt(24)
# 设置首行缩进
para.first_line_indent = para.style.font.size * 2

2、单独设置para的格式

前面我们设置document的时候,对整篇文档的字体类型、大小进行了设置,那么我们创建的para也会依照这个设置。如果我们对其中一些para有别的要求,比如标题,就需要另设一个para进行单独的设置。如下:

# 写标题
title = '这里是要居中、改变大小、加粗的标题'
ti = doc.add_paragraph()
ti.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
ti1 = ti.add_run(title)
ti1.font.size = Pt(16)  # 添加页面内容
ti1.bold = True

3、add_run()

paragraph的add_run()是往段落中添加内容

para.add_run(u'本行的内容')

若想要对写入的内容单独加粗也可加上:

para.add_run(u'本行的内容').bold = True

add_run()会将里面的内容原封不动写入。这代表,在一个para中,每一次add_run()不会自动换行,因此我们需要手动添加换行符

para.add_run(u'本行的内容\n')

但还有一种情况,就是要写入的内容中本身包含多段,如果我们在前面的doc设置中设置了首行缩进或在add_run()中手动缩进,写入的内容也只会在开头缩进,对后面的段落不会有缩进,这时需要我们对内容进行处理:

# 通过换行符检测有几段,再切开手动缩进
def checkchangeline(con, para):
    linenum = con.count('\n')
    lines = []
    if linenum > 0:
        lines = con.split('\n')
    if len(lines) > 1:
        for i, line in enumerate(lines):
            para.add_run('    ' + line + '\n')
    else:
        para.add_run('    ' + con + '\n')

4、插入图片add_picture()

doc.add_picture(path)用于在段落中插入图片,path为图片的路径。
需要注意的是,直接插入的图片是按照默认设置摆放的
如果需要设置图片居中可以这样操作:

doc.add_picture(pngpath)
last_paragraph = doc.paragraphs[-1]  # 这里的paragraphs为单独创建,用于放图片
last_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

为图片添加图片序号

para = doc.add_paragraph()
para.add_run('                                      图1').bold = True
上一篇:读取文本字母并降次输出


下一篇:docker待编辑