2011-08-15 16 views
3

我使用python模塊reportlab創建一個表。在這個表格中,我想循環使用並根據任何特定單元的值具有不同的背景顏色。在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) 

但是,許多細胞仍然沒有顏色的,其中許多人被錯誤地着色,但是他們中的一些是正確的。我假設我的循環出了問題,因爲我不是一個非常有經驗的程序員。

任何幫助或想法將不勝感激。

回答

3

我對ReportLab知之甚少,但是在這種類型的編碼中常見的問題是軸交換。例如,像這樣索引:table1[ii][jj]意味着ii是y軸(行),而jj是x軸(列),因此您必須將0123和的x和y提供給ReportLab。檢查您的輸出是否在着色單元格時交換了行和列。

此外,請注意,您的雙循環循環兩次相同的範圍,這只是因爲你的桌子是方形的。如果你的表格甚至變爲非方形,你的循環中會出現錯誤的範圍。

+0

非常感謝,我也打算談論這個廣場問題。我在用非方形表格測試時遇到過這個問題,但是有關於解決這個問題的任何建議?謝謝 –

+0

你只需要得到該行的長度:'對於範圍內的jj(len(table1 [0]))' –

+0

謝謝!我認爲我現在走在正確的軌道上 –

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

非常感謝!我現在就試試這個! –

+0

沒問題,我希望它能正常工作:) – Sinthet

+0

hmmmm ....當我嘗試這個時,我得到一個錯誤,說:TypeError:列表索引必須是整數,而不是列表。我不確定適當的解決辦法是什麼。這是否意味着它是reportlab模塊的問題?謝謝 –