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))

响应为下载

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:https://www.cnblogs.com/rencm/p/6285304.html参考:https:/...
    SkTj阅读 1,793评论 0 1
  • 背景:工作中需要将文件夹下的若干word文件docx转换为对应txt文本格式 因此需要将docx中文本读取出来,然...
    凌烟阁主5221阅读 12,446评论 4 4
  • 更多内容,请访问我的 个人博客。 前言 全网找了一番,用python创建和更新word(.docx)文档,还是 p...
    潘高PG阅读 3,119评论 3 15
  • 1.昨天一早醒来,窗外望去,雾霾消散,心情瞬间明朗,把南瓜切成块,放于电饭煲。然后打开衣柜,夏秋天的衣服需要洗的放...
    拾光小世界阅读 354评论 0 1
  • 大概因为在文字里描绘过海南,所以康轶总感觉是第二次来这里。 为了第三天的品牌发布会,康轶就像被Boss关在了酒店一...
    惊蛰小白阅读 302评论 0 1