【问题标题】:Looping through a table in python reportlab循环遍历python reportlab中的表
【发布时间】:2011-08-15 17:59:31
【问题描述】:

我正在使用 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)

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

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

【问题讨论】:

    标签: python loops for-loop reportlab


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,我也想说说这个平方问题。我在用非方桌进行测试时经历过,但是有什么解决方法的建议吗?谢谢
    • 只需要获取行的长度:for jj in range(len(table1[0]))
    • 原来,我最后只需要切换 jj 和 ii!非常感谢
    【解决方案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)
                                  ]))
    

    【讨论】:

    • hmmmm....当我尝试这个时,我得到一个错误,上面写着:TypeError:列表索引必须是整数,而不是列表。我不确定对此有什么适当的解决方法。这是否意味着报告实验室模块有问题?谢谢
    • 不,我没有注意到使用的坐标系。在我的代码中, jj 指向一个列表,而在你的原始代码中,它是一个整数,因为范围(我想知道你为什么实际上使用范围)。如果我是正确的,左上角的第一个数字是“0,0”对吗? --> 在坐标系的上下文中。
    • 是的,对不起,我忘了提。此特定表的第一行将是 0,0 0,1 0,2 0,3。我想这就是所有这一切的棘手部分
    • 虽然不优雅,但如果你想使用我的代码,你可以使用两个变量作为计数器。我已经编辑了它,a 指向 x 坐标,b 指向 y 坐标。
    • 我找到了一个更简单的解决方法,结果我所要做的就是交换一些 x 和 y 值,因为坐标系的存在,我现在就可以使用了!非常感谢
    猜你喜欢
    • 2018-10-26
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多