Páginas

24/9/14

Generar un reporte en Excel con Java.

Hacer reporte en Excel con java. Librería POI de apache

Java excel. Librería POI de apache.




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 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;
}
    



Una vez declarado los 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();
 }
}
    


Como vemos en el bloque de código anterior al final las listas se las seteamos a los respectivos 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;
}
    


El método anterior recibe los 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:

6 comentarios :

  1. disculpa en donde puedo encontrar el jar

    org.apache.poi.hssf.usermodel.HSSFCell

    ResponderEliminar
    Respuestas
    1. 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.

      Suerte.

      Eliminar
  2. 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.

    ResponderEliminar
    Respuestas
    1. Hola Jose Alberto,

      Qué 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!!

      Eliminar
  3. Buen día, tendrás alguna respuesta a este mensaje de error que arroja al compilar tu código?

    Absent Code attribute in method that is not native or abstract in class file javax/faces/model/DataModel

    ResponderEliminar
    Respuestas
    1. 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