如何使用 python docx 模板填充这个复杂的表?

问题描述 投票:0回答:1

好吧,我继续使用 python-docx-template。

我正在为一些表格制作模板,特别是这个:

我正在寻找的结果表是这样的(不考虑日期/fecha):

最初的想法是该表将接收来自实验室结果的数据,但立法可能会有所不同(结果可以通过决议或法令进行比较),我用字典制作了一些列表来填充表并将信息放入表中,但抛出一个错误,我正在研究,一切似乎都是这样,表以这种方式嵌套循环,并在尝试在立法列表中查找“cols”时生成错误。

这是代码,比任何东西都更清单:

from docxtpl import DocxTemplate

# Cargar plantilla
doc = DocxTemplate('template/prueba.docx')

# Parametros
puntos = ['EPO-ARD-DO1: ENTRADA PLANTA DE TRATAMIENTO ARD', 'EPO-ARD-DO2: SALIDA PLANTA DE TRATAMIENTO ARD']
codSample = ['MCS 17466', 'MCS 17465']

... Many lists ...

#  Sample list
norma2 = 'law name'
legis3 = [
    {'art 2.2.3.3.9.14' : 'N.E.', 'art 2.2.3.3.9.16' : 'N.E.', 'art 2.2.3.3.9.17' : 'N.E.', 'art 2.2.3.3.9.18' : 'N.E.'},
    {'art 2.2.3.3.9.14' : 'N.E.', 'art 2.2.3.3.9.16' : 'N.E.', 'art 2.2.3.3.9.17' : 'N.E.', 'art 2.2.3.3.9.18' : 'N.E.'},
    {'art 2.2.3.3.9.14' : 'N.E.', 'art 2.2.3.3.9.16' : 'N.E.', 'art 2.2.3.3.9.17' : 'N.E.', 'art 2.2.3.3.9.18' : 'N.E.'},
... more things ...
]


# extract articles of law
art_limi = legis3[0].keys()


# Context
context = {
    'puntos' : puntos,
    'cdSam' : codSample,
    'lab_results' : resultados,
    'norma' : norma2,
    'articulos' : art_limi,
    'legis' : legis3
}

doc.render(context)

# Guardar documento
doc.save('output/salidaPrueba2.docx')

这就是我得到的错误:

File "c:\xampp\htdocs\pythonDocx\prueba.py", line 132, in <module>
doc.render(context)
File "C:\Python\Python311\Lib\site-packages\docxtpl\template.py", line 368, in render
xml_src = self.build_xml(context, jinja_env)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python\Python311\Lib\site-packages\docxtpl\template.py", line 315, in build_xml
xml = self.render_xml_part(xml, self.docx._part, context, jinja_env)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python\Python311\Lib\site-packages\docxtpl\template.py", line 245, in render_xml_part
raise exc
File "C:\Python\Python311\Lib\site-packages\docxtpl\template.py", line 239, in render_xml_part
dst_xml = template.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python\Python311\Lib\site-packages\jinja2\environment.py", line 1301, in render
self.environment.handle_exception()
File "C:\Python\Python311\Lib\site-packages\jinja2\environment.py", line 936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "<template>", line 11, in top-level template code
File "C:\Python\Python311\Lib\site-packages\jinja2\environment.py", line 485, in getattr
return getattr(obj, attribute)
       ^^^^^^^^^^^^^^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'cols'

我正在考虑将一些数据作为结果列表的允许限制传递,但我不知道如何很好地适应标题。

我现在有点陷入困境,希望得到一些帮助来推动这张桌子的发展。

提前致谢。

好吧,当我尝试分离表格时,我得到了正确的渲染,我分离了表格以观察是否只有一个表格有问题或发生了什么,在该示例中,我将更改比较法则并获得良好的结果替代品。

对于单独的表来说效果很好,但重点是这种替换从查询开始就适用于表。

python python-3.x automation python-docx docxtpl
1个回答
0
投票

看最后一行,显然是:

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'cols'

这是错误的原因。

  1. 看Word代码:cols是lab_results元素的属性。

  2. lab_results 定义为名为 resultados 的变量的值。

  3. 但是我看不到名为 resultados 的变量的任何定义。 看起来你丢失了主变量!它发生了。

那么,你能自己检查一下这个错误吗?当然! 好的做法是使用 flake8 工具检查代码。

我帮你检查了你的代码,flake8 确认了我的建议:

sp.py:46:20: F821 undefined name 'resultados'
© www.soinside.com 2019 - 2024. All rights reserved.