ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python docx书写的通用设置

2021-12-30 17:02:41  阅读:365  来源: 互联网

标签:docx run para Python 书写 add paragraph 设置 doc


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

文章目录


前言

在之前完成的一个项目中,有一个模块需要用到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

标签:docx,run,para,Python,书写,add,paragraph,设置,doc
来源: https://blog.csdn.net/qq_40521970/article/details/122237166

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有