【问题标题】:Python ReportLab use of splitfirst/splitlastPython ReportLab 使用 splitfirst/splitlast
【发布时间】:2008-09-16 23:52:04
【问题描述】:

我正在尝试将 Python 与 ReportLab 2.2 结合使用来创建 PDF 报告。
根据user guide

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

这个功能是被破坏了还是我做错了什么?如果是后者,我做错了什么?

【问题讨论】:

    标签: python reportlab


    【解决方案1】:

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

    首先,文档完全位于它的位置:“在任何样式命令中,第一行索引可以设置为特殊字符串之一 'splitlast' 或 'splitfirst' 以表明该样式应仅用于最后一个拆分表的第一行,或延续的第一行。”在当前版本中,“splitlast”和“splitfirst”行索引与前面提到的 TEXTCOLOR 和 Background 命令上的 TypeError 不同。

    根据阅读源代码,我怀疑只有表格样式的行命令(GRID、BOX、LINEABOVE 和 LINEBELOW)当前与“splitfirst”和“splitlast”行索引兼容。我怀疑所有单元格命令都因上述类型错误而中断。

    但是,我可以通过继承 Table 类并覆盖 onSplit 方法来做我想做的事。这是我的代码:

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

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

    【讨论】:

      【解决方案2】:

      这似乎是 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”;如果我这样做了,我会在这里发布其余的 hack。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 我有时间查看 ReportLab 的源代码。似乎应该发生的是,随着程序展开,开始行和结束行索引都被页面开头的行索引替换。如果这工作正常,第二行索引应该无关紧要。
        猜你喜欢
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 2022-08-04
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2017-04-09
        相关资源
        最近更新 更多