表格单元格中的旋转文本呈现在单元格上方而不是其中
Posted
技术标签:
【中文标题】表格单元格中的旋转文本呈现在单元格上方而不是其中【英文标题】:Rotated text in table cell rendered above cell not within 【发布时间】:2018-06-25 15:51:28 【问题描述】:我有以下模板来生成定义的表:
<xsl:template name="CreateTable">
<fo:block>
<fo:table border-style="solid" table-layout="fixed">
<fo:table-body>
<fo:table-row>
<xsl:for-each select="Table/Head/Cell">
<fo:table-cell border-style="solid">
<fo:block><xsl:value-of select="." /></fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
<xsl:for-each select="Table/Row">
<fo:table-row>
<xsl:for-each select="Cell">
<fo:table-cell border-style="solid">
<fo:block><xsl:value-of select="."/></fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block margin-top="10pt"/>
</xsl:template>
现在我想将第一行中的文本旋转 90 度,以便从下向上阅读。
我想出的最佳解决方案是:
在<fo:table>
上设置reference-orientation="0"
:
<fo:table border-style="solid" table-layout="fixed" reference-orientation="0">
将<fo:block>...</fo:block>
括在<fo:table-cell>
中,并将<fo:block-container>
旋转90 度:
<fo:table-cell border-style="solid">
<fo:block-container reference-orientation="90">
<fo:block><xsl:value-of select="." /></fo:block>
</fo:block-container>
</fo:table-cell>
文本是旋转的,但第一行的高度实际上是 0,并且文本显示在表格上方覆盖先前的文本:
为第一行的单元格定义特定高度时,文本仍然在表格之前,而不是在第一行内:
如何将文本定位在第一行的单元格中,并根据行中最长的文本自动计算行高?
【问题讨论】:
您使用的是哪种格式化程序? 在您的 XSL 中,计算每个表格标题的字符数,并得出一个设置正确高度的公式。设置它并放置内容。或者,如果您希望文本因较长的项目而中断,请选择一个高度。格式化程序不会猜你想要什么。 @TonyGraham 我正在使用 apache-fop。 @KevinBrown 这是单元格高度,即第二个问题。主要问题是文本块的定位。 另外,在fo:block-container
上设置精确的width
和height
会强制文本位于表格单元格内。但这不是一个通用的解决方案,因为每个表格单元格可能有不同的大小......
【参考方案1】:
这是我对动态高度的尝试。 您可以寻找“是”一个更好的因素...因为我的声明满足了这种基本方法。
当然有更精确和更好的解决方案,但我认为这是正确的方向。感谢@Kevin Brown 的评论。
<xsl:for-each select="dischargeBudgets">
<xsl:variable name="cell_height">
<xsl:value-of select="string-length(.) * 2.2"/>
</xsl:variable>
<fo:table-cell padding="2px"
text-align="end"
border-style="solid">
<fo:block-container reference-orientation="90">
<fo:block white-space="nowrap">
<xsl:value-of select="."/>
</fo:block>
</fo:block-container>
</fo:table-cell>
</xsl:for-each>
【讨论】:
【参考方案2】:我有一个类似的问题,我可以通过在块容器中为标题添加一个 margin-top 来解决这个问题。据我所知,标题单元格会相应地调整自身大小:
<block-container>
<xsl:attribute name="margin-top" select="'5em'"/>
<xsl:attribute name="margin-bottom" select="'.75em'"/>
<xsl:attribute name="reference-orientation" select="'90'"/>
<block padding=".25em">
<xsl:apply-templates select="node()"/>
</block>
</block-container>
Properly rotated header using @margin-top
【讨论】:
【参考方案3】:在表格外显示的文本:表格单元格内的 fo:block 可能会从封闭块继承设置,例如左边距。
我以前没有见过的单元格高度问题,在 Antennahouse Formatter 中,您可以旋转单元格内容,IIRC 单元格将被适当地调整大小。
【讨论】:
以上是关于表格单元格中的旋转文本呈现在单元格上方而不是其中的主要内容,如果未能解决你的问题,请参考以下文章
自定义表格视图单元格中的 UITextField。点击单元格/文本字段时显示选择器视图