python-docx:在web后台直接生成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))
    

    响应为下载

    大概就是如此,希望能有帮助


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.