在Reportlab中拉伸表列

2024-05-13 13:01:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Reportlab(不是RML)中拉伸表列,我尝试过如下设置colwidth:

tab = Table(data, colWidths=["*", None, None, None, None, None])

正如文档中所写,但是第一列的大小没有改变(它保持在“内容大小”上)。是否有任何方法可以使第一列在不指定固定大小的情况下拉伸到可用空间?(因为其他列根据某些参数动态变化)


Tags: 方法文档none内容data参数table空间
1条回答
网友
1楼 · 发布于 2024-05-13 13:01:57

这似乎是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

很难看,但我能胜任。如果需要,它可以扩展为支持多个*列。你知道吗

相关问题 更多 >