7

我正在尝试将 Python 与 ReportLab 2.2 一起使用来创建 PDF 报告。
根据用户指南

特殊 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:

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

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

TypeError: an integer is required

这个功能是简单地坏了还是我做错了什么?如果是后者,我做错了什么?

4

3 回答 3

3

好吧,看来我要回答我自己的问题了。

首先,文档完全位于它读取“在任何样式命令中,第一行索引可以设置为特殊字符串之一'splitlast'或'splitfirst'以指示该样式应仅用于a的最后一行拆分表,或延续的第一行。” 在当前版本中,“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)]))

这样做是将文本颜色黑色应用于每页第二行的第一个和第二个单元格。(第一行是表头,由 Table 的 repeatRows 参数重复。)更准确地说,它对每个框架的第一个和第二个单元格执行此操作,但由于我使用的是 SimpleDocTemplate,因此框架和页面是相同的。

于 2008-09-18T17:46:36.087 回答
1

这似乎是 ReportLab Table 类中的一个错误。除了DLJessup 自己的答案之外,另一个解决方法是修改导致错误的 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”;如果我这样做,我会在这里发布其余的黑客攻击。

于 2010-04-12T16:52:07.013 回答
0

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

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

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

于 2008-09-17T00:40:54.080 回答