2012-07-20 52 views
37

Yo escribo una herramienta en Java utilizando la API de Apache POI para convertir un XML a MS Excel. En mi entrada XML, recibo el ancho de la columna en puntos. Pero la API Apache POI tiene una lógica ligeramente extraña para establecer el ancho de columna según el tamaño de fuente, etc. (refiera API docs)ajuste de ancho de columna en Apache POI

¿Hay una fórmula para convertir los puntos al ancho esperado por Excel? ¿Alguien ha hecho esto antes? .

Hay un método setRowHeightInPoints() aunque :(pero ninguno para la columna

PS: El XML de entrada está en formato ExcelML, que tengo que convertir a MS Excel

Respuesta

74

Desafortunadamente, no sólo la función setColumnWidth(int columnIndex, int width). desde class Sheet; en qué ancho hay una cantidad de caracteres en la fuente estándar (primera fuente en el libro) si las fuentes cambian no puede usarlo. Se explica cómo calcular el ancho en función de un tamaño de fuente. La fórmula es:

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

Siempre puede usar autoSizeColumn(int column, boolean useMergedCells) después de ingresar los datos en su Sheet.

Espero que haya sido de ayuda.

+27

1 de autoSizeColumn – Nasir

+1

thnx..it trabajó –

2

Se puede utilizar también métodos util mencionados en este blog: Getting cell witdth and height from excel with Apache POI. Puede resolver tu problema.

Copia & pasta a partir de ese 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; 
    } 

} 

Así que cuando usted quiere conseguir la anchura y altura de celda se puede usar esto para obtener el valor en píxeles, valores son Aproximadamente un.

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

Se utiliza esto en mi código y funciona muy bien como es. –

12

Tenga cuidado con el uso de autoSizeColumn(). Se puede utilizar sin problemas en archivos pequeños, pero por favor asegúrese de que el método se llama sólo una vez (al final) para cada columna y no llama dentro de un bucle que no tendría ningún sentido.

Por favor, evite el uso de autoSizeColumn() en grandes archivos de Excel. El método genera un problema de rendimiento.

lo usamos en un archivo de 110k filas/columnas 11. El método tomó ~ 6m para autosize todas las columnas.

Para más detalles echar un vistazo a: How to speed up autosizing columns in apache POI?