Domanda

Ho un programma che sputa una cartella di lavoro di Excel in formato XML di Excel 2003. Funziona bene con un problema, non riesco a impostare automaticamente la larghezza delle colonne.

Un frammento di ciò che produco:

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

Questo non imposta la colonna su adattamento automatico. Ho provato a non impostare la larghezza, ho provato molte cose e sono bloccato.

Grazie.

È stato utile?

Soluzione

Vengono montati automaticamente solo i valori di data e numero :-( quote: " ... Non adattiamo automaticamente i valori testuali "

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

Altri suggerimenti

Prendi la lunghezza della tua stringa prima di passare a XML e costruisci ss: Width = " length " ;.

Adattamento automatico non funziona su celle con stringhe. Prova a sostituire la linea di colonna nel tuo esempio con il seguente codice:

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

Spiegazione: ordina sulla lunghezza della stringa (prima la stringa più lunga), prende la prima riga di stringhe ordinate, prende la lunghezza di quella stringa * 5.25 e avrai un adattamento ragionevole.

Riga di ordinamento:

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

spiegazione: se si ordina solo per lunghezza, come

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

poiché le lunghezze sono gestite come stringhe, 2 viene dopo 10, che non si desidera. Quindi dovresti spostare a sinistra le lunghezze per ordinarlo correttamente (perché 002 viene prima di 010). Tuttavia, poiché non riuscivo a trovare quella funzione di imbottitura, l'ho risolta concatenando la lunghezza della lunghezza con la lunghezza. Una stringa con una lunghezza di 100 verrà tradotta in 3100 (la prima cifra è la lunghezza della lunghezza), vedrai che la soluzione verrà sempre ordinata correttamente. ad esempio: 2 saranno "12" e 10 saranno "210", quindi questo verrà ordinato correttamente per stringa. Solo quando la lunghezza della lunghezza > 9 causerà problemi, ma stringhe di lunghezza 100000000 non possono essere gestite da Excel.

Spiegazione di

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

Volevo massimizzare la lunghezza della stringa a circa 200, ma non riuscivo a far funzionare la funzione Min, come

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

Quindi ho dovuto farlo nel modo sporco.

Spero che tu possa eseguire il montaggio automatico ora!

So che questo post è vecchio, ma lo sto aggiornando con una soluzione che ho codificato se qualcuno usa ancora openXml. Funziona bene con file di grandi dimensioni e file di piccole dimensioni.

L'algoritmo è in vb, ci vuole un arraylist di arraylist di stringa (può essere modificato in base alle esigenze) per materializzare un array excel.

Ho usato un modulo di Windows per trovare la larghezza del testo renderizzato e collegamenti per selezionare solo le celle più grandi (per l'efficienza dei file di grandi dimensioni)

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top