Java excel. Librería POI de apache.
En algunos sistemas es necesario generar reportes en Excel, para hacer eso hay una librería de apache que se llama org.apache.poi la cual nos facilita el asunto para crear el reporte desde java. Aquí voy a darles un ejemplo para que generen el reporte en Excel fácilmente, vamos a crearlo con la ayuda de
Un
javax.faces.model.DataModel
.
Un
DataModel
es una abstracción en torno a datos arbitrarios, se modela como una colección de objetos de fila a los cuales se puede acceder mediante un índice de la fila. La API proporciona mecanismos para posicionarnos en un índice de fila especificado, y así recuperar los datos de la fila actual. El concepto suena como que si fuera algo difícil cuando en realidad no es así. Primero hay que crear los nombres de las cabeceras del Excel que vamos a crear e insertarlos en una lista, después de eso creamos el contenido del Excel en una lista, eso podemos hacerlo manual o mediante un método que haga una llamada a la base de datos y nos devuelva la lista con los registros que queremos, En este ejemplo vamos a llenar las dos listas de forma manual y después las seteamos en el DataModel
correspondiente. Bueno vamos a la práctica que es lo que más nos interesa. Voy a ir poniendo códigos por parte y después les dejo el proyecto para que lo descarguen y utilicen este ejemplo en cualquier sistema...
Primero creamos los DataModel
con sus respectivos setter's y getter's:
DataModel
private DataModel dataModelCabecera; private DataModel dataModelContenido; public DataModel getDataModelCabecera() { return dataModelCabecera; } public void setDataModelCabecera(DataModel dataModelCabecera) { this.dataModelCabecera = dataModelCabecera; } public DataModel getDataModelContenido() { return dataModelContenido; } public void setDataModelContenido(DataModel dataModelContenido) { this.dataModelContenido = dataModelContenido; }
DataModel
vamos a crear el método en donde vamos a crear los nombres de las cabeceras y el contenido de las mismas:
Metodo: dataModelReporte
public void dataModelReporte() { List listaFinal = new ArrayList(); List listaCabeceras = new ArrayList(); listaCabeceras.add("ID"); listaCabeceras.add("TIPO"); listaCabeceras.add("TIPO REPORTE"); listaCabeceras.add("TUTORIAL"); listaCabeceras.add("PAGINA"); listaCabeceras.add("DIFICULTAD"); this.setDataModelCabecera(new ListDataModel( listaCabeceras)); try { List listaFila = null; for (int i = 0; i < 3; i++) { listaFila = new ArrayList(); listaFila.add(" " + i); listaFila.add("JAVA " + i); listaFila.add("Excel " + i); listaFila.add("Si " + i); listaFila.add("datojava.blogspot.com " + i); listaFila.add("Facil " + i); listaFinal.add(listaFila); } this.setDataModelContenido(new ListDataModel(listaFinal)); } catch (Exception ex) { ex.printStackTrace(); } finally { listaFinal = new ArrayList(); } }
DataModel
, ahora vamos a crear el método que arma el Excel:
Metodo: obtenerExcel
public static HSSFWorkbook obtenerExcel(DataModel contenidoCeldas, DataModel cabecerasCeldas, String nombreHoja) { HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet hssfSheet = hssfWorkbook.createSheet(nombreHoja); int numeroFila = 0; int numeroColumna = 0; // Crear una nueva fila HSSFRow hssfRow = hssfSheet.createRow(numeroFila++); // Estilo de la cabecera HSSFCellStyle hssfCellStyleCabecera = hssfWorkbook.createCellStyle(); hssfCellStyleCabecera.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); hssfCellStyleCabecera.setFillBackgroundColor(new HSSFColor.BLACK() .getIndex()); // Crear la fuente de la cabecera HSSFFont hssfFont = hssfWorkbook.createFont(); hssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); hssfFont.setColor(HSSFColor.WHITE.index); // Aplicarle la fuente al estilo de la cabecera hssfCellStyleCabecera.setFont(hssfFont); String columnaCabecera; // Creacion de la celda HSSFCell hssfCell = null; // Pasar los nombres de cabeceras a una lista List cabecerasExcel = (List) cabecerasCeldas.getWrappedData(); // Agregar los nombres de las cabeceras a el excel for (int i = 0; i < cabecerasExcel.size(); i++) { columnaCabecera = (String) cabecerasExcel.get(i); hssfCell = hssfRow.createCell((short) numeroColumna++); hssfCell.setCellValue(columnaCabecera); // Agregar el estilo que creamos antes hssfCell.setCellStyle(hssfCellStyleCabecera); hssfCell.setEncoding(HSSFCell.ENCODING_UTF_16); } // Pasar el contenido del excel a una lista List contenidoExcel = (List) contenidoCeldas.getWrappedData(); List fila = null; Object valor; for (int i = 0; i < contenidoExcel.size(); i++) { // Obtener el contenido por fila fila = (List) contenidoExcel.get(i); // Crear la fila hssfRow = hssfSheet.createRow(numeroFila++); numeroColumna = 0; for (int x = 0; x < fila.size(); x++) { // Obtener el valor de cada celda valor = fila.get(x); // Insertarlo en la celda hssfCell = hssfRow.createCell((short) numeroColumna++); hssfCell.setEncoding(HSSFCell.ENCODING_UTF_16); hssfCell.setCellValue((String) valor); } } return hssfWorkbook; }
DataModel
y el nombre de la hoja del Excel, Se crean las filas y columnas y también se le da estilo a la cabecera, puedes analizar el código y te darás cuenta de que es algo fácil, ahora solo falta el metodo principal para generar el reporte:
Metodo: exportarExcel
public void exportarExcel() { // Llenar la cabecera y el contenido del excel dataModelReporte(); // Hacer el excel con su cabecera y contenido HSSFWorkbook hssfWorkbook = obtenerExcel(dataModelContenido, dataModelCabecera, "datojava.blogspot.com"); try { // Guardar el Archivo FileOutputStream fileOutputStream = new FileOutputStream( "datojava.xls"); hssfWorkbook.write(fileOutputStream); fileOutputStream.close(); File file = new File("datojava.xls"); // Abrir el archivo Desktop.getDesktop().open(file); } catch (Exception e) { e.printStackTrace(); } }Recuerda que aqui estamos generando el reporte desde una aplicacion de escritorio, si quieres generar tu reporte desde una aplicación web, seria bueno que le eches un vistazo a la siguiente entrada. Te dejo el miniproyecto de este dato java con sus librerías para que lo descargues desde MEGA y lo utilices en tu sistema.
Temas Relacionados:
- Java excel, generar excel desde aplicación web. POI.
- JUnit. Prueba unitaria JUnit Eclipse/JBoss Developer Studio
- JNDI, JUnit datasource JBoss.
- Como cambiar estilos/colores de celdas en reporte excel con Java.
- Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.
- Generar un reporte PDF con iText
disculpa en donde puedo encontrar el jar
ResponderEliminarorg.apache.poi.hssf.usermodel.HSSFCell
Hola amigo Eduardo, lo que me pides no es exactamente un JAR, es una clase que esta dentro de la librería poi, me imagino que tienes un error y debe ser porque esa clase no se encuentra en la versión de la librería poi que estas importando a tu proyecto, cambia de versión del poi.
EliminarSuerte.
hola es un gran aporte, pero me gustaria saber que es lo que realmente se hace en esta linea. "List contenidoExcel = (List) contenidoCeldas.getWrappedData(); " es que me marca un error al compilarlo.
ResponderEliminarHola Jose Alberto,
EliminarQué tipo de error dice tu IDE que es? En esa línea lo que hacemos es obtener toda la data del DataModel (DataModel que contiene la data de las celdas) y lo pasamos a una lista para posteriormente crear el Excel.
Suerte!!
Buen día, tendrás alguna respuesta a este mensaje de error que arroja al compilar tu código?
ResponderEliminarAbsent Code attribute in method that is not native or abstract in class file javax/faces/model/DataModel
Hola Costa Silva, es un poco difícil saberlo, te recomiendo que te bajes todo el proyecto y lo intentes de nuevo, si aun así no puedes, mándame todo el log de error para ayudarte a resolver el problema!
Eliminar