最近考试系统项目来了一个需求,需要根据给出的模板,直接在后台批量输出试卷的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,默认为工程目录下
效果:
添加图片
实际上,图片在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))
响应为下载