在Python ReportLab中循环遍历表格

3 投票
2 回答
2297 浏览
提问于 2025-04-16 23:38

我正在使用Python的reportlab模块创建一个表格。在这个表格中,我想根据某个单元格的值来循环设置不同的背景颜色。

为此,我想出了以下代码:

elements = []

table1 = [[34,27,35,35],
          [3,76,23,157],
          [13,137,15,75],
          [56,26,46,26]]




t1 = Table(table1)
for ii in range(len(table1)):
    for jj in range(len(table1)):
        if table1[ii][jj] <=50:
            ourcolor = colors.white
        elif table1[ii][jj] <=100:
            ourcolor = colors.skyblue
        elif table1[ii][jj] <=200:
            ourcolor = colors.green

        else:
            ourcolor = colors.white
        t1.setStyle(TableStyle([('BACKGROUND', (ii,jj), (ii,jj), ourcolor),
                                ('ALIGN', (0,0), (-1,-1), 'CENTER'),
                                ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                                ('BOX', (0,0), (-1,-1), 0.25, colors.black)
                                ]))

elements.append(t1)

但是,很多单元格仍然没有上色,还有一些单元格的颜色设置不正确,虽然有些是对的。我猜我的循环可能有问题,因为我不是一个很有经验的程序员。

任何帮助或建议都将非常感谢。

2 个回答

2

看起来table1就像是一个列表的列表。我觉得这段代码应该能满足你的需求,前提是问题出在你的循环上,而不是reportlab模块(我对这个模块不太熟悉)。

a=-1
for ii in table1:
  a = a+1
  b = -1 
  for jj in ii:
    b = b+1
    if jj <=50:
        ourcolor = colors.white
    elif jj <=100:
        ourcolor = colors.skyblue
    elif jj <=200:
        ourcolor = colors.green
    else:
        ourcolor = colors.white
    t1.setStyle(TableStyle([('BACKGROUND', (a,b), (a,b), ourcolor),
                              ('ALIGN', (0,0), (-1,-1), 'CENTER'),
                              ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                              ('BOX', (0,0), (-1,-1), 0.25, colors.black)
                              ]))
3

我对ReportLab了解得不够多,所以不能确定,但在这种编码中,一个常见的问题是坐标轴可能搞错了。比如,像这样索引:table1[ii][jj],这里的ii代表的是y轴(行),而jj代表的是x轴(列),所以你需要把x和y传给ReportLab时,应该是jj, ii。检查一下你的输出,看看在给单元格上色时,行和列是否搞错了。

另外,注意你的双重循环是对同一个范围循环两次,这样做只在你的表格是正方形的时候有效。如果你的表格变成了长方形,某个循环的范围就会出错。

撰写回答