微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Python (DocxTemplate, Jinja2) 在模板 Word 中填充表格

如何解决使用 Python (DocxTemplate, Jinja2) 在模板 Word 中填充表格

我正在尝试使用 DocxTemplate 在 Word 中填充 Python 表格,但我有一些问题无法正确完成。我想用2个字典来填充1个表中的数据,如下图。

Table to fill

2个字典循环填写,最后我写了模板文档。 创建字典的输入文档是用 sql 编写的数据库提取。 我的主要问题是当我想用我在 2 个不同词典中的数据填充表格时。 在下面的代码中,我将举例说明其中包含值的 2 个字典。

# -*- coding: utf8 -*-
#
#
from docxtpl import DocxTemplate                        
if __name__ == "__main__":
    document = DocxTemplate("template.docx")
    DicoOccuTable = {'`num_carnet_adresses`': '`annuaire_telephonique`\n`carnet_adresses`\n`carnet_adresses_complement','`num_eleve`': '`CFA_apprentissage_ctrl_coherence`\n`CFA_apprentissage_ctrl_examen`}
    DicoChamp = {'`num_carnet_adresses`': 72,'`num_eleve`': 66}
    template_values = {}
    #
    template_values["keys"] = [[{"name":cle,"occu":val} for cle,val in DicoChamp.items()],[{"table":vals} for cles,vals in DicoOccuTable.items()]]
    # 
    document.render(template_values)
    document.save('output/' + nomTable.replace('`','') + '.docx')  

结果是创建了表的两行,但其中没有写入任何内容... 我想补充一点,我在 Python 上工作才 1 周,所以我觉得我没有正确管理这里的不同对象。 如果您有任何建议可以帮助我,我将不胜感激!

我把创建字典的循环放在这里,它可以帮助你理解为什么我编码错误:)

for c in ChampList:
        with open("db_reference.sql","r") as f:
            listTable = []
            line = f.readlines()
            for l in line:
                if 'CREATE TABLE' in l:
                    begin = True
                    linecreateTable = l
                    x = linecreateTable.split()
                    nomTable = x[2]
                elif c in l and begin == True:
                    listTable.append(nomTable)
                elif ') ENGINE=MyISAM DEFAULT CHARSET=latin1;' in l:    
                    begin = False
            nbreOccu=len(listTable)
            Tables = "\n".join(listTable)
            DicoChamp.update({c:nbreOccu})
            DicoOccuTable.update({c:Tables})
            # DicoChamp = {c:nbreOccu}
            template_values = {}

非常感谢!

解决方法

我终于找到了解决这个问题的办法。这里是。 我没有使用 2 个词典,而是用这种结构创建了 1 个词典:

Dico = { Champ : [Occu,Tables] }

创建表格的完整代码如下:

from docxtpl import DocxTemplate 
document = DocxTemplate("template.docx")
template_values = {}
Context = {}
for c in ChampList:
    listTable = []
    nbreOccu = 0
    OccuTables = []
    with open("db_reference.sql","r") as g:
        listTable = []
        ligne = g.readlines()
        for li in ligne:
            if 'CREATE TABLE' in li:
                begin = True
                linecreateTable2 = li
                y = linecreateTable2.split()
                nomTable2 = y[2]
            elif c in li and begin == True:
                listTable.append(nomTable2)
            elif ') ENGINE=MyISAM DEFAULT CHARSET=latin1;' in li:    
                begin = False
            elif '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;' in li:
                nbreOccu=len(listTable)
                inter = "\n".join(listTable)
                OccuTables.append(nbreOccu)
                OccuTables.append(inter)
                ChampNumPropre = c.replace('`','')
                Context.update({ChampNumPropre:OccuTables})
            else:
                continue
    template_values["keys"] = [{"label":cle,"cols":val} for cle,val in Context.items()]
# 
document.render(template_values)
document.save('output/' + nomTable.replace('`','') + '.docx') 

我使用了一个具有以下结构的表格:

enter image description here

希望你能在这里找到答案并祝你好运!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。