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