zoukankan      html  css  js  c++  java
  • Python生成word

    Python生成word

    使用python-docx-template库, 将html转为word
    python-docx-template可以使用类似jinja2的模板语法。
    依赖docx库, 安装pip install docxtpl docx

    docxtplpython-docx-template的引擎。

    GitHub主页https://github.com/elapouya/python-docx-template,上面有一些docx文件的模板使用示例,
    Python文件的示例。

    个人fork的主页https://github.com/zZhaoLei/python-docx-template

    使用示例, 和使用jinja2替换的方式差不多。

    from docxtpl import DocxTemplate
    from docx.shared import Mm
    
    doc = DocxTemplate("my_word_template.docx")
    context = { 'company_name' : "World company" }
    doc.render(context)
    doc.save("generated_doc.docx")
    

    Mm是毫米, 官方规定for height and width you have to use millimeters (Mm), inches or points(Pt) class

    图片的添加

    使用InlineImage

    from docxtpl import DocxTemplate, InlineImage
    from docx.shared import Mm
    
    doc = DocxTemplate("my_word_template.docx")
    
    context = {
        'image': InlineImage(doc, path, width=Mm(30))
    }
    doc.render(context)
    doc.save("generated_doc.docx")
    

    path可以是路径, 也可以是文件对象, width可以设置宽度或用heigth设置高度

    使用xml生成word

    先使用微软的office新建空白文档, 调整模板, 设置样式等.

    最后另存为xml格式的文件, 使用sublime进行格式化, 需要安装xml格式化插件Indent XML

    安装sublime后, 使用ctrl+~调出命令, Sublime 3粘贴

    import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
    

    sublime 2粘贴

    import urllib2,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')
    

    r然后通过Preferences-->Package Control-->Install Package, 在弹出的框中输入Indent XML, 点击就会自动安装.

    使用Esc键可以关闭安装窗口.

    Selection-->Format中选择Indent XML, 保存.

    现在可以查找想要进行模板替换的位置了, 使用jinja2的模板语法。

    Python代码示例

    # -*- coding:utf-8 -*-
    from __future__ import unicode_literals
    import jinja2
    
    path = 'C:/Users/lei/Desktop/project/export/doc/'
    fsl = jinja2.FileSystemLoader(searchpath=path)
    
    env = jinja2.Environment(loader=fsl)
    tpl = env.get_template("test.xml")
    
    data = {
        'name': '这是一个测试',
        'ip': '10.10.10.66',
        'status': '正在进行中......',
        'start_time': '2018-3-28',
        'end_time': '2018-3-29',
        'time': '2018-3-29 123213212321',
        'num': '10000000'
    }
    with open(path + "test.doc", 'w') as f:
        f.write(tpl.render(data = data).encode('utf-8'))
    

    我这里直接在word中新建的空白文档, 修改后直接保存为了Word XML, 不能写入为docx, 只能写入为doc.

    docx是有目录结构的压缩包, doc没有目录结构.

  • 相关阅读:
    springboot 整合jdbcTemplate
    springboot 整合springDataJPA
    springboot 全局异常处理
    springboot整合jsp模板
    springboot整合mybatis+pageHelper
    springboot整合mybatis
    springboot使用fastJson作为json解析框架
    springBoot开启热部署
    springboot快速入门
    解决springboot启动失败问题:Unable to start embedded container;
  • 原文地址:https://www.cnblogs.com/zzhaolei/p/11068115.html
Copyright © 2011-2022 走看看