Это кажется преднамеренным поведением 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
Ужасно, но делает всю работу за меня.При необходимости его можно расширить для поддержки нескольких столбцов *
.