Autofit 不适用于带有字符串的单元格。尝试用以下代码替换示例中的 Column-line:
<xsl:for-each select="/*/*[1]/*">
<Column>
<xsl:variable name="columnNum" select="position()"/>
<xsl:for-each select="/*/*/*[position()=$columnNum]">
<xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/>
<xsl:if test="position()=1">
<xsl:if test="string-length(.) < 201">
<xsl:attribute name="ss:Width">
<xsl:value-of select="5.25 * (string-length(.)+2)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="string-length(.) > 200">
<xsl:attribute name="ss:Width">
<xsl:value-of select="1000"/>
</xsl:attribute>
</xsl:if>
</xsl:if>
<xsl:if test = "local-name() = 'Sorteer'">
<xsl:attribute name="ss:Width">
<xsl:value-of select="0"/>
</xsl:attribute>
</xsl:if>
</xsl:for-each>
</Column>
</xsl:for-each>
说明:它按字符串长度排序(最长的字符串优先),取第一行排序的字符串,取该字符串的长度 * 5.25,你将有一个合理的自动调整。
分拣线:
<xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/>
解释:如果你只是按长度排序,比如
<xsl:sort select="string-length(.)" order="descending"/>
因为长度是作为字符串处理的,所以 2 在 10 之后,这是您不想要的。所以你应该左填充长度以使其正确排序(因为 002 在 010 之前)。但是,由于我找不到该填充功能,我通过将长度的长度与长度连接来解决它。长度为 100 的字符串将被转换为 3100(第一个数字是长度的长度),您将看到解决方案将始终正确地进行字符串排序。例如:2 将是“12”,10 将是“210”,所以这将是正确的字符串排序。只有当length的长度> 9时才会出现问题,但是Excel无法处理长度为100000000的字符串。
的解释
<xsl:if test="string-length(.) < 201">
<xsl:attribute name="ss:Width">
<xsl:value-of select="5.25 * (string-length(.)+2)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="string-length(.) > 200">
<xsl:attribute name="ss:Width">
<xsl:value-of select="1000"/>
</xsl:attribute>
</xsl:if>
我想将字符串的长度最大化到大约 200,但我无法让 Min 函数工作,比如
<xsl:value-of select="5.25 * Min((string-length(.)+2),200)"/>
所以我不得不用肮脏的方式来做。
我希望你现在可以自动调整!