質問

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(.) &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」になるため、これは文字列で正しくソートされます。長さの長さが&gt;の場合のみ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)"/>

だから汚いやり方でやらなければならなかった。

今すぐ自動調整できることを願っています!

この投稿は古いことは知っていますが、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top