Apache POI Excel - ¿cómo configurar columnas para expandir?


98

Estoy usando Apache POI APIpara generar excel spreadsheetpara generar algunos datos.

El problema al que me enfrento es que cuando se crea y abre la hoja de cálculo, las columnas no se expanden, por lo que un texto largo como el texto con formato de fecha no aparece a primera vista.

Podría simplemente hacer doble clic en el borde de la columna en Excel para expandir o arrastrar el borde para ajustar el ancho de la columna, pero podría haber más de 20 columnas y no hay forma de que quiera hacerlo manualmente cada vez que abro la hoja de cálculo :(

Me enteré (aunque podría ser un método incorrecto) groupRow()y setColumnGroupCollapsed()podría hacer el truco, pero no tuve suerte. Quizás lo estoy usando de manera incorrecta.

Fragmento de código de muestra

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

Cuando se crea esta hoja de cálculo, la cadena de "Muuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuh

¿Cómo puedo configurarlo para que cuando abro mi hoja de cálculo, la columna ya esté expandida?



Parece que está buscando una forma de utilizar los puntos de interés para lograrlo. Pero para hacerlo simplemente en Excel, seleccione toda la hoja y haga doble clic en el límite del encabezado de la columna AB. Si necesita hacer esto en varias hojas, una solución codificada puede serle más útil.
promedio del

Respuestas:


173

Después de haber agregado todos sus datos a la hoja, puede llamar autoSizeColumn(int column)a su hoja para ajustar automáticamente las columnas al tamaño adecuado.

Aquí hay un enlace a la API .

Consulte esta publicación para obtener más referencia Problema al ajustar el tamaño de celda de Excel al tamaño del contenido cuando se usa apache poi


7
Solo quería señalar que autoSizeColumnno se escala bien y será muy lento si tiene muchas filas. Tuve que ponerme un poco hacky y hacer algo similar a lo que se sugirió en esta pregunta .
lbstr

8
Advertencia sobre autoSizeColumn , esto requiere que Java Font esté disponible. Esto no es parte del java jre sin cabeza que se usa en los servidores y arrojará una NullPointerException.
Stephen Dillon

@StephenDillon ¿Alguna idea de cómo arreglar el puntero nulo para la configuración de fuentes?
Veeshal

La mejor manera que encontramos fue recorrer cada fila en la columna, encontrar la longitud de char más larga y multiplicar por x + agregar un búfer. X usa prueba y error para ver qué encaja, pero debe ser un ancho promedio de un carácter. Sin la fuente, no creo que puedas hacerlo bien, pero nos acercamos bastante. De lo contrario, puede agregar una macro para sobresalir para arreglarlo todo la primera vez que el usuario lo abre, ese era el mejor método pero requiere que las macros estén habilitadas
Stephen Dillon

45

Consejo: para que el tamaño automático funcione, la llamada a sheet.autoSizeColumn(columnNumber)debe realizarse después de completar los datos en Excel.

Llamar al método antes de completar los datos no tendrá ningún efecto.



La respuesta proporcionada aquí está relacionada con Java, mientras que el enlace proporcionado en el comentario está relacionado con Android. La respuesta todavía funciona en todos los casos de Java (excepto para los JRE de Java sin cabeza que no tienen la fuente Java disponible).
Unni Kris

gracias, calculé func y usé setColumnWidth de la siguiente manera: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586 ¿puedes elaborar este método con un poco más de detalle para mí?
Mehroz Mustafa

39

Si desea ajustar automáticamente el tamaño de todas las columnas en un libro de trabajo, aquí hay un método que puede ser útil:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}

Me estoy haciendo NullPointerExceptiona row.cellIterator(). ¿Es porque no tengo ningún valor en una de las celdas?
rakeeee

10

Puedes probar algo como esto:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Aquí los parámetros son: número de columna en la hoja y su ancho Pero, las unidades de ancho son bastante pequeñas, puede probar 4000 por ejemplo.


¡Es bueno saber gracias! Creo que para mi propósito, donde la cadena de la columna podría generarse dinámicamente, el método de ajuste de tamaño automático encajaría en el caso.
Miau


5

código de muestra a continuación

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// esto es crucial

sheet.autoSizeColumn(0);

// el argumento debe ser el número de celda

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Comprueba la salida y vuélvete loco :)


2
sheet.setColumnWidth (columnIndex, width) también es un método que desea ver
Mateen

3

Si conoce el recuento de sus columnas (por ejemplo, es igual a una lista de colección). Simplemente puede usar este forro para ajustar todas las columnas de una hoja (si usa al menos java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

Yo uso la siguiente solución simple:

Este es su libro de trabajo y hoja:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

luego agregue datos a su hoja con columnas y filas. Una vez que haya terminado de agregar datos a la hoja, escriba el siguiente código al autoSizeColumnancho.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Aquí, en lugar de 15, agrega el número de columnas en su hoja.

Espero que alguien ayude con esto.


0

Es muy simple, use este código de una línea dataSheet.autoSizeColumn (0)

o dar el número de columna entre corchetes dataSheet.autoSizeColumn (número de celda)


0

También puede ajustar el texto. Código de muestra de PFB:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.