我有一个以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>
这不会将列设置为自动调整。我试过没有设置宽度,我尝试了很多东西而且我被卡住了。
感谢。
答案 0 :(得分:27)
仅自动调整日期和数字值:-( 引用:“......我们不自动调整文本值”
http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column
答案 1 :(得分:2)
在传递给XML之前获取字符串长度并构造ss:Width =“length”。
答案 2 :(得分:0)
自动调整功能不适用于带字符串的单元格。 尝试使用以下代码替换示例中的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将是&#34; 12&#34; 10将是&#34; 210&#34;,所以这将被正确地进行字符串排序。只有当长度> 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)"/>
所以我必须以肮脏的方式去做。
我希望你现在可以自动调整!
答案 3 :(得分:0)
我知道这篇文章已经过时了,但是如果有人仍在使用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