Python ReportLab使用splitfirst / splitlast

时间:2008-09-16 23:52:05

标签: python reportlab

我正在尝试使用Python和ReportLab 2.2来创建PDF报告 根据{{​​3}},

  

Special TableStyle Indeces [sic]

     

在任何样式命令中,第一行索引可以设置为特殊字符串'splitlast'或'splitfirst'之一,以指示该样式应仅用于拆分表的最后一行,或者第一行延续。这允许在分割周围分割具有更好效果的表格。

我尝试过使用多种样式元素,包括:

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

并且这些似乎都不起作用。第一个生成带有消息的TypeError:

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

后两个生成带有消息的TypeErrors:

TypeError: an integer is required

此功能是否被破坏或我做错了什么?如果是后者,我做错了什么?

3 个答案:

答案 0 :(得分: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,因此帧和页面是相同的。 / p>

答案 1 :(得分:1)

这似乎是ReportLab Table类中的一个错误。除了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';如果我这样做,我会在这里公布其余的黑客。

答案 2 :(得分:0)

  

[...]在任何样式命令第一行   index 可以设置为特殊字符串之一[...]

在第一个示例中,您还将第二个行索引设置为特殊字符串。

不确定为什么其他两个不起作用......你确定这是异常的来源吗?