如何解决使用 Python (DocxTemplate, Jinja2) 在模板 Word 中填充表格
我正在尝试使用 DocxTemplate 在 Word 中填充 Python 表格,但我有一些问题无法正确完成。我想用2个字典来填充1个表中的数据,如下图。
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')
我使用了一个具有以下结构的表格:
希望你能在这里找到答案并祝你好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。