سؤال

ولدي البرنامج الذي يبصق مصنف Excel في تنسيق XML برنامج Excel 2003. أنه يعمل بشكل جيد مع مشكلة واحدة، وأنا لا يمكن الحصول على عرض الأعمدة لضبط تلقائيا.

ومقتطف من ما ننتج:

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

وهذا لا يتم تعيين أي عامود لاحتواء تلقائي. لقد حاولت ليس وضع العرض، لقد حاولت أشياء كثيرة وأنا عالقة.

وشكرا.

هل كانت مفيدة؟

المحلول

و:-( فقط وautofitted تاريخ ورقم القيم أقتبس: "... نحن لا احتواء تلقائي القيم النصية"

http://msdn.microsoft.com/en- لنا / مكتبة / aa140066.aspx # odc_xmlss_ss: عمود

نصائح أخرى

وخذ طول السلسلة قبل تمرير إلى XML وبناء قوات الأمن الخاصة: العرض = "طول".

والاحتواء التلقائي لا يعمل على الخلايا مع السلاسل. محاولة استبدال خط عمود في المثال من خلال التعليمات البرمجية التالية:

    <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). ومع ذلك، وأنا لا يمكن أن تجد أن وظيفة الحشو، I حلها من قبل concattenating طول طول مع الطول. سوف تترجم سلسلة بطول 100-3100 (الرقم الأول هو طول طول)، سترى أن الحل سوف تحصل دائما مرتبة سلسلة الحق. على سبيل المثال: لن يكون 2 "12" و 10 سيكون "210"، لذلك هذا فيل أن يكون بشكل صحيح، مرتبة السلسلة. فقط عندما يكون طول طول> 9 سوف يسبب مشاكل، ولكن سلاسل من طول 100000000 لا يمكن التعامل معها من قبل Excel.

وExplantion من

            <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، ولكن لم أستطع الحصول على وظيفة الحد الأدنى للعمل، مثل

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

وهكذا كان لي لتفعل ذلك بالطريقة القذرة.

وآمل أن تتمكن من احتواء تلقائي الآن!

وأنا أعرف هذا المنصب قديمة، ولكن أنا تحديثه مع حل I مشفرة إذا كان أي شخص لا تزال تستخدم OPENXML. أنه يعمل بشكل جيد مع الملفات الكبيرة والملفات الصغيرة.

والخوارزمية في VB، فإنه يأخذ arraylist من arraylist من سلسلة (يمكن أن تتغير وفقا لاحتياجات) لتجسيد مجموعة اكسل.

وأنا استخدم نموذج 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