提问人:Peter 提问时间:10/5/2008 最后编辑:CharlesPeter 更新时间:7/10/2017 访问量:30331
Excel 2003 XML 格式 - AutoFitWidth 不起作用
Excel 2003 XML format - AutoFitWidth not working
问:
我有一个程序可以吐出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>
这不会将列设置为自动调整。我试过不设置宽度,我试过很多东西,但我被卡住了。
谢谢。
答:
只有日期和数字值是自动调整的:-( 引用:“......我们不会自动调整文本值”
http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column
评论
在传递给 XML 之前获取字符串长度并构造 ss:Width=“length”。
评论
自动调整不适用于带有字符串的单元格。 尝试将示例中的 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”,因此这将正确排序。只有当长度> 9 的长度才会引起问题,但长度为 1000000000 的字符串无法由 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)"/>
所以我不得不用肮脏的方式去做。
我希望你现在可以自动调整!
我知道这篇文章很旧,但是如果有人仍然使用 openXml,我将使用我编码的解决方案来更新它。它适用于大文件和小文件。
该算法在 vb 中,它需要字符串的 arraylist 的 arraylist(可以根据需要更改)来具体化 excel 数组。
我使用 Windows 窗体来查找呈现文本的宽度,并使用链接仅选择最大的单元格(以提高大文件效率)
那里:
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
评论