Python ReportLab使用splitfirst / splitlast

我试图用ReportLab 2.2来创建PDF报告。
根据用户指南,

特殊表格样式[原文]

在任何样式命令中,第一行索引可以被设置为特殊字符串'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

这个功能是否打破了?或者我做错了什么? 如果后者,我做错了什么?


好吧,看起来好像我会回答我自己的问题。

首先,文档平坦的地方在于它的位置:“在任何样式命令中,第一行索引可以被设置为特殊字符串'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,所以帧和页面是相同的。


这似乎是ReportLab Table类中的一个错误。 除了DLJessup自己的回答之外,另一个解决方法是在1301行左右的Table._drawBkgrnd()修改导致错误的ReportLab代码。对于'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'; 如果我这样做,我会在这里发布其余的黑客。


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

在你的第一个例子中,你也将第二行索引设置为一个特殊的字符串。

不知道为什么其他两个不工作......你确定这是例外来自哪里吗?

链接地址: http://www.djcxy.com/p/41761.html

上一篇: Python ReportLab use of splitfirst/splitlast

下一篇: How to create an automatic Revision History table in Word 2007