python使用docxtpl库制作word模板及多个模板内容合并

        docxtpl( python-docx-template)是基于 python-docx 的文档模板引擎,使用非常方便易懂。与 Python 的 Jinja2 模板语法结合使用,通过在 Word 模板文件中设置占位符{{}},并在 Python 里传入一个字典,最终生成一个包含动态数据填充结果的 Word 文档。

1. 安装

pip install docxtpl

2. 使用占位符表示需要替换的内容

(1)第一步:制作word模板

如图所示,将模板中要替换的内容用占位符{{变量名}}来替代,变量名应与python传入的一致。

(2)第二步:编写代码
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
import datetime

# 加载模板文件
tpl = DocxTemplate('pythondoc/templates/模板.docx')  

image1_path = 'pythondoc/pics/bus1.jpg'
image2_path = 'pythondoc/pics/bus2.jpg'

time_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

context = {
    '姓名': '张三', 
    '身高': '180cm',
    '年龄': '18',
    '性别': '男',
    '时间': time_str,
    '图片1': InlineImage(tpl, image1_path, width=Mm(40)),
    '图片2': InlineImage(tpl, image2_path, width=Mm(40))
    }
tpl.render(context)
# 保存生成的文档
tpl.save('pythondoc/templates/output.docx')
print("替换完成,已生成 output.docx")
(3)第三步:查看生成结果

3. 模板中包含循环内容,如表格

如以上体检报告模板中,在末尾添加一个表格用来记录各项体检结果

(1) 第一步 修改模板:在模板中增加表格

请注意:

        在循环开始的地方加{%for result in results%},results应该与python中传入的变量名一致;

        在循环结束的地方加{%endfor%}

  (2) 第二步:编写代码
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
import datetime

# 加载模板文件
tpl = DocxTemplate('pythondoc/templates/模板.docx')  

image1_path = 'pythondoc/pics/bus1.jpg'
image2_path = 'pythondoc/pics/bus2.jpg'

time_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

context = {
    '姓名': '张三', 
    '身高': '180cm',
    '年龄': '18',
    '性别': '男',
    '时间': time_str,
    '图片1': InlineImage(tpl, image1_path, width=Mm(40)),
    '图片2': InlineImage(tpl, image2_path, width=Mm(40)),
    'results': [
        {'检查项':'检查项1', '检查结果':'正常', '参考值': '80-100'},
        {'检查项':'检查项2', '检查结果':'正常', '参考值': '45-55'},
        {'检查项':'检查项3', '检查结果':'异常', '参考值': '45-55'}
        ]
    }
tpl.render(context)

# 保存生成的文档
tpl.save('pythondoc/templates/output.docx')
print("替换完成,已生成 output.docx")
(3) 第三步:查看生成结果

4. 多个模板内容合并成一个文档

(1) 第一步:修改模板

        其实,使用起来跟生成表格是一样的,只是标记开始的位置不一样。

        使用for循环标记要开始重复生成的位置,如下图。想从哪开始重复就将{% for result in results %}写在哪,这个占位符标记着开始循环的位置。

        在结束的位置写上{%endfor%},标记循环结束的地方。因为我希望更清晰美观一点,于是在for循环结束之前加了一行空白内容。

(2)第二步:编写代码
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
import datetime

# 加载模板文件
tpl = DocxTemplate('pythondoc/templates/模板v2.docx')  

image1_path = 'pythondoc/pics/bus1.jpg'
image2_path = 'pythondoc/pics/bus2.jpg'

time_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

context = {
    'results':[
        {
            '姓名': '张三', 
            '身高': '180cm',
            '年龄': '18',
            '性别': '男',
            '时间': time_str,
            '图片1': InlineImage(tpl, image1_path, width=Mm(40)),
            '图片2': InlineImage(tpl, image2_path, width=Mm(40))
            },
            {
            '姓名': '李四', 
            '身高': '160cm',
            '年龄': '18',
            '性别': '女',
            '时间': time_str,
            '图片1': InlineImage(tpl, image1_path, width=Mm(40)),
            '图片2': InlineImage(tpl, image2_path, width=Mm(40))
            }
               ]
    
    }
tpl.render(context)

# 保存生成的文档
tpl.save('pythondoc/templates/output.docx')
print("替换完成,已生成 output.docx")
(3) 第三步:查看生成结果

5. 格式问题

        生成内容的格式与占位符的格式是一致的,所以只要调整好占位符的格式就行。

6. 一次错误的尝试

        最开始没有在模板中使用for循环,想着用docx将产生的新模板的内容全部拼接到产生的第一个文档或某个固定文档中,代码如下

main_doc = Document('pythondoc/templates/模板v2.docx')
tem_doc = tpl.docx
for element in tem_doc.element.body:
    main_doc.element.body.append(element)

        最后发现,使用该方式,文字内容全都拼接过去了,甚至表格也过去了,但是图片一直都是第一次生成的图片,也就是说明明是两张不一样的图片,InlineImage(tpl, image1_path, width=Mm(40))中设置的路径也不一样,但是图片都是第一张,问AI说是docx对于图片有缓存机制。

        总之,docxtpl太香啦,代码很简单,可以很方便地替换模板内容,生成循环内容,还不用费劲去调格式。

### 回答1: Python docxtemplate是一款用于处理Word文档的Python使用docxtemplate可以方便地在Python中生成基于Word的文档。而垂直合并表格是docxtemplate中常见的操作,下面我们就来介绍下如何在docxtemplate中垂直合并表格。 在docxtemplate中,我们可以通过插入自定义标记来动态地生成Word文档。比如,要合并两个表格,我们可以在docx文档的相应位置插入以下标记: ```python {# TableStart:table1 #} {# TableEnd:table1 #} {# TableStart:table2 #} {# TableEnd:table2 #} ``` 其中,table1和table2是表格的名称,可以用任何你喜欢的名称代替。然后,在docxtemplate调用时,我们可以通过渲染模板来将两个表格合并成一个大表格: ```python from docxtemplate import DocxTemplate from docxtpl import InlineImage doc = DocxTemplate("template.docx") # 给table1和table2赋值 table1 = [ {"col1": "AAA", "col2": "BBB", "col3": "CCC"}, {"col1": "DDD", "col2": "EEE", "col3": "FFF"} ] table2 = [ {"col1": "111", "col2": "222", "col3": "333"}, {"col1": "444", "col2": "555", "col3": "666"} ] # 渲染模板 context = {"table1": table1, "table2": table2} doc.render(context) # 合并table1和table2 doc.apply_vertical_merge("table1") doc.apply_vertical_merge("table2") # 保存文档 doc.save("output.docx") ``` 在渲染模板后,我们调用apply_vertical_merge()函数将两个表格垂直合并。这样,我们就可以得到一个大表格,其中包含了table1和table2两个表格的数据。当然,如果需要合并更多的表格,我们也可以使用相同的方法,只需要在模板中添加相应的标记即可。 总的来说,使用docxtemplate垂直合并表格非常简单,只需要在模板中添加相应的标记,然后在渲染模板后调用apply_vertical_merge()函数即可。这种方法不仅方便快捷,而且可以大大提高表格的生成效率。 ### 回答2: docxtemplate是一个用于Python编程语言模板引擎,用于生成Word文档。它支持在Word文档中创建和编辑表格,还能够实现表格的垂直合并。 在使用docxtemplate创建一个表格时,可以首先设置表格的基本属性,例如列数、行数、列宽、边框等。然后,利用Python的循环语句和条件判断语句来动态生成表格中的内容。 要实现表格的垂直合并,需要使用docxtemplate提供的merge_blocks()函数。该函数将根据模板中指定的标记,自动将相邻的行合并成单个单元格,从而实现垂直合并。 下面是用docxtemplate实现表格垂直合并的代码示例: from docxtpl import DocxTemplate # 创建Word文档对象 doc = DocxTemplate("template.docx") # 设置表格的属性 table = [ {"name": "张三", "subject": "语文", "score": 90}, {"name": "张三", "subject": "数学", "score": 80}, {"name": "李四", "subject": "语文", "score": 85}, {"name": "李四", "subject": "数学", "score": 90}, ] # 渲染表格内容 context = {"table": table} # 将相邻的同名单元格合并 doc.merge_blocks("table") # 保存文档 doc.save("output.docx") 在上面的代码中,我们创建了一个包含四行三列的表格,并在表格中使用模板引擎的标记。然后,使用docxtemplate提供的merge_blocks()函数将相邻的同名单元格合并,最终输出结果保存为output.docx文件。 总之,使用docxtemplate可以方便实现Word文档中的表格垂直合并,使得生成的文档内容更加美观规范。 ### 回答3: Python docxtemplate是Python的一个,用于生成Microsoft Word DOCX文档,可以通过该实现自动化生成Word文档的功能,该还提供了垂直合并表格的功能。在实现垂直合并表格的操作时,需要使用到docxtemplater中的Container对象。具体的实现步骤如下: 1. 通过docxtemplater中的DocxTemplate类创建一个模板对象,然后使用Container对象实例化一个垂直容器。 2. 使用Container对象实例化一个垂直表格容器,并将容器添加到垂直容器中。 3. 在垂直表格容器中添加列标题和行数据。 4. 使用Container对象实例化一个新的垂直表格容器,并将该容器添加到垂直容器中。 5. 在新的垂直表格容器中添加列标题和行数据,这些行数据的列数需要和第一个垂直表格容器的列数相同。 6. 渲染模板并保存生成的DOCX文档。 下面是一个实现垂直合并表格的Python示例代码: ``` from docxtpl import DocxTemplate, RichText, InlineImage, BaseTemplate from docxtpl.container import Container tpl = DocxTemplate("template.docx") def merge_vertical_tables(): # 实例化一个垂直容器 v_container = Container([]) # 实例化第一个垂直表格容器 v_table1 = Container([]) v_table1.add_row(["列1", "列2", "列3"]) v_table1.add_row([1, 2, 3]) v_table1.add_row([4, 5, 6]) # 将第一个垂直表格容器添加到垂直容器中 v_container.add(v_table1) # 实例化第二个垂直表格容器 v_table2 = Container([]) v_table2.add_row(["列1", "列2", "列3"]) v_table2.add_row([7, 8, 9]) v_table2.add_row([10, 11, 12]) # 将第二个垂直表格容器添加到垂直容器中 v_container.add(v_table2) # 将垂直容器添加到模板中 tpl.render({"table_container": v_container}) tpl.save("merged_table.docx") merge_vertical_tables() ``` 在实现过程中,需要注意多个垂直表格容器的列数需要保持一致才能进行垂直合并。由此可见,python docxtemplate不仅提供了生成Word文档的功能,还可以根据需求,实现更加丰富的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值