texto setwraptext setcolumnwidth poi formato example desde dar celdas ajustar excel apache-poi

excel - setwraptext - Configuración del ancho de columna en Apache POI



setcolumnwidth poi example (3)

Estoy escribiendo una herramienta en Java usando la API de POI de Apache para convertir un XML a MS Excel. En mi entrada XML, recibo el ancho de la columna en puntos. Pero la API de POI de Apache tiene una lógica ligeramente extraña para establecer el ancho de columna en función del tamaño de la fuente, etc. (consulte los documentos de la API )

¿Hay alguna fórmula para convertir puntos según el ancho esperado por Excel? ¿Alguien ha hecho esto antes?

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

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


Lamentablemente, solo existe la función setColumnWidth (int columnIndex, int width) de class Sheet ; en el que el ancho es un número de caracteres en la fuente estándar (primera fuente en el libro de trabajo) si sus fuentes están cambiando 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 ayudado.


También puede utilizar los métodos de utilidades mencionados en este blog: obtención de celdas de altura y altura de Excel con Apache POI . Puede resolver tu problema.

Copie y pegue desde 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; } }

Entonces, cuando desee obtener el ancho y el alto de la celda, puede usar esto para obtener valor en píxeles, los valores son aproximados .

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


Tenga cuidado con el uso de autoSizeColumn() . Se puede usar sin problemas en archivos pequeños, pero tenga cuidado de que el método se invoque solo una vez (al final) para cada columna y no se invoque dentro de un bucle, lo que no tendría sentido.

Evite utilizar autoSizeColumn() en archivos de Excel grandes. El método genera un problema de rendimiento.

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

Para obtener más detalles, eche un vistazo a: ¿Cómo acelerar las columnas de autosizing en Apache POI?