如何显示溢出 table 单元格的块?

How display block that overwflows table cell?

我使用 Apache™ FOP(格式化对象处理器)呈现 table。我想显示一个固定高度和宽度的黄色块。块底部应与行底部位于同一位置。块应该溢出单元格,块不应该使单元格变大。我宁愿不使用 rowspan。知道如何在 FOP 中制作块溢出单元格吗?

具有实际和预期输出的图像:

方法 1:我已经尝试过 rowspan=2。 Table 看起来符合预期。但是代码太复杂了。它需要额外的逻辑来计算我需要跨越哪些行。

方法二:

<fo:table-row>
<fo:table-cell><fo:block>item4</fo:block></fo:table-cell>
<fo:table-cell display-align="after">
    <fo:block-container overflow="visible">
        <fo:block background-color="yellow" padding-top="1.5mm" padding-bottom="1.5mm">
            Thanks
        </fo:block>
    </fo:block-container>
</fo:table-cell>

我希望 overflow="visible" 能解决问题,但事实并非如此。

(预防性披露:我是一名 FOP 开发人员,虽然现在不太活跃)

我认为您的方法 #1(即使用 number-rows-spanned)是正确的方法,因为它提供了跨不同格式化程序的最便携的解决方案。

无论如何,如果你想使用 "simpler" 技巧,你可以在特殊的黄色块中使用负数 space-before

<fo:table width="100%" table-layout="fixed">
    <fo:table-column column-width="50%"/>
    <fo:table-column column-width="50%"/>
    <fo:table-body>
        <fo:table-row>
            <fo:table-cell border="1pt solid #000000"><fo:block>orange 1</fo:block></fo:table-cell>
            <fo:table-cell border="1pt solid #000000"><fo:block></fo:block></fo:table-cell>
        </fo:table-row>
        <fo:table-row>
            <fo:table-cell border="1pt solid #000000"><fo:block>orange 2</fo:block></fo:table-cell>
            <fo:table-cell border="1pt solid #000000"><fo:block></fo:block></fo:table-cell>
        </fo:table-row>
        <fo:table-row>
            <fo:table-cell border="1pt solid #000000"><fo:block>orange 3</fo:block></fo:table-cell>
            <fo:table-cell border="1pt solid #000000">
                <fo:block space-before="-12.8pt" space-before.conditionality="retain" background-color="yellow" padding-top="4pt" padding-bottom="4pt" font-size="16pt">Thanks</fo:block>
            </fo:table-cell>
        </fo:table-row>
    </fo:table-body>
</fo:table>
  • space-before 必须是 普通 方块高度与 特殊 方块高度之差(如果所有长度都以点数表示会更容易,就像我在示例中所做的那样):在这种情况下 (12 * 1.2) - (16 * 1.2 + 4 + 4) = -12.8
  • 需要
  • space-before.conditionality="retain" 以避免 space 被丢弃(因为它位于单元格的开头)
  • 只有当 normalspecial 块都产生一行文本时,这个肮脏的技巧才能正常工作
  • 使用 FOP 1.1 和 FOP 中继测试

总之,您可能能够避免使用跨行单元格,但它不会简单得多,而且肯定是一个不太通用的解决方案。