使用jinja2操作word文档时,for循环如何不增加空白行

使用jinja2的for循环插入word文档时,会莫名奇妙多出很多空白行,百度中增加“-”符号控制空白行的操作我试过了,要不效果不对,要不就是会让word文档损坏,请问下还有其他操作方法吗,下面是我使用“-”符号后的操作图片

img

img

img

img

所以我到底该怎么做才能消除这些空白?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: jinja2的模板过滤器引用及自定义中的 一、jinja2模板过滤器 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • 过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。Jinja2中内置了许多过滤器,在这里可以看到所有的过滤器
  • 以下回答来自chatgpt:

    回答:

    首先,需要了解jinja2在word文档中的渲染原理。jinja2是一种模板语言,使用类似于python的语法,在渲染过程中会根据模板中的语法执行相应的操作,生成最终的文档。在word文档中,jinja2会将模板中的语法解析为xml标签,并将其插入到文档中,在生成文档时读取这些标签并生成相应的内容。

    针对您提供的问题,可能出现的原因有以下几点:

    1. 模板中for循环语法有误,导致生成的xml标签有误。
    2. xml标签中包含了多余的空格或换行符。
    3. word文档在显示xml标签时会自动添加空白行。

    针对这些可能出现的原因,可以尝试以下几种解决方案:

    1. 确认模板中的for循环语法正确无误,尝试使用jinja2的调试模式查看标签生成情况。

    例如模板中的for循环应该是这样的:

    {% for item in items %}
        <p>{{ item }}</p>
    {% endfor %}
    
    1. 在生成xml标签时,指定删除多余的空格或换行符。

    例如:

    {% for item in items -%}
        <p>{{ item }}</p>
    {%- endfor %}
    

    注意,这里使用了“-”符号指定在渲染时删除多余的空格或换行符。

    1. 使用python-docx库来读取生成的xml标签,并对文档中的空白行进行处理。具体操作可以参考以下代码:
    from docx import Document
    
    # 读取word文档中的内容
    doc = Document('example.docx')
    xml_content = ''
    for p in doc.paragraphs:
        xml_content += p._element.xml
    
    # 使用jinja2渲染xml标签
    from jinja2 import Template
    items = ['item1', 'item2', 'item3']
    template = Template('''{% for item in items -%}
        <w:p>
            <w:r>
                <w:t>{{ item }}</w:t>
            </w:r>
        </w:p>
    {%- endfor %}''')
    xml_result = template.render(items=items)
    
    # 将生成的xml标签插入到word文档中
    from lxml import etree
    root = etree.fromstring(xml_result)
    for element in root.iter():
        new_para = doc.add_paragraph('')
        new_para._element.append(deepcopy(element))
        new_para._element.rId = None
    
    # 删除空白行
    from docx.enum.text import WD_BREAK
    for p in doc.paragraphs:
        if p.text == '':
            p.insert_paragraph_before('')
        elif p.text.strip() == '':
            run = p.add_run()
            run.add_break(WD_BREAK.LINE)
            p.text = ''
    
    # 保存生成的文档
    doc.save('example_result.docx')
    

    这段代码将会读取一个名为“example.docx”的word文档,将其中的内容存储为xml形式,并使用jinja2渲染一个for循环标签,在将其插入到word文档中。最后,遍历所有的段落,将其中的空白行进行处理并保存生成的文档。

    希望以上解决方案对您有所帮助。如果还有其他问题,欢迎随时咨询。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^