python-docx笔记心得

最近考试系统项目来了一个需求,需要根据给出的模板,直接在后台批量输出试卷的word docx文档
于是看了看网上的包 找到了:python-docx
官方文档那叫一个难读啊··(英语废)
所以把重要的功能总结一下
安装:python3 :pip install python-docx

text的font,size,大小,颜色的设置

先说一下这个api中对于一个docx的组织情况
一个word文档,分为标题heading和paragraph等块级元素
paragraph 内部根据不同的文字格式,不同的字体,甚至不同的字体大小,粗体,斜体 划分为一个个的内联块(也就是后面说的 run
这句话非常重要,这决定了之后想要编辑段落文字的所有格式,每一个不同格式都要添加一次run
可以说,不论你想要在docx中添加什么东西,这个东西都是封装在 run 这个最小单位内部的,它的格式,必须通过操作 run 来改变
举个栗子:以下为一个段落paragraph:

这是一个run,这是一个run这也是一个run

这还是一个run

和我们使用word不同,我们必须先添加一个run,并且赋给它一小段文字,然后再通过run的api来改变它的格式
实例:我们想要添加一个段落,并且把这段文字的字体的一部分设置为宋体 另外一部分设置为微软雅黑并且将文字设置为11磅,黑色

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING
from docx.shared import Pt
from docx.shared import RGBColor
from docx.shared import Inches
doc = Document()  #生成一个空的docx对象
doc.add_heading() #添加标题
p = doc.add_paragragh() #添加段落
run=p.add_run('这段文字是宋体,') 
run.font.name = u'宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
run=p.add_run('这段文字是微软雅黑') 
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
run.font.size = Pt(11) #设置大小为11磅
run.font.color.rgb = RGBColor(0,0,0)#设置颜色为黑色
document.save('demo.docx')#保存到demo.docx,默认为工程目录下

效果:


image.png

添加图片

实际上,图片在docx中也被认为是一个run,和一段文字是一样看待的
所以插入图片也要先插入一个run,再设置run的内容为 picture

p = document.add_paragraph()
run = p.add_run()
run.add_picture(img.jpg)

另外,python-docx目前只能支持插入内联图片,没有办法插入https://exam-test.cecctm.com/media/images/detect/1111111.png
链接,关于内联图片,是指的存在本机的图片吗,而不是存在互联网上的图片,有懂得dalao求解答一下——

设置页面段落排版等

和上面不同,页面段落的排版,是在块级元素上进行操作的,
也就是需要对paragraph,heading等对象进行修改,但是如果牵扯到块级元素内部文字的大小,颜色等等,则仍然需要add_run(阴魂不散啊)
上面这段话听不懂没关系,看下例子
如果你想添加一个字体大小为24磅的标题,并且居中
假如你这样的话

from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING
head = document.add_heading('这是标题',level=1)#添加一级标题
head.alignment = WD_ALIGN_PARAGRAPH.CENTER#居中

你会发现,你没法把heading的文字"这是标题"四个字变为24磅了!因为你没有在heading里面添加run,如果你希望把它变为24磅,你必须这样:

from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING
head = document.add_heading('level=1')#添加一级标题
run = head.add_run('这是标题')
run.font.size = Pt(24)
head.alignment = WD_ALIGN_PARAGRAPH.CENTER#居中

总之,是不能把文字直接放在高级块中的···不然是没有办法编辑的!

用户下载docx

output = '/main/media/paper_docx.docx'
resp = make_response(send_file(output))

响应为下载

你可能感兴趣的:(python-docx笔记心得)