write poi librería descargar create java apache excel apache-poi

java - librería - Apache POI autoSizeColumn cambia el tamaño incorrectamente



poi xssf jar (8)

Aquí están mis 2 centavos -

Estaba usando la fuente predeterminada (Arial en mi caso) usándola para poner ciertos campos en negrita en el xls. Funcionó como un encanto en Windows junto con la función autoSizeColumn ().

Linux no fue tan indulgente. El auto-tamaño era inadecuado en los lugares. Después de pasar por este hilo y otro, se me ocurrió la siguiente solución.

Copié los archivos .tff de la fuente Arial en el directorio JAVA / jre / lib / fonts y volví a ejecutar la aplicación. Funcionó bien.

Estoy usando Apache POI en Java para crear un archivo de Excel. Completo los datos y luego trato de autoesificar cada columna, sin embargo, los tamaños siempre son incorrectos (y creo que consistentes). Las dos primeras filas están siempre (?) Completamente colapsadas. Cuando autosize las columnas en excel, funciona perfectamente.

No se escriben celdas en blanco (creo) y el cambio de tamaño es lo último que hago.

Aquí está el código relevante: esta es una versión reducida sin manejo de errores, etc.

public static synchronized String storeResults(ArrayList<String> resultList, String file) { if (resultList == null || resultList.size() == 0) { return file; } FileOutputStream stream = new FileOutputStream(file); //Create workbook and result sheet XSSFWorkbook book = new XSSFWorkbook(); Sheet results = book.createSheet("Results"); //Write results to workbook for (int x = 0; x < resultList.size(); x++) { String[] items = resultList.get(x).split(PRIM_DELIM); Row row = results.createRow(x); for (int i = 0; i < items.length; i++) { row.createCell(i).setCellValue(items[i]); } } //Auto size all the columns for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) { results.autoSizeColumn(x); } //Write the book and close the stream book.write(stream); stream.flush(); stream.close(); return file; }

Sé que hay algunas preguntas similares, pero la mayoría de ellas son simplemente un caso de tamaño antes de completar los datos. Y los pocos que no son son más complicados / sin respuesta.

EDITAR: Intenté usar un par de fuentes diferentes y no funcionó. Lo cual no es demasiado sorprendente, ya que no importa cuál sea la fuente, todas las columnas deberían colapsarse por completo o ninguna debería estarlo.

Además, debido a que surgió el problema de la fuente, estoy ejecutando el programa en Windows 7.

RESUELTO: Fue un problema de fuente. La única fuente que encontré que funcionó fue Serif.


Descubrí que el auto-tamaño no ampliaba lo suficiente la columna cuando la cuerda más ancha comenzaba con espacios, por ejemplo

cell.setCellValue(" New Cell");

Esto se puede solucionar usando sangrías en su lugar, por ejemplo

// font/style XSSFFont font = workbook.createFont(); font.setFontName("Arial"); XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); style.setIndention((short)2); // create/set cell & style cell = row.createCell(0); cell.setCellValue("New Cell"); cell.setCellStyle(style); // auto size spreadsheet.autoSizeColumn(0);


El siguiente funciona para mi.

Configuro la fuente y uso autoSizeColumn () después de ingresar todos los datos.

public static XSSFWorkbook createExcel(List<ChannelVodFileInfoList> resList) { XSSFWorkbook hwb = new XSSFWorkbook(); String[] title = { "1", "2", "3", "4"}; XSSFSheet sheet = hwb.createSheet("dataStats"); XSSFRow firstrow = sheet.createRow(0); for (int i = 0; i < title.length; i++) { XSSFCell xh = firstrow.createCell(i); xh.setCellValue(title[i]); } if (resList == null || resList.size() == 0) { return hwb; } for (int i = 0; i < resList.size(); i++) { ChannelVodFileInfoList doTemp = resList.get(i); XSSFRow row = sheet.createRow(i + 1); for (int j = 0; j < title.length; j++) { XSSFCell cell = row.createCell(j); Font font111 = hwb.createFont(); font111.setBoldweight(Font.BOLDWEIGHT_NORMAL); XSSFCellStyle cellStyle111 = hwb.createCellStyle(); cellStyle111.setFont(font111); cell.setCellStyle(cellStyle111); if (j == 0) { cell.setCellValue(dateStr); } else if (j == 1) { cell.setCellValue(doTemp.getChannelName()); }else if (j == 2) { cell.setCellValue(doTemp.getBitrate()); }else if (j == 3) { cell.setCellValue(doTemp.getWh()); } } for (int j = 0; j < title.length; j++) { sheet.autoSizeColumn(j); } return hwb; }


Esto probablemente esté relacionado con este POI Bug que está relacionado con Java Bug JDK-8013716: Renderer para Calibri y Cambria Fonts falla desde la actualización 45 .

En este caso, cambiar la fuente o usar JRE por encima de 6u45 / 7u21 debería solucionar el problema.

También puede analizar el problema y evitar que las columnas se colapsen por completo utilizando un código como este sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); } sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); }


He usado la fuente Helvetica tratando de reemplazar la fuente Arial (de hecho, Helvetica es similar a Arial).

XSSFFont font = wb.createFont(); font.setFontName("Helvetica");


Solo para hacer una respuesta de mi comentario. Las filas no podían dimensionarse correctamente porque Java no estaba al tanto de la fuente que intentabas utilizar. Este enlace debería ser útil si deseas instalar nuevas fuentes en Java para que puedas usar algo más elegante. También tiene la lista de fuentes predeterminadas que Java conoce.

¡Me alegro de que esto haya sido de ayuda y tu problema haya sido resuelto!


También me encontré con este problema y esta fue mi solución.

Pasos:

  1. Crear libro de trabajo
  2. Crear hoja de cálculo
  3. Crear fila
  4. Crear / Establecer fuente a "Arial"
  5. Crear / Establecer estilo con fuente
  6. Crear / Establecer celda con valor y estilo
  7. AutoSizeColumn
  8. Crea un archivo

Código:

// initialize objects XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet spreadsheet = workbook.createSheet(sheetName); XSSFRow row = spreadsheet.createRow(0); XSSFCell cell; // font/style XSSFFont font = workbook.createFont(); font.setFontName("Arial"); XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); // create/set cell & style cell = row.createCell(0); cell.setCellValue("New Cell"); cell.setCellStyle(style); // auto size spreadsheet.autoSizeColumn(0); // create file File aFile = new File("Your Filename"); FileOutputStream out = new FileOutputStream(aFile); workbook.write(out);

Recursos:

http://www.tutorialspoint.com/apache_poi/index.htm


Tuve un problema similar en Windows 7.

Estaba usando la fuente Calibri (que es compatible con mi JVM). Con esa fuente, getBounds().getWidth() de java.awt.font.TextLayout utilizado por el método autoSizeColumn() POI devuelve 0.

Cambiar la fuente a Calibri-Regular resolvió el problema en mi caso.