Ответ 1
Только значения даты и числа автоподдержаны:-( цитата: "... Мы не авторизуем текстовые значения"
http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column
У меня есть программа, которая выплескивает книгу 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>
Это не позволяет авторизовать столбец. Я пробовал не устанавливать ширину, я пробовал много вещей, и я застрял.
Спасибо.
Только значения даты и числа автоподдержаны:-( цитата: "... Мы не авторизуем текстовые значения"
http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column
Возьмите длину строки перед переходом к XML и постройте ss: Width = "length".
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(.) < 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 вызовет проблемы, но строки длиной 100000000 не могут обрабатываться 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