如何让XSLFO表格中一列单元格起始位置对齐另一列末尾
FO表格多列对齐问题处理
我有一个包含3列的<fo:table/>,第1列显示编号,第2列内容为<fo:block><fo:inline>text</fo:inline><fo:leader/></fo:block>,第3列内容为嵌套的<fo:block>重复结构。当第2列文本过长自动换行时,希望第3列的单元格起始位置与第2列单元格的末尾对齐。
原显示效果
1. short text table cell column 2 ............. table cell column 3 continue 2. loooooooooooong text table cell table cell column 3 column 2 ................................... continue
期望效果
2. loooooooooooong text table cell column 2 ................................... table cell column 3 continue
用户代码
<xsl:template match="a"> <fo:table> <fo:table-column column-width="5%"/> <fo:table-column column-width="60%"/> <fo:table-column column-width="35%"/> <fo:table-body> <fo:table-row> <fo:table-cell> <fo:block> <xsl:apply-templates select="." mode="numbering"/> </fo:block> </fo:table-cell> <fo:table-cell> <fo:block display-align="after" text-align-last="justify"> <xsl:apply-templates select="b"/> <fo:leader leader-pattern="dots" leader-pattern-width="1mm" leader-length.minimum="2mm" keep-with-next.within-page="always"/> </fo:block> </fo:table-cell> <fo:table-cell> <xsl:for-each select="c/d"> <fo:block> <xsl:choose> <xsl:when test="position()=1"> <xsl:apply-templates select="."/> </xsl:when> <xsl:otherwise> <fo:block keep-with-previous.within-page="always" text-align="left"> <xsl:apply-templates select="."/> </fo:block> </xsl:otherwise> </xsl:choose> </fo:block> </xsl:for-each> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> </xsl:template>
解决方案
要实现目标效果,核心是调整单元格内容的垂直对齐逻辑,让第3列首行附着在第2列文本的最后一行末尾,具体修改如下:
1. 调整第2列文本块属性
移除display-align="after",改用行高策略保证文本换行后末尾的 leader 始终在最后一行,同时保留text-align-last="justify"让最后一行文本和 leader 撑满列宽:
<fo:block text-align-last="justify" line-stacking-strategy="font-height" white-space-collapse="true"> <xsl:apply-templates select="b"/> <fo:leader leader-pattern="dots" leader-pattern-width="1mm" leader-length.minimum="2mm" keep-with-next.within-page="always"/> </fo:block>
2. 修改第3列单元格对齐方式
给第3列的fo:table-cell添加display-align="after",让单元格内容垂直对齐到单元格底部;同时将首行内容包裹在fo:inline中,确保其紧跟第2列的末尾:
<fo:table-cell display-align="after"> <xsl:for-each select="c/d"> <fo:block> <xsl:choose> <xsl:when test="position()=1"> <fo:inline keep-together.within-line="always"> <xsl:apply-templates select="."/> </fo:inline> </xsl:when> <xsl:otherwise> <fo:block keep-with-previous.within-page="always" text-align="left"> <xsl:apply-templates select="."/> </fo:block> </xsl:otherwise> </xsl:choose> </fo:block> </xsl:for-each> </fo:table-cell>
3. 优化整行垂直对齐
给fo:table-row添加display-align="after",确保整行所有单元格内容都垂直对齐到底部,避免行高差异导致的错位:
<fo:table-row display-align="after">
调整后,第2列文本换行时,末尾的点状 leader 会停在最后一行,第3列的首行内容会自动对齐到这一行的末尾,后续行保持原有缩进格式,符合期望效果。
内容的提问来源于stack exchange,提问作者inVoKer
相关产品推荐
相关产品推荐

