Reportlab 错误:“表格”对象没有属性“_colpositions”

Bev*_*ock 5 python reportlab python-3.x

我正在尝试从用户指南中自学 reportlab。我需要创建的文档只是需要放在页面上特定位置的格式化文本。在以下代码段中,table_data 是一个包含 3 个字符串的列表。我将 Table 作为 pdfTable 导入,因为我的应用程序有一个 Table 类。

首先,我试过这个:

top_row = pdfTable(table_data, colWidths=(3*inch, 3*inch, inch))
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

Traceback:
File "C:\Python33\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in splash_page
  86.                generate_signup_sheets()
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in generate_signup_sheets
  354.         top_row = pdfTable(table_data, colWidths=(3*inch, 3*inch, inch))
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in __init__
  253.                 raise ValueError("%s data error - %d columns in data but %d in column widths" % (self.identity(),ncols, len(colWidths)))
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in identity
  332.                     v = cv[i][j]

Exception Type: IndexError at /index.html
Exception Value: list index out of range
Run Code Online (Sandbox Code Playgroud)

由于看起来问题出在列宽上,并且文档说 colWidths 是可选的,因此我尝试了以下操作:

top_row = pdfTable(table_data)
Run Code Online (Sandbox Code Playgroud)

导致此错误的原因:

Traceback:
File "C:\Python33\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in splash_page
  86.                generate_signup_sheets()
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in generate_signup_sheets
  355.         top_row.drawOn(p, 0.75*inch, 0.5*inch)
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\flowables.py" in drawOn
  110.         self._drawOn(canvas)
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\flowables.py" in _drawOn
  91.         self.draw()#this is the bit you overload
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in draw
  1363.         self._drawBkgrnd()
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in _drawBkgrnd
  1386.         colpositions = self._colpositions

Exception Type: AttributeError at /index.html
Exception Value: 'Table' object has no attribute '_colpositions'
Run Code Online (Sandbox Code Playgroud)

reportlab 文档中的示例都没有显示实际使用的表。

在此先感谢您的帮助。

编辑以添加仍然失败的可执行代码:

import os
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.platypus import Table as pdfTable

filename = os.path.join(BASE_DIR, 'pdf_test_%s.pdf' %
                        ( datetime.now().strftime('%d-%b-%Y %H-%M')))

p = canvas.Canvas(filename, pagesize=letter, bottomup=1)
table_data = [['a', 'b', 'c'], ['d', 'e', 'f']]
top_row = pdfTable([table_data])    #, colWidths=(3*inch, 3*inch, inch))
top_row.drawOn(p, 0.75*inch, 0.5*inch)
p.showPage()
p.save()
Run Code Online (Sandbox Code Playgroud)

Foo*_*chu 8

我认为问题在于您只是传递了一个列表。Table想要一个列表列表,例如一个二维数组。从用户指南:

data 参数是一系列单元格值序列,每个值都应该可以使用 str 函数转换为字符串值,或者应该是 Flowable 实例(例如 Paragraph)或此类实例的列表(或元组)。

如果您只有一行,则将该行封装到另一个列表中并将其传递给 Table。如果这不起作用,请发布一个最小且可执行的代码示例。

PS 在用户指南的第 77 页是Table-class 的一个简单示例

更新 现在我明白了。您正在使用Flowable通常应该通过鸭嘴兽布局引擎的 a 与DocTemplate. 这将在第 5 章详细解释。您使用手动方式直接在画布上绘制,因此您还必须编写“自己的”布局引擎。在这种情况下,你首先必须使用wrapOn您的方法Table。我真的不知道为什么,但是作为参数传递的大小似乎并不重要。如果它不起作用,请尝试使用这些值。这是我调整后的代码版本:

from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.platypus import Table as pdfTable

filename = 'pdf_test.pdf'
p = canvas.Canvas(filename)
table_data = [['a', 'b', 'c'], ['d', 'e', 'f']]
top_row = pdfTable(table_data)
w, h = top_row.wrapOn(p, 0, 0)
top_row.drawOn(p, 0.75*inch, 0.5*inch)
p.showPage()
p.save()
Run Code Online (Sandbox Code Playgroud)