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

ws51t4hk  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(147)

好吧,我继续使用python-docx-template。
我正在为一些表格制作模板,特别是这一个:

我正在寻找的结果表是这样的(撇开日期/fecha):

最初的想法是表将从实验室结果接收数据,但立法可能会有所不同(结果可以通过决议或法令进行比较),我用字典做了一些列表来填充表,并将信息放入表中,但抛出了一个错误,我正在研究,一切似乎都以这种方式嵌套表循环,并在试图寻找'legis'列表时产生错误。
这是代码,它比任何东西都更列表:

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'

我在考虑将一些数据作为允许的限制传递给结果列表,但我不知道如何很好地适应标题。
我现在有点被卡住了,如果有人能帮我把table往前挪一挪,我会很感激的。
先谢了。
好吧,当我试图分离的表,我得到正确的渲染,我分离的表,看看如果只有一个表有问题或发生了什么,在这个例子中,我会改变比较的法律,并在替换获得良好的结果.

对于单独的表来说是很好的工作,但关键是这种替换从查询开始就对表起作用。

2izufjch

2izufjch1#

看最后一行,很明显:

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

这是错误的原因。
1.看看Word code:是lab_results元素的属性。

  1. lab_results定义为变量resultados的值。
    1.**但是我看不到任何名为resultados的变量的定义。**看起来你丢失了你的主变量!它发生.
    那么,你能自己去查一下这个错误吗?当然!好的做法是用flake 8工具检查代码。
    我检查了你的代码,flake 8证实了我的建议:
sp.py:46:20: F821 undefined name 'resultados'

相关问题