我正在尝试在Reportlab中扩展表列(不是RML),我曾尝试设置colWidths像这样:
tab = Table(data, colWidths=["*", None, None, None, None, None])
如文档中所写,但第一列的大小不变(保留在“按内容缩放”上)。有没有办法在不指定固定大小的情况下将第一列拉伸到可用空间? (因为其他列 会根据某些参数动态变化)
答案 0 :(得分:0)
这似乎是Reportlab的故意行为,因为宽度计算代码表明:
def _calc_pc(V,avail):
'''check list V for percentage or * values
1) absolute values go through unchanged
2) percentages are used as weights for unconsu
3) if no None values were seen '*' weights are
set equally with unclaimed space
otherwise * weights are assigned as None'''
这意味着*
和None
不能在宽度列表中一起使用,这没有意义,因为那是如何使列伸展而另一列的大小要达到内容。无论如何,我最终编写了一个包装函数,该包装函数重新计算了所有内容:
def table_fix(data, cols, total):
table = Table(data, colWidths=cols)
res = list(cols)
val = table._cellvalues
style = table._cellStyles
while None in res:
idx = res.index(None)
width = 0
for i, vi in enumerate(val):
v = vi[idx]
s = style[i][idx]
nw = table._elementWidth(v, s) + s.leftPadding + s.rightPadding
if nw > width:
width = nw
res[idx] = width
table._colWidths = table._argW = res
return table
丑陋,但为我做这份工作。如果需要,可以扩展它以支持多个*
列。