2008-09-16 51 views
7

我想用ReportLab 2.2來創建PDF報告。
按照user guidePython ReportLab使用splitfirst/splitlast

特別TABLESTYLE的indeces [原文如此]

在任何樣式的命令的第一行索引可被設置爲特殊字符串「splitlast」或「splitfirst」表示的一個該樣式應該只用於分割表的最後一行或繼續的第一行。這允許在拆分周圍使用更好的效果分割表格。

我用幾個樣式元素,包括嘗試:

('TEXTCOLOR', (0, 'splitfirst'), (1, 'splitfirst'), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, 0), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, -1), colors.black) 

和這些都不似乎工作。首先生成與消息的類型錯誤:

TypeError: cannot concatenate 'str' and 'int' objects 

後兩者與消息產生TypeErrors:

TypeError: an integer is required 

這是功能簡單的壞還是我做錯了什麼?如果後者,我做錯了什麼?

回答

0

[...]在任何風格的命令第一行 指數可以被設置爲特殊字符串之一[...]

在你的第一個例子中,你正在設置第二個行索引也是一個特殊的字符串。

不知道爲什麼其他兩個不工作...你確定這是異常來自哪裏嗎?

+0

我已經有一段時間瞭解ReportLab的源代碼。看起來應該發生的情況是,隨着程序展開,起始行和結束行索引都被頁面起始處的行索引替換。如果這是正常工作,第二行索引應該沒有關係。 – DLJessup 2008-09-17 20:19:31

3

好吧,它看起來好像我會回答我自己的問題。

首先,文檔平坦的地方在於它的位置:「在任何樣式命令中,第一行索引可以設置爲特殊字符串'splitlast'或'splitfirst'中的一個以指示樣式應該僅用於拆分表的最後一行,或者延續的第一行。「在當前發行版中,「splitlast」和「splitfirst」行索引與TEXTCOLOR和BACKGROUND發行中的上述TypeErrors斷開。

基於閱讀源代碼,我懷疑只有tablestyle行命令(GRID,BOX,LINEABOVE和LINEBELOW)目前與'splitfirst'和'splitlast'行索引兼容。我懷疑所有的單元格命令都會與前面提到的TypeErrors斷開。

但是,我能夠通過繼承Table類並重寫onSplit方法來做我想要的。以下是我的代碼:

class XTable(Table): 
    def onSplit(self, T, byRow=1): 
     T.setStyle(TableStyle([ 
      ('TEXTCOLOR', (0, 1), (1, 1), colors.black)])) 

這樣做是將文本顏色黑色應用於每頁第二行的第一個和第二個單元格。 (第一行是一個頭,由表的repeatRows參數重複)。更準確地說,它是對每個幀的第一個和第二個單元執行此操作,但由於我使用SimpleDocTemplate,所以幀和頁面是相同的。

1

這似乎是ReportLab表類中的一個錯誤。這除了DLJessup's own answer另一種解決方法是修改是造成錯誤的ReportLab的代碼,在Table._drawBkgrnd(),周圍線1301「splitlast」,更改:

y0 = rowpositions[sr] 

到:

if sr == 'splitlast': 
    y0 = rowpositions[-2] # last value is 0. Second last is the one we want. 
else: 
    y0 = rowpositions[sr] 

這很容易在自己的代碼中完成,而不需要通過繼承Table來覆蓋ReportLab並覆蓋此方法。我沒有必要使用'splitfirst';如果我這樣做,我會在這裏發佈其餘的黑客。