Excel 2003 XML格式 – AutoFitWidth无法正常工作

我有一个程序,以Excel 2003 XML格式吐出Excel工作簿。 它工作正常,有一个问题,我不能自动设置列宽。

我产生的片段:

<Table > <Column ss:AutoFitWidth="1" ss:Width="2"/> <Row ss:AutoFitHeight="0" ss:Height="14.55"> <Cell ss:StyleID="s62"><Data ss:Type="String">Database</Data></Cell> 

这不会将列设置为自动适应。 我试过没有设置宽度,我尝试了很多东西,我卡住了。

谢谢。

只有date和数字值是autofitted :-(报价:“…我们不autofit文本值”

http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column

在传递给XML之前,先取出你的string长度,然后构造ss:Width =“length”。

自动调整不适用于带有string的单元格。 尝试用下面的代码replace示例中的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(.) &lt; 201"> <xsl:attribute name="ss:Width"> <xsl:value-of select="5.25 * (string-length(.)+2)"/> </xsl:attribute> </xsl:if> <xsl:if test="string-length(.) &gt; 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> 

说明:它按string长度sorting(最长string优先),sortingstring的第一行,取长度string* 5.25,你将有一个合理的autofit。

分拣线:

  <xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/> 

解释:如果你只是按照长度sorting

  <xsl:sort select="string-length(.)" order="descending"/> 

因为长度是作为string处理的,所以2在10之后,这是你不想要的。 所以你应该留下长度,以便正确sorting(因为002在010之前)。 但是,由于找不到填充函数,我通过连接长度和长度来解决这个问题。 长度为100的string将被转换为3100(第一个数字是长度的长度),您将看到解决scheme将始终按stringsorting。 例如:2将是“12”,10将是“210”,所以这将是正确的stringsorting。 只有长度大于9的长度会导致问题,但长度为100000000的string不能由Excel处理。

解释

  <xsl:if test="string-length(.) &lt; 201"> <xsl:attribute name="ss:Width"> <xsl:value-of select="5.25 * (string-length(.)+2)"/> </xsl:attribute> </xsl:if> <xsl:if test="string-length(.) &gt; 200"> <xsl:attribute name="ss:Width"> <xsl:value-of select="1000"/> </xsl:attribute> </xsl:if> 

我想将string的长度最大限制在200左右,但是我不能使Min函数正常工作

  <xsl:value-of select="5.25 * Min((string-length(.)+2),200)"/> 

所以我不得不这样做。

我希望你现在可以自动安装!

我知道这个post是旧的,但我更新与我编码的解决scheme,如果任何人仍然使用openXML。 它适用于大文件和小文件。

algorithm在vb中,它需要一个stringarraylist的列表(可以根据需要改变)来实现一个excel数组。

我用一个Windows窗体来查找渲染文本的宽度,并且链接只select最大的单元格(对于大文件效率)

那里:

 Dim colsTmp as ArrayList '(of Arraylist(of String)) Dim cols as Arraylist '(of Integer) Max size of cols 'Whe populate the Arraylist Dim width As Integer 'For each column For i As Integer = 0 To colsTmp.Count - 1 'Whe sort cells by the length of their String colsTmp(i) = (From f In CType(colsTmp(i), String()) Order By f.Length).ToArray Dim deb As Integer = 0 'If they are more than a 100 cells whe only take the biggest 10% If colsTmp(i).length > 100 Then deb = colsTmp(i).length * 0.9 End If 'For each cell taken For j As Integer = deb To colsTmp(i).length - 1 'Whe messure the lenght with the good font and size width = Windows.Forms.TextRenderer.MeasureText(colsTmp(i)(j), font).Width 'Whe convert it to "excel lenght" width = (width / 1.42) + 10 'Whe update the max Width If width > cols(i) Then cols(i) = width Next Next