在Python reportlab中循环遍历表格

3
我正在使用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个回答

3
我对ReportLab了解不够,无法确定,但在这种编程中常见的问题是轴被交换了。例如,像这样索引:table1[ii][jj] 意味着 ii 是 y 轴(行),jj 是 x 轴(列),因此您必须向 ReportLab 提供 jj, ii 作为 x 和 y。检查一下在着色单元格时,是否将行和列交换了。
此外,请注意,您的双重循环两次循环相同的范围,这仅适用于您的表是正方形的情况。如果您的表甚至变得不是正方形,您将会在其中一个循环上获得错误的范围。

非常感谢,我也想谈谈这个方形问题。在测试非方形表格时,我遇到了这个问题,但有什么修复建议吗?谢谢。 - Sam Creamer
你只需要获取行的长度: for jj in range(len(table1[0])) - Ned Batchelder
结果证明,最后我所要做的就是交换 jj 和 ii!非常感谢。 - Sam Creamer

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)
                              ]))

嗯...当我尝试这个时,出现了一个错误,显示:TypeError: list indices must be integers, not list。我不确定应该如何适当地修复它。这是否意味着这是reportlab模块的问题?谢谢。 - Sam Creamer
不,我没有注意到使用的坐标系。在我的代码中,jj指向一个列表,而在你的原始代码中,由于使用了range,它是一个整数(我其实一直在想为什么你会使用range)。如果我没记错的话,左上角的第一个数字是“0,0”,对吧?--> 在坐标系的上下文中。 - Sinthet
是的,抱歉我忘了提到。这个特定表格的顶行将是0,0 0,1 0,2 0,3。我想这就是所有这些中最棘手的部分。 - Sam Creamer
虽然不太优雅,但如果你想使用我的代码,你可以使用两个变量作为计数器。我已经进行了编辑,将其中一个指向x坐标,另一个指向y坐标。 - Sinthet
我找到了一个更简单的解决方法,原来我只需要交换一些x和y的值,因为坐标系的问题,现在它已经可以工作了!非常感谢。 - Sam Creamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接