Autofit не работает на ячейках со строками.
Попробуйте заменить строку столбца в вашем примере следующим кодом:
<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», так что это будет правильно отсортировано по строкам. Только если длина длины> 9 вызовет проблемы, но строки длиной 100000000 не могут быть обработаны в Excel.
Объяснение
<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)"/>
Так что мне пришлось сделать это грязным путем.
Надеюсь, вы можете установить авто сейчас!