Формат Excel Excel 2003 - AutoFitWidth не работает

У меня есть программа, которая выплескивает книгу Excel в формате Excel 2003 XML. Он отлично работает с одной проблемой, я не могу автоматически установить ширину столбцов.

Отрывок из того, что я производю:

  <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>

Это не позволяет авторизовать столбец. Я пробовал не устанавливать ширину, я пробовал много вещей, и я застрял.

Спасибо.

Ответ 2

Возьмите длину строки перед переходом к XML и постройте ss: Width = "length".

Ответ 3

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(.) &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 вызовет проблемы, но строки длиной 100000000 не могут обрабатываться 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)"/>

Так что я должен был сделать это грязным способом.

Я надеюсь, что вы сможете автоподтвердить сейчас!

Ответ 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