Excel 2003 XML形式-AutoFitWidthが機能しない
質問
Excel 2003 XML形式のExcelブックを作成するプログラムがあります。 1つの問題でうまく動作します。列幅を自動的に設定することができません。
私が作成したもののスニペット:
<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>
これは、列を自動調整に設定しません。幅を設定しないようにしましたが、多くのことを試しましたが、行き詰まりました。
ありがとう。
解決
日付と数値のみが自動調整されます:-( quote:&quot; ...テキスト値を自動調整しません
http://msdn.microsoft.com/en- us / library / aa140066.aspx#odc_xmlss_ss:column
他のヒント
XMLに渡す前に文字列の長さを取得し、ss:Width =&quot; length&quot;を作成します。
文字列を含むセルでは自動調整は機能しません。 例の列行を次のコードで置き換えてみてください。
<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」になるため、これは文字列で正しくソートされます。長さの長さが&gt;の場合のみ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