2012-07-20 14 views
37

Sto scrivendo uno strumento in Java utilizzando API POI Apache per convertire un XML in MS Excel. Nel mio input XML, ricevo la larghezza della colonna in punti. Ma l'API di Apache POI ha una logica un po 'strana per impostare la larghezza della colonna in base alla dimensione del font, ecc (vedi API docs)Impostazione larghezza colonna in POI Apache

Esiste una formula per la conversione punti alla larghezza come previsto da Excel? Qualcuno l'ha già fatto prima? .

C'è un metodo setRowHeightInPoints() però :(ma nessuno per la colonna

PS: L'XML di input è in formato ExcelML che devo convertire in MS Excel

risposta

74

Purtroppo non c'è solo la funzione setColumnWidth(int columnIndex, int width). da class Sheet, in cui la larghezza è un numero di caratteri in il carattere standard (il primo carattere nella cartella di lavoro) se i tipi di carattere stanno cambiando non è possibile utilizzarlo. Viene spiegato come calcolare la larghezza in funzione della dimensione del carattere. La formula è:

width = Truncate([{NumOfVisibleChar} * {MaxDigitWidth} + {5PixelPadding}]/{MaxDigitWidth}*256)/256 

È possibile utilizzare sempre autoSizeColumn(int column, boolean useMergedCells) dopo aver immesso i dati nel proprio Sheet.

Spero che abbia aiutato.

+27

+1 per autoSizeColumn – Nasir

+1

thnx..it lavorato –

2

È possibile utilizzare anche i metodi utilizzati in questo blog: Getting cell witdth and height from excel with Apache POI. Può risolvere il tuo problema.

Copia & incolla da quel blog:

public class PixelUtil { 

    public static final short EXCEL_COLUMN_WIDTH_FACTOR = 256; 
    public static final short EXCEL_ROW_HEIGHT_FACTOR = 20; 
    public static final int UNIT_OFFSET_LENGTH = 7; 
    public static final int[] UNIT_OFFSET_MAP = new int[] { 0, 36, 73, 109, 146, 182, 219 }; 

    public static short pixel2WidthUnits(int pxs) { 
    short widthUnits = (short) (EXCEL_COLUMN_WIDTH_FACTOR * (pxs/UNIT_OFFSET_LENGTH)); 
    widthUnits += UNIT_OFFSET_MAP[(pxs % UNIT_OFFSET_LENGTH)]; 
    return widthUnits; 
    } 

    public static int widthUnits2Pixel(short widthUnits) { 
    int pixels = (widthUnits/EXCEL_COLUMN_WIDTH_FACTOR) * UNIT_OFFSET_LENGTH; 
    int offsetWidthUnits = widthUnits % EXCEL_COLUMN_WIDTH_FACTOR; 
    pixels += Math.floor((float) offsetWidthUnits/((float) EXCEL_COLUMN_WIDTH_FACTOR/UNIT_OFFSET_LENGTH)); 
    return pixels; 
    } 

    public static int heightUnits2Pixel(short heightUnits) { 
    int pixels = (heightUnits/EXCEL_ROW_HEIGHT_FACTOR); 
    int offsetWidthUnits = heightUnits % EXCEL_ROW_HEIGHT_FACTOR; 
    pixels += Math.floor((float) offsetWidthUnits/((float) EXCEL_ROW_HEIGHT_FACTOR/UNIT_OFFSET_LENGTH)); 
    return pixels; 
    } 

} 

Quindi, quando si desidera ottenere la larghezza e l'altezza delle cellule è possibile utilizzare questo per ottenere il valore in pixel, valori sono approximatelly.

PixelUtil.heightUnits2Pixel((short) row.getHeight()) 
PixelUtil.widthUnits2Pixel((short) sh.getColumnWidth(columnIndex)); 
+0

Utilizzato questo nel mio codice e funziona benissimo così com'è. –

12

Si prega di essere attento con l'utilizzo di autoSizeColumn(). Può essere utilizzato senza problemi su file di piccole dimensioni, ma si prega di fare attenzione che il metodo sia chiamato una sola volta (alla fine) per ogni colonna e non chiamato all'interno di un ciclo che non avrebbe senso.

Evitare l'uso di autoSizeColumn() su file Excel di grandi dimensioni. Il metodo genera un problema di prestazioni.

Lo abbiamo usato su un file di 110 righe/11 colonne. Il metodo ha richiesto ~ 6m per eseguire l'autodimensionamento di tutte le colonne.

Per maggiori dettagli un'occhiata a: How to speed up autosizing columns in apache POI?