精华内容
下载资源
问答
  • docxtpl使用手册

    2020-12-31 17:38:05
    一个强大的包docxtpl ,它通过对docx文档模板加载,使用jinja2网页模板开发的语法对其进行修改。 docxtpl 的作者开发出它的原因主要是python-docx擅长创建word文档,却不擅长修改。 对于docxtpl来说,使用Microsoft...
  • python_docx&docxtpl.rar

    2020-02-22 12:14:37
    安装python-docx-template最新版本为 docxtpl-0.6.3-py2.py3-none-any.whl,该库包依赖 python-docx-0.8.7.tar.gz,现在网络限制问题,下载时断时续,几兆的东西用半天,上传提供方便!
  • docxtpl

    千次阅读 2019-11-26 15:08:01
    基于docxtpl的自动化报告生成(基于word模板) 在阅读这篇文章之前,可以去看我以前写过相似的自动化报告生成文章 ps:以前在新浪博客写,然后各种被删贴后换过来这边了 基于python-docx文本生成word文档 ...

    基于docxtpl的自动化报告生成(基于word模板)

    在阅读这篇文章之前,可以去看我以前写过相似的自动化报告生成文章
    ps:以前在新浪博客写,然后各种被删贴后换过来这边了

    • 基于python-docx文本生成word文档 (http://blog.sina.com.cn/s/blog_1473990d60102x4fr.html)
    • 基于tushare文本生成word文档(http://blog.sina.com.cn/s/blog_1473990d60102x4fs.html)
    • 自动化接口文档生成(http://blog.sina.com.cn/s/blog_1473990d60102yhr3.html)

    特别感谢

    • https://blog.csdn.net/u012117917/article/details/41604711 CSS 颜色代码大全 CSS颜色对照表
    • https://blog.csdn.net/sunchengquan/article/details/80369304 python批量操作word文档实战
    • https://blog.csdn.net/zhang__ao/article/details/80745873 echarts标题(title)配置
      以上三篇文章。此文是基于以上三篇文章的实施文章。

    此文分3部分

    1. 模板设置
    2. 图片生成
    3. 数据/图片插入模板中生成word文件

    模板设置

    在这里插入图片描述
    这里,文档中的{{qe}},{{mie}}等都是作为指代参数参数使用,需要跟代码中的指代参数保持一致。
    表示方法a为具体的某个指代
    表示方法b为表格数据指代
    表格的数据格式为

    [{'city': '广东省', 'mie': 13885, 'toimie': '5476.71', 'qie': 18158, 'toiqie': '15736.47'},
     {'city': '浙江省', 'mie': 2350, 'toimie': '2861.79', 'qie': 1059, 'toiqie': '859.79'}]
    

    图片生成

    此处我是先用pyecharts生成html,再对html图片进行截图。
    采用方法:http://pyecharts.org/#/zh-cn/render_images
    中的snapshot_selenium,使用 Chrome 浏览器。具体的配置方法可以参考我以前写的

    • 高新技术企业认定工作网(页面截图) (http://blog.sina.com.cn/s/blog_1473990d60102xaf0.html)
    • chrome浏览器。下载解压好的chromediver.exe文件放进python安装路径下的scripts文件夹里(或者你用的是anaconda,放进anaconda安装路径下的scripts文件夹里)
      这里不再多说
      相关代码如下
    # ************************************画图*****************************************
        from pyecharts.charts import Bar,Grid,Pie
        from pyecharts import options as opts
    
        # 方形图
        subtitle = ''
        title = '图1.1:***********投资前10省分布'
        path_html = './picture/1.小册子-总体情况.html'
        path_png = "./picture/1.小册子-总体情况.png"
        draw_data = table_1[:10].sort_values(['toimie'], ascending=True)
        x_lable = draw_data['city'].to_list()
        y_data_1 = [format('%.2f'%i) for i in draw_data['toimie'].to_list()]
        y_data_2 = [format('%.2f'%i) for i in draw_data['toiqie'].to_list()]
        init_opts = opts.InitOpts(width="480px", height="360px")
        plt = (
            Bar(init_opts=init_opts)
                .set_global_opts(title_opts=opts.TitleOpts(title=title, # 标题
                                                           # subtitle = subtitle, # 副标题
                                                           pos_left='center',pos_top='bottom', # 标题位置
                                                           title_textstyle_opts = {
                                                               'fontSize':10.5
                                                           }
                                                           ),
                                 yaxis_opts=opts.AxisOpts( # Y轴设置
    
                                 ),
                                 xaxis_opts=opts.AxisOpts(   # X轴设置
                                    # type_="category"     # 行坐标类型
                                 ),
                                 legend_opts=opts.LegendOpts(type_='scroll',    # 图例
                                                             orient='vertical',  # 图例列表的布局朝向
                                                             pos_left="center", pos_top='center'   # 图例位置
                                                             ),
                                 tooltip_opts=opts.TooltipOpts(trigger='axis'),
                                 toolbox_opts=opts.ToolboxOpts(),  # 工具栏
                                 # datazoom_opts=opts.DataZoomOpts(),  # 缩放功能
    
                                 )
                .set_series_opts(label_opts=opts.LabelOpts(# is_show=False,       # 是否显示数值
                                                           position="right" ,     # 设置字体对齐
                                                           ))
            #     .extend_axis(           # 双轴
            #     yaxis=opts.AxisOpts()
            # )
                .add_xaxis(x_lable
                           )
                .add_yaxis('****投资总额(亿元)', y_data_1,label_opts=opts.LabelOpts(position='right', # 标签文字位置
                                                                            font_weight='bolder',    # 标签字体
                                                                            # color='#FFC8B4'
                                                                            ),
                                                        # color='#FFC8B4'
    
                           )
                .add_yaxis('对****投资总额(亿元)', y_data_2,label_opts=opts.LabelOpts(position='right',font_weight='bolder'))
                .reversal_axis()  # 转轴
        )
        grid = Grid(init_opts=init_opts)
        grid.add(plt, grid_opts=opts.GridOpts(pos_top='5'))  # 仅使用pos_top修改相对顶部的位置
        grid.render(path_html)
    
    
        # 玫瑰图
        subtitle = '图1.2:**********互投行业明细'
        title = '外圈:***投资总额  内圈:对****投资总额'
        path_html_1 = './picture/1.小册子-总体情况_1.html'
        path_png_1 = "./picture/1.小册子-总体情况_1.png"
        code_num = len(table_2['code'].to_list())
        # code_num = 10
        draw_data = \
            [[table_2['code'].to_list()[i],format('%.2f'%table_2['toimie'].to_list()[i])]
             for i in range(code_num) ]
        draw_data_1 = \
            [[table_2['code'].to_list()[i],format('%.2f'%table_2['toiqie'].to_list()[i])]
             for i in range(code_num)]
        init_opts_pie = opts.InitOpts(width="640px", height="480px")
        plt = (
            Pie(init_opts=init_opts_pie)
                .set_global_opts(title_opts=opts.TitleOpts(title=title,  # 标题
                                                           subtitle = subtitle, # 副标题
                                                           pos_left='center', pos_bottom='0',  # 标题位置
                                                           title_textstyle_opts={              # 主标题
                                                               'fontSize': 16.5,               # 字体大小
                                                               "fontWeight": "bolder",         # 字体:加粗
                                                               "color": "#444444"              # 字体颜色
                                                           },
                                                           subtitle_textstyle_opts={           # 负标题
                                                               'fontSize': 16.5,
                                                                "fontWeight": "bolder",
                                                                "color": "#000000"
                                                           }
                                                           ),
                                 yaxis_opts=opts.AxisOpts(  # Y轴设置
    
                                 ),
                                 xaxis_opts=opts.AxisOpts(  # X轴设置
                                     # type_="category"     # 行坐标类型
                                 ),
                                 legend_opts=opts.LegendOpts(type_='scroll',  # 图例
                                                             orient='vertical',  # 图例列表的布局朝向
                                                             pos_left="left", pos_top='center'  # 图例位置
                                                             ),
                                 tooltip_opts=opts.TooltipOpts(trigger='axis'),
                                 toolbox_opts=opts.ToolboxOpts(),  # 工具栏
                                 # datazoom_opts=opts.DataZoomOpts(),  # 缩放功能
    
                                 )
                .set_series_opts(label_opts=opts.LabelOpts(# is_show=False,       # 是否显示数值
                position="right",  # 设置字体对齐
            ))
                .add(
                "对****投资总额",
                draw_data_1,
                radius=["15%", "30%"],
                # center=["25%", "50%"],    # 中心点位置
                # rosetype="radius",
                label_opts=opts.LabelOpts(is_show=True,formatter="{b}: {c}",font_weight='bolder',),
            )
                .add(
                "****投资总额",
                draw_data,
                radius=["65%", "80%"],
                # center=["75%", "50%"],
                # rosetype="area",
                label_opts=opts.LabelOpts(is_show=True,formatter="{b}: {c}",font_weight='bolder',),
            )
        )
        grid_1 = Grid(init_opts=init_opts_pie)
        grid_1.add(plt, grid_opts=opts.GridOpts(pos_top='5'))  # 仅使用pos_top修改相对顶部的位置
        grid_1.render(path_html_1)
    
    
        # html转图片
        from pyecharts.render import make_snapshot
        from snapshot_selenium import snapshot
        make_snapshot(snapshot, grid.render(path_html), path_png,delay=2,pixel_ratio=2)
        make_snapshot(snapshot, grid_1.render(path_html_1), path_png_1,delay=2,pixel_ratio=2)
    
    

    数据/图片插入模板中生成word文件

    这里是将生成好的数据与图片插入到word中,使用的是jinja2,docxtpl,docx这3个包
    代码如下

        import jinja2
        from jinja2.utils import Markup
        from docxtpl import DocxTemplate
        from docxtpl import InlineImage
        from docx.shared import Mm, Inches, Pt
    
        tpl=DocxTemplate(r'./source/from/1.小册子-总体情况.docx')
    
    
            # 20191129针对缺失值修改为 '-' 显示
        table_1 = \
             [{'city': row.city,
               'mie':'-' if format('%.0f' %row.mie) == 'nan' else format('%.0f' %row.mie),
               'toimie': '-' if format('%.2f' % row.toimie) == 'nan' else format('%.2f' % row.toimie),
               'qie': '-' if format('%.0f' % row.qie) == 'nan' else format('%.0f' % row.qie),
               'toiqie': '-' if format('%.2f' % row.toiqie) == 'nan' else format('%.2f' % row.toiqie)}
              for index, row in table_1.iterrows()]
         table_2 = \
             [{'code': row.code,
               'mie': '-' if format('%.0f' % row.mie) == 'nan' else format('%.0f' % row.mie),
               'toimie': '-' if format('%.2f' % row.toimie) == 'nan' else format('%.2f' % row.toimie),
               'qie': '-' if format('%.0f' % row.qie) == 'nan' else format('%.0f' % row.qie),
               'toiqie': '-' if format('%.2f' % row.toiqie) == 'nan' else format('%.2f' % row.toiqie), }
              for index, row in table_2.iterrows()]
    
        context={
            'year':year,
            'quarter':quarter,
            'qe':qe,
            'mie':mie,
            'toimie':toimie,
            'me':me,
            'qie':qie,
            'toiqie':toiqie,
            'pic_1': InlineImage(tpl, path_png,width=Mm(125)),
            'pic_2': InlineImage(tpl, path_png_1, width=Mm(100)),
            'table_1':table_1,
            'table_2': table_2
                  }
        jinja_env = jinja2.Environment(autoescape=True)
        tpl.render(context,jinja_env)
        tpl.save(r'./result/1.小册子-*****总体情况.docx')
    

    效果图
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • python-docx-template 使用docx作为jinja2模板 介绍 该软件包使用2个主要软件包: 用于读取,编写和创建子文档的python-docx jinja2用于管理插入到模板docx中的标签 之所以创建python-docx-template,是因为...
  • docxtpl 学习笔记

    2021-10-12 15:14:28
    然后发现大家都是用docxtpl这个包直接设置模板导入使用的真的好方便啊 1.直接新建一个word 文档把你想要设置的格式用wor设置好,包括页眉页脚啊,页边距啊,纸张大小啊,字体字号,颜色,加粗斜体 行高列宽啥的统统...

    之前一直用python docx 设置word 格式设置的好辛苦,弄了半天也不知道表格允许跨页隔断和各页顶端以标题行显示应该怎么实现

    然后发现大家都是用docxtpl这个包直接设置模板导入使用的真的好方便啊

    1.直接新建一个word 文档把你想要设置的格式用wor设置好,包括页眉页脚啊,页边距啊,纸张大小啊,字体字号,颜色,加粗斜体 行高列宽啥的统统定义好,然后在表格中加入希望用python来进行填充的字段

    1) 这个字段只出现一次的,单个字段eg report name/batch no啥的 在它应该出现的那个cell中写{{variable name}}

    母本{{name}}
    编号{{no}}

    这个{{variable name}} 就是你在python 中的变量名

    2) 有多行数据需要插入的

    首先需要第一行合并单元格 告诉python 从这行的下面开始插入,并且有这么几列需要插入

    下面一行就是需要插入的variable name

    最后一行也需要合并单元格 告诉python 到这行就结束啦

    {%tr for row in data%}
    {{row.step}}{{row.bp}}{{row.x}
    {%tr endfor %}

    3) 有多列数据需要插入的

    和行差不多

    {%tc for col in cols%}{{col}}{%tc endfor %}

    然后我的template就搞定了接下来就是python写啦

    2. Python part

    1) 打开template,处理好要加进template的data

     tpl=DocxTemplate('./../tpl.docx')
    
     context={"name":report_name,"no":batch,"data":data} ##data 就是json 格式的data
    ##data 长这样
    ## data=[{'step': '1.14',
    ##  'bp': '二氯甲烷',
    ##  'x': '',},
    ## {'step': '3.14',
    ##  'bp': '湿品',
    ##  'x': '1'}]
    

    2) render 一下template

     tpl.render(context)
     tpl.save('./.../table.docx')

    好了结束!

    展开全文
  • docxtpl实战案例-审计脚注表格回填

    万次阅读 多人点赞 2020-12-31 17:32:49
    作者:小小明 Pandas数据处理专家,帮助一万用户解决数据处理难题。 最近碰到一个需求: ...对于第二个需求,先生成模板,再用docxtpl模板渲染 关于docxtpl,我已经根据官方文档,制作了一份操作手册:https://blo.

    作者:小小明

    Pandas数据处理专家,帮助一万用户解决数据处理难题。

    最近碰到一个需求:

    image-20201231152501300

    虽然我没完全看懂啥意思,但大意就是:

    1.读取word文档,将其中所有的表格都写入到一个excel文件中

    2.对写好的excel做出一些修改(包括改某几个单元格的值和删除行),然后将修改后的excel数据回填到word表对应的位置

    对于第一个需求,直接用pandas写出即可

    对于第二个需求,先生成模板,再用docxtpl模板渲染

    关于docxtpl,我已经根据官方文档,制作了一份操作手册:https://blog.csdn.net/as604049322/article/details/112008531

    好了,就按照这个大致理解的需求开始干:

    读取word文档表格写入到excel

    python代码:

    from docx import Document
    import pandas as pd
    
    
    doc = Document(r"test.docx")
    writer = pd.ExcelWriter("test.xlsx")
    for i, table in enumerate(doc.tables):
        header = [cell.text for cell in table.rows[0].cells]
        result = []
        for row in table.rows[1:]:
            tmp = []
            for cell in row.cells:
                tmp.append(cell.text)
            result.append(tmp)
        df = pd.DataFrame(result, columns=header)
        df.to_excel(writer, sheet_name=f"{i}", index=False)
    
    writer.save()
    

    经过上面代码处理,就将这样一个word文档:

    image-20201231155311116

    提取出来了这样的一个excel文件:

    image-20201231155425633

    整体效果已经达到,但是我觉得如果能顺便设置好列宽就好看点,要设置好列宽,我的思路是计算出每列的字符串的最大长度,但不能直接用字符长度,每个中文字符会占用两个长度,所以我直接取gbk编码后的字节长度:

    from docx import Document
    import pandas as pd
    import numpy as np
    
    doc = Document(r"test.docx")
    writer = pd.ExcelWriter("test.xlsx")
    workbook = writer.book
    
    for i, table in enumerate(doc.tables):
        header = [cell.text for cell in table.rows[0].cells]
        result = []
        for row in table.rows[1:]:
            tmp = []
            for cell in row.cells:
                tmp.append(cell.text)
            result.append(tmp)
        df = pd.DataFrame(result, columns=header)
        df.to_excel(writer, sheet_name=f"{i}", index=False)
        worksheet = writer.sheets[f"{i}"]
        #  计算表头的字符宽度
        column_widths = (
            df.columns.to_series()
            .apply(lambda x: len(x.encode('gbk'))).values
        )
        #  计算每列的最大字符宽度
        max_widths = (
            df.astype(str)
            .applymap(lambda x: len(x.encode('gbk')))
            .agg(max).values
        )
        # 计算整体最大宽度
        widths = np.max([column_widths, max_widths], axis=0)
        for i, width in enumerate(widths):
            worksheet.set_column(i, i, width)
    
    writer.save()
    

    结果:

    image-20201231163620090

    有了一个合适的列宽,我看的舒服多了,至少我自己是满意了,要用代码加什么好看的样式也简单。

    好了,现在开始处理需求2:

    读取修改过的excel回填到word文档中

    读取word并生成word模板

    要回填到word文档中,我们应该事先生成能够被doctpl解析的模板,我的思路是每个表格除了表头以外全部删除,然后动态生成以下格式的模板:

    xxxxxxxxx
    {%tr for cells in rows0 %}
    {{ cells[0] }}{{ cells[1] }}{{ cells[2] }}
    {%tr endfor %}
    {{ footers0[0] }}{{ footers0[1] }}{{ footers0[2] }}

    到时候再直接根据excel的数据渲染就行,那么如何生成word模板呢?

    直接看看我的代码吧:

    from docx import Document
    
    def set_font_style(after_font_style, before_font_style):
        after_font_style.bold = before_font_style.bold
        after_font_style.italic = before_font_style.italic
        after_font_style.underline = before_font_style.underline
        after_font_style.strike = before_font_style.strike
        after_font_style.shadow = before_font_style.shadow
        after_font_style.size = before_font_style.size
        after_font_style.color.rgb = before_font_style.color.rgb
        after_font_style.name = before_font_style.name
    
    doc = Document("test.docx")
    for i, table in enumerate(doc.tables):
        # 缓存最后一行的行对象
        last_row = table.rows[-1]._tr
        # 删除除表头外的所有行
        for row in table.rows[1:]:
            table._tbl.remove(row._tr)
        # 表格添加一行,第一个单元格文本指定为指定的内容
        table.add_row().cells[0].text = '{%tr for cells in rows'+str(i)+' %}'
        # 再添加一行用于保存中间的模板
        row = table.add_row()
        for j, cell in enumerate(row.cells):
            cell.text = '{{ cells[%d] }}' % j
        # 再添加一行用于保存endfor模板
        table.add_row().cells[0].text = '{%tr endfor %}'
        # 将直接缓存的最后一行添加到行尾
        table._tbl.append(last_row)
        # 表格的行尾修改完样式后,还原回以前的样式
        for j, cell in enumerate(table.rows[-1].cells):
            before_font_style = cell.paragraphs[0].runs[0].font
            cell.text = '{{ footers%d[%d] }}' % (i, j)
            after_font_style = cell.paragraphs[0].runs[0].font
            set_font_style(after_font_style, before_font_style)
    
    doc.save("test_template.docx")
    

    模板生成的效果:

    image-20201231165752271

    根据word模板回填word

    有了模板就可以开始根据模板回填word了,首先我把excel修改成这样:

    image-20201231170411064

    就是一个表改了两个值,另一个表删了两行,保存后,执行以下代码:

    from docxtpl import DocxTemplate
    import pandas as pd
    
    tpl = DocxTemplate('test_template.docx')
    excel = pd.ExcelFile("test.xlsx")
    context = {}
    for sheet_name in excel.sheet_names:
        data = pd.read_excel(excel, sheet_name).values
        context[f'rows{sheet_name}'] = data[:-1].tolist()
        context[f'footers{sheet_name}'] = data[-1].tolist()
    tpl.render(context)
    tpl.save('result.docx')
    

    回填结果:

    image-20201231171022970

    好了,到现在为止,我个人觉得已经大体上完成效果了。当然还不够完美,很多样式适配都还没有去做,首先是行高丢失,然后是修改数值后的千分符丢失,这都要等正式开发后去适配,我这里不公布正式开发的代码。

    总结

    你对doctpl怎么看呢?欢迎你在下方评论或留言表达你的看法。

    展开全文
  • Python 第三方库之 docxtpl (处理word文档)

    千次阅读 热门讨论 2020-08-11 18:12:36
    docxtpl 软件包使用两个主要软件包: python docx,用于读取、写入和创建子文档 jinja2用于管理插入到模板docx中的标记 from docxtpl import DocxTemplate tpl = DocxTemplate('test.docx') context = { '...

    项目官方文档

    项目官方git

    docxtpl 软件包使用两个主要软件包:

    简单示例

    from docxtpl import DocxTemplate
    
    tpl = DocxTemplate('test.docx')
    
    context = {
        'template': '123'
    }
    
    tpl.render(context)
    tpl.save('test1.docx')

    安装

    pip install docxtpl


    导言

    python-docx-template被开发出来,是因为python-docx的强大在于创建文档,而不是修改它们。

    这个想法是开始于创建一个需要用MicrosoftWord生成的文档的示例,它可以像我们想要的那样复杂:如图片、索引表、页脚、页眉、变量,以及我们可以用Word做的任何事情。然后,当我们使用MicrosoftWord编辑文档时,直接在文档中插入类似于Jinja 2的标记。将文档保存为.docx文件(XML格式):它将是.docx模板文件。

    现在,我们可以使用python-docx-template从这个.docx模板和将关联的上下文变量生成您想要的多个Word文档。

    注意:python-docx-template是测试的是MS Word 97格式,它可能不适用于其他版本.

    Jinja 2类语法

    因Jinja 2包被使用,可以使用Word文档中的所有Jinja 2标记和过滤器。然而,要使它在Word文档中工作,进行了些限制和扩展:

    限制

    通常的Jinja 2标签,只能在同一个段落的同一个‘’run’中使用,它不能跨几个段落使用,表行、‘run’。如果您想要管理段落、表行和整个‘run’的样式,您必须使用特殊的标记语法,如下一章所述。

    注意:MicrosoftWord的“Run”是一个具有相同风格的字符序列。例如,如果您创建一个具有相同风格的所有字符的段落:Word将在内部创建一个段落中的“Run”。现在,如果你在这段中间加了一个粗体,单词会把前面的“Run”转换成3‘Run’(普通-粗体-正常)。

    扩展

    为了管理段落、表行、表列、run,必须使用特殊的语法。(区别于jinja2)

    {%p jinja2_tag %} for paragraphs
    {%tr jinja2_tag %} for table rows
    {%tc jinja2_tag %} for table columns
    {%r jinja2_tag %} for runs

    通过使用这些标记,python-docx-template将真正的Jinja 2标记放入文档的XML源代码中的正确位置。此外,这些标记还告诉python-docx-template移除位于开始和结束标记的位置的段落、表行、表列或run,只注意中间的位置。

    重要*不要使用2次{%p, {%tr、`{%tc‘、{%r在同一段落、行、列或run中。例子:

    不要用这个

    {%p if display_paragraph %}Here is my paragraph {%p endif %}

    而是使用

    {%p if display_paragraph %}
    Here is my paragraph
    {%p endif %}

    这种语法是可能是因为Microsoft word将每一行都看作是一个新的段落,{%p标签不在同一段中

    显示变量

    作为Jinja 2的一部分,可以使用双括弧:{{ <var> }}。但如果 <var> 是RichText对象,必须指定要更改实际的“Run”。{{r <var> }}注意’r紧跟左括弧。

    重要*不要使用 r 变量出现在模板中,因为{{r}} 可以解释为 {{r 没有指定变量。不过,您可以使用以‘r’开头的更大的变量名。例如{{render_color}}将被解释为{{ render_color }}不像{{r ender_color}}.

    重要*不要使用2次 {{r 在同一run上。使用RichText.add()方法在python端连接多个字符串和样式,并且只有一个字符串和样式 {{r 在模板边。

    单元格颜色

    当您想要更改表格单元格的背景色时,有一种特殊情况,您必须在单元格的开头放置以下标记

    {% cellbg <var> %}

    <var>必须包含颜色的十六进制代码无散列符号

    列跨越

    如果您想在多个列上动态地跨越一个表单元格(当您有一个具有动态列计数的表时,这是很有用的),您必须在单元格的最开始处放置下面的标记来跨越

    {% colspan <var> %}

    <var>必须包含要跨越的列数的整数。有关示例,请参见下一篇示例操作

    Escaping

    为了展示{%, %}, {{或}},你可以用

    {%, %}, {{ or }}

    RichText

    当你使用{{ <var> }}标记,它将被包含在 var 变量的字符串替换。但它将保持目前的格式。如果要添加动态变化的样式,则必须同时使用以下两种方式:{{r <var> }}标签一个 RichText对象在 var 变量。您可以更改颜色、粗体、斜体、大小等,但最好的方法是使用microsoft word来定义自己的字符样式(主页选项卡->修改样式->管理样式按钮->新建样式,在窗体中选择“字符样式”),请参见tests/richtext.py,除了使用RichText(),您可以使用它的快捷方式:R()

    重要*当你使用{{r }}它从docx模板中移除当前字符样式,这意味着如果你没有在RichText()设置字体样式,样式将返回到Microsoft Word默认样式。这只会影响字符样式,而不会影响段落样式(MSWord管理的这2种样式)。

    可以通过Richtext将超链接添加到文本中。

    tpl=DocxTemplate(‘your_template.docx’)
    rt = RichText('You can add an hyperlink, here to ')
    rt.add(‘google’,url_id=tpl.build_url_id(‘http://google.com’))

    将rt放在您的语境中,然后使用{{r rt}}在你的模板中

    内嵌图像

    您可以动态地将一个或多个图像添加到文档中(使用JPEG和PNG文件进行测试)。只要在你的模板中加上{{ <var> }},标记<var>是doxtpl.inlineImage的实例。

    myimage=InlineImage(tpl,‘test_files/python_logo.png’,width=Mm(20))

    您只需指定模板对象、图像文件路径和可选宽度和/或高度即可。对于高度和宽度,您必须使用毫米(毫米),英寸(英寸)或点(Pt)类。有关示例,请参见test/inlineImage.py。

    子文件

    模板变量可以包含使用python-docxWord文档从头开始构建的复杂变量。为此,首先从模板对象获取子文档对象,并将其用作python-docx文档对象,参见tests/subdoc.py.

    转义,换行符,新段落,列表
    当您使用{{ <var> }},您正在修改XMLWord文档,这意味着您不能使用所有字符,特别是<, >和&。为了使用它们,你必须转义它们。有四种方式:

    context = { ‘var’:R(‘my text’) }和在模板中{{r <var> }}(注意r),
    context = { ‘var’:‘my text’}和在模板中{{ <var>|e }}
    context = { ‘var’:escape(‘my text’)}和在模板中{{ <var> }}。
    在调用呈现方法时启用自动转义:tpl.render(context, autoescape=True)(默认值autoescape=false)
    RichText()或R()提供换行符和新段落功能:只需使用\n或\a在文本中,它们将作相应的转换。

    有关更多信息,请参见tests/escape.py 。

    另一个解决方案,如果要将列表包含到文档中,即转义文本并管理n和a,则可以使用’Listing’ class:

    在python代码中

    context = { 'mylisting':Listing('the listing\nwith\nsome\nlines \a and some paragraph \a and special chars : <>&') }
    

    在docx模板中只需使用{{ mylisting }}带着Listing(),您将保持当前字符的样式(除非在一个\a之后你开始新的一段落)。

    替换docx图片

    在页眉/页脚中动态添加图像是不可能的,但您可以更改它们。这样做的目的是在模板中放置一个虚拟图片,像往常一样渲染模板,然后用另一个模板替换虚拟图片。你可以同时为所有媒体做到这一点。Note1:纵横比将与替换的图像相同 Note 2:指定用于在docx模板中插入图像的文件名(只要其basename,而不是完整路径)。

    替换dummy_header_pic.jpg的语法:

    tpl.replace_pic('dummy_header_pic.jpg','header_pic_i_want.jpg')
    

    替换发生在页眉、页脚和整个文档正文中。

    替换docx媒体

    在页眉/页脚中动态添加图片以外的其他媒体是不可能的,但您可以更改它们。这样做的目的是在模板中放置一个虚拟媒体,像往常一样呈现模板,然后用另一个模板替换虚拟媒体。你可以同时为所有媒体做到这一点。注意:对于图像,高宽比将与替换的图像注释2相同:重要的是要有源媒体文件,因为它们需要计算它们的CRC才能在docx中找到它们。(虚拟文件名不重要)

    替换dummy_header_pic.jpg的语法:

    tpl.replace_media('dummy_header_pic.jpg','header_pic_i_want.jpg')
    

    警告:与replace_pic() 方法不同,dummy_header_pic.jpg 必须存在模板目录中,当在渲染和保存生成docx时。它必须与手动插入在docx模板的文件相同。替换可以发生在页眉、页脚和整个文档正文中。

    替换嵌入对象

    它的工作方式类似于媒体替换,只是它适用于嵌入式docx这样的嵌入式对象。

    替换embedded_dummy.docx的语法:

    tpl.replace_embedded('embdded_dummy.docx','embdded_docx_i_want.docx')
    

    警告:与REPLE_PIC()方法不同,embdded_dumy.docx必须存在于模板目录中,在渲染和保存生成的docx时。它必须与手动插入docx模板的文件相同。替换发生在页眉、页脚和整个文档正文中。

    Microsoft Word 2016特例

    MS Word 2016将忽略表格的 \t。这对这个版本来说是特别的。但是LibreOffice或Wordpad没有这个问题。对于以jinja2标记产生空格来开头的行,也会出现同样的情况:它们将被忽略。要解决这些问题,解决方案是使用Richtext:

    tpl.render({
        'test_space_r' : RichText('          '),
        'test_tabs_r': RichText(5*'\t'),
    })
    

    在模板中,使用 {r 表示法:

    {{r test_space_r}} Spaces will be preserved
    {{r test_tabs_r}} Tabs will be displayed

    表格

    可以两种方式水平地跨表格单元格,一是利用colspan标记(请参阅tests/dynamic_table.py):

    {% colspan %}

    或者在for循环中(请参阅tests/horizontal_merge.py)):

    {% hm %}

    还可以在for循环中垂直合并单元格(请参阅 tests/vertical_merge.py):

    {% vm %}

    Jinja自定义过滤器

    render() 接受 jinja_env 选项参数:您可以传递一个jinja环境对象。通过这种方式,您可以添加一些定制的jinja过滤器:

    from docxtpl import DocxTemplate
    import jinja2
    def multiply_by(value, by):
       return value * by
    
    doc = DocxTemplate("my_word_template.docx")
    context = { 'price_dollars' : 5.00 }
    jinja_env = jinja2.Environment()
    jinja_env.filters['multiply_by'] = multiply_by
    doc.render(context,jinja_env)
    doc.save("generated_doc.docx")
    

    然后在模板中,您将能够使用

    Euros price : {{ price_dollars|multiply_by(0.88) }}

    例子

    查看其工作原理的最佳方法是阅读示例,它们位于 tests/ 目录。Docx测试模板在tests/templates/目录。要生成最终的docx文件:

    cd tests/
    python runtests.py
    

    生成的文件位于tests/output 目录。

    想要真正学会对应包,赶紧自己下载,根据测试文件测试吧!

    展开全文
  • docxtpl-readthedocs文档

    2021-08-25 11:00:40
    详细介绍了docxtpl的用法
  • python处理word文档(docxtpl 中文说明文档)

    万次阅读 多人点赞 2019-03-16 23:43:33
    docxtpl docxtpl 一个很强大的包,其主要通过对docx文档模板加载,从而对其进行修改。 主要依赖两个包 python-docx :读写doc文本 jinja2:管理插入到模板中的标签 安装 pip install docxtpl 基本使用: from...
  • python使用docxtpl处理word文档图片不显示问题 python使用docxtpl处理word文档图片不显示问题 docxtpl的使用: 安装docxtpl: pip install docxtpl 基本使用实例main.py: from docxtpl import DocxTemplate doc =...
  • pip install docxtpl 文件模板渲染 2、python版本 2.7 3.6的版本也有的 3、基础知识 字符串渲染:{{project_name}} 整体循环渲染:{% for item in list %} 内容 {%p endfor %} 整体的部分循环渲染:{%tr for ...
  • 使用docxtpl库实现docx报告自动化输出

    千次阅读 2020-03-24 17:15:38
    大概是一些信息需要从excel表格中读取,然后填写到word固定位置后批量出局报告,操作繁琐,重复劳动,使用docxtpl库实现。 应用环境如下: Windows 10 Python 3.6 docxtpl-0.6.3 安装支持 #docxtpl安装,会自动...
  • 使用python-docx & docxtpl生成Word文档

    千次阅读 2020-08-30 11:37:12
    最近需要用python生成Word文档,期间用到了python-docx 和 docxtpl库,这两者都可以用pip安装。 1、安装方法: $ pip install python-docx $ pip install docxtpl python-docx 相对比较难安装一点,可能会遇到坑...
  • docxtpl填充文本模板

    2020-07-19 10:41:06
    from docxtpl import DocxTemplate docurl = "C:\\Users\\FCX\\Desktop\\0君子\\test\\附件5:君子科技公司采购清单(包含成本价).docx" savepathname = "C:\\Users\\FCX\\Desktop\\0君子行\\test\\demo.docx" a =...
  • 前段时间在写自动化工作脚本,需要把图片插入到docx的指定位置。 网上的资料比较杂,所以...import docxtpl from docx.shared import Mm import sys # 要编辑的docx文档模板路径 docx_path = sys.path[0] + r"\test.do
  • 我们使用Python的Python-docx库可以自动写入文档,但是如果大致是一样的内容,我们可以使用docxtpl库,这个库是基于python-docx库和jinja2写的,可以渲染模板.我们需要批量创建word文件时,使用docxtpl可以快速渲染出想要...
  • python自动生成Docx(docxtpl库)

    千次阅读 2019-11-27 21:18:00
    其他内容请点此处,下面只写docxtpl的功能代码。 # coding: utf-8 import web # 我们用的webpy框架 import StringIO form docxtpl import DocxTemplate def doctest(): tpl = DocxTemplate('E:/safe.doc...
  • 【基础】python-docxtpl包之-----图片

    千次阅读 2020-06-05 17:05:24
    python docxtpl包是需要word和代码联动的,所以我会将这两部分都贴出来。 需求 1. 循环插入图片 2. 宽高自适应 3. 图片居中(word标签居中即可) 实现一:循环插入图片 模板: 代码: from docxtpl ...
  • 前言: 今天的工作中遇到一个没接触过的需求, 需求是这样的, 把数据库中的数据读出来, 填充到docx文件...准备工作: pip install python-docx, pip install docxtpl(或者直接安装后者, 后者依赖前者, 会把前者也下载下
  • pip install docxtpl 使用:from docx import Document from docx.shared import Pt from docxtpl import DocxTemplate,InlineImage from win32com import client as wc 二. wc是用来转换成标准的DOCX文档格式的,...
  • python使用docxtpl库对图片进行替换

    千次阅读 2020-06-24 16:26:21
    docxtpl 一个很强大的包,其主要通过对docx文档模板加载,从而对其进行修改,我主要是用docxtpl对图片进行替换。 简单代码如下: import base64 from docxtpl import DocxTemplate pl = int(input('输出数字:'))...
  • 使用docxtpl生成巡检word(笔记留档用)
  • docxtpl的使用

    2021-03-17 11:04:18
    docxtpl的介绍 docxtpl 包可以加载docx格式的模板,来生成新的docx文件,通常用于生成docx报告。 安装 pip install docxtpl 使用 from docxtpl import DocxTemplate doc = DocxTemplate("my_word_template.docx") ...
  • from docxtpl import DocxTemplate import openpyxl def main1(): ###特别说明在填写路径时,要用到双\\,不能用文件属性里粘贴的单斜杠\路径,否则会报错 sSourceFile = "C:\\Users\\16606\\Desktop\\cq\\21....
  • docxtpl 装包顺序

    2021-10-11 14:15:54
    Markupsafe 2.0以上 Jinja2 six Python-docx 0.8.8以上 docxcompose docxtpl
  • 一般这种报错主要原因有2种,一种是内容出错,可以将... File "/usr/local/lib/python3.6/site-packages/docxtpl/__init__.py", line 358, in fix_tables extra_space = removed_width / len(columns_left) Zero...
  • 用Python根据模板批量生成含指定数据的word文档 ...当需要按规定格式向word文档写入数据时,可以使用docxtpl包。 可以参考的文章链接: 官方文档https://blog.csdn.net/meteor_cheng/article/details/8858...
  • python一个巨大的好处就是批处理文件,把重复的操作一键搞定,节省大量时间。 1、项目需求: 一个excel表一个word模板,某某学院发放新生入学新生通知书。 根据学生信息,每一个新生生成一个入学通知书。...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 366
精华内容 146
关键字:

docxtpl