2008-10-05 11 views
10

काम नहीं कर रहा है मेरे पास एक प्रोग्राम है जो एक्सेल 2003 एक्सएमएल प्रारूप में एक्सेल वर्कबुक को थकाता है। यह एक समस्या के साथ ठीक काम करता है, मैं कॉलम चौड़ाई स्वचालित रूप से सेट करने के लिए नहीं मिल सकता है।एक्सेल 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> 

यह autofit करने के लिए स्तंभ निर्धारित नहीं करता है। मैंने चौड़ाई निर्धारित करने की कोशिश नहीं की है, मैंने कई चीजों की कोशिश की है और मैं फंस गया हूं।

धन्यवाद।

उत्तर

1

एक्सएमएल को पारित करने से पहले अपने स्ट्रिंग की लंबाई ले लो और एस एस का निर्माण: चौड़ाई = "लंबाई"

0

ऑटोफ़िट साथ तार कोशिश कोशिकाओं पर काम नहीं करता है निम्न कोड के आधार पर आपके उदाहरण में कॉलम लाइन को बदलने के लिए:।।

<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" होगा, इसलिए यह सही ढंग से स्ट्रिंग-सॉर्ट किया जाएगा। केवल जब लंबाई की लंबाई> 9 समस्याएं पैदा करेगी, लेकिन लंबाई 100000000 की तारों को एक्सेल द्वारा नियंत्रित नहीं किया जा सकता है।

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

की Explantion मैं लगभग 200 के लिए स्ट्रिंग की लंबाई को अधिकतम करना चाहता था, लेकिन मैं काम करने के लिए न्यूनतम समारोह, जैसे

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

नहीं मिल सका तो मैं यह करना ही था गंदा तरीका।

मुझे आशा है कि अब आप ऑटोफिट कर सकते हैं!

0

मुझे पता है कि यह पोस्ट पुराना है, लेकिन मैं इसे हल करने वाले समाधान के साथ अद्यतन कर रहा हूं यदि कोई भी अभी भी openXml का उपयोग करता है। यह बड़ी फाइलों और छोटी फाइलों के साथ ठीक काम करता है।

एल्गोरिदम vb में है, यह एक्सेल सरणी को मूर्त रूप देने के लिए स्ट्रिंग की सरणीसूची की सरणीसूची (आवश्यकताओं के अनुसार बदला जा सकता है) लेता है।

मैं एक 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