Excel 2003 XML-format - AutoFitWidth ikke fungerer

stemmer
10

Jeg har et program som spytter ut en Excel-arbeidsbok i Excel 2003 XML format. Det fungerer fint med ett problem, jeg kan ikke få kolonnebredder for å sette automatisk.

En bit av det jeg produserer:

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

Dette betyr ikke satt kolonnen til tilpassing. Jeg har prøvd ikke å sette bredde, jeg har prøvd mange ting, og jeg er fast.

Takk.

Publisert på 05/10/2008 klokken 09:49
kilden bruker
På andre språk...                            


4 svar

stemmer
25

Bare dato og tallverdier er autofitted :-( sitat: "... Vi har ikke AutoFit tekstlige verdier"

http://msdn.microsoft.com/en-us/library/aa140066.aspx#odc_xmlss_ss:column

Svarte 05/10/2008 kl. 12:22
kilden bruker

stemmer
1

Ta din strenglengde før passering til XML og konstruere ss: Bredde = "lengde".

Svarte 11/11/2013 kl. 14:17
kilden bruker

stemmer
0

AutoFit fungerer ikke på celler med strenger. Prøv å erstatte Column-linje i eksempelet med følgende kode:

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

Forklaring: Den sorterer på string-length (lengste strengen først), ta første linjen av sorterte strenger, ta lengden på strengen * 5,25 og du vil ha en rimelig tilpassing.

Sortering linje:

        <xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/>

Forklaring: Hvis du bare liksom på lengde, som

        <xsl:sort select="string-length(.)" order="descending"/>

fordi lengder håndteres som strenger, kommer to etter 10, som du ikke ønsker. Så du bør venstre-pad lengder for å få det sortert riktig (fordi 002 kommer før 010). Men som jeg ikke kunne finne at padding funksjon, jeg løste det ved concattenating lengden på lengde med lengden. En streng med lengde på 100 vil bli oversatt til 3100 (første siffer er lengden på lengde), vil du se at løsningen vil alltid få streng-sortert riktig. for eksempel: 2 vil være "12" og 10 vil være "210", slik at dette wil være streng sortert på riktig måte. Bare når lengden av lengden> 9 vil føre til problemer, men strenger av lengde 100 millioner kan ikke håndteres av Excel.

explantion av

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

Jeg ønsket å maksimere hyssing til ca 200, men jeg kunne ikke få Min funksjonen skal virke, som

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

Så jeg måtte gjøre det skitne måten.

Jeg håper du kan AutoFit nå!

Svarte 25/09/2014 kl. 17:12
kilden bruker

stemmer
0

Jeg vet dette innlegget er gammelt, men jeg oppdatere den med en løsning jeg kodet om noen fortsatt bruke OpenXML. Det fungerer fint med store filer og små filer.

Algoritmen er i vb, tar det en Arraylist av Arraylist av strengen (kan endres etter behov) for å materialisere en utmerke array.

Jeg brukte en Windows til å finne bredden gjengitt tekst og linker til å velge bare de største cellene (for store filer effektivitet)

Der:

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
Svarte 10/07/2017 kl. 14:32
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more