Excel 2003 XML 格式 - AutoFitWidth 不起作用

Excel 2003 XML format - AutoFitWidth not working

提问人:Peter 提问时间:10/5/2008 最后编辑:CharlesPeter 更新时间:7/10/2017 访问量:30331

问:

我有一个程序可以吐出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>

这不会将列设置为自动调整。我试过不设置宽度,我试过很多东西,但我被卡住了。

谢谢。

xml excel openxml

评论


答:

28赞 s&#248;ren Jacobi 10/5/2008 #1

只有日期和数字值是自动调整的:-( 引用:“......我们不会自动调整文本值”

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

评论

0赞 MSC 1/21/2019
人们想知道为什么,因为 Excel 可以很好地自动调整文本列。
2赞 supermankelly 11/12/2013 #2

在传递给 XML 之前获取字符串长度并构造 ss:Width=“length”。

评论

0赞 MSC 1/21/2019
知道为什么 ss:Width 与 Excel 本身中使用的单位没有任何关系吗?例如,我指定 ss:Width: 200,它在 Excel 中显示为列宽 37.43。它也不是像素,那么 ss:Width 单位是什么?
0赞 Mathijs Beentjes 9/26/2014 #3

自动调整不适用于带有字符串的单元格。 尝试将示例中的 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>

解释:它按字符串长度(最长字符串在前)排序,取排序字符串的第一行,取该字符串的长度 * 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(.) &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>

我想将字符串的长度最大化到大约 200,但我无法让 Min 函数工作,比如

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

所以我不得不用肮脏的方式去做。

我希望你现在可以自动调整!

0赞 m.nachury 7/10/2017 #4

我知道这篇文章很旧,但是如果有人仍然使用 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