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)

但是,许多单元格仍然没有着色,其中许多着色不正确,但其中一些是正确的。我假设我的循环有问题,因为我不是一个非常有经验的程序员。

任何帮助或想法将不胜感激。

4

2 回答 2

3

我对 ReportLab 知之甚少,无法确定,但这种编码的一个常见问题是轴被交换了。例如,像这样的索引:table1[ii][jj]意味着它ii是 y 轴(行)和jjx 轴(列),因此您必须将 x 和 y 提供给 ReportLab 作为jj, ii. 检查您的输出是否在为单元格着色时交换了行和列。

另外,请注意,您的双循环在同一范围内循环了两次,这仅因为您的桌子是方形的。如果您的桌子甚至变成非方形,您的循环之一就会出现错误的范围。

于 2011-08-15T18:03:28.950 回答
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)
                              ]))
于 2011-08-15T18:06:57.227 回答