viernes, 23 de abril de 2010

Reportes en Excel con JexcelApi

Siempre existe la duda entre los desarrolladores java, de como empezar a tratar documentos Excel desde el lenguaje Java. Sea en la lectura o escritura de los mismos.
El uso masivo de archivos e informes en excel en las distintas empresas.. obligan al desarrollador estar en la capacidad de emitir reportes en excel desde una aplicación Java. Esto permitirá poder combinar la capacidad de información de una base de datos en una presentación amigable y conocida como son los archivos Excel.
Es por ello, la necesidad de dar a conocer JexcelApi  una poderosa herramienta, muy útil para manejar los parámetros y valores de la conocida hoja Excel desde un programa Java. También es necesario dar a conocer que existe el proyecto Jakarta POI para el tratamiento de archivos en formato microsoft.


excel.jpg


JavaEE con JExcelApi - jxl

Para empezar a usar jexcel desde java .. tendremos que colocar la librería jxl.jar a nuestro aplicativo. Dicha librería la podemos descargar desde sourceforge.net . Personalmente recomiendo usar esta API antes que POI para el tratamiento de archivos excel.

Veremos la sintaxis de uso .. mediante un ejemplo de escritura de excel bastante simple.

log.info("Entrando ... reporteCertificados()");
  
  OutputStream out = null;

  try{

   res.setContentType("application/vnd.ms-excel");
   res.setHeader("Content-disposition", "attachment; filename=\"ParaCertificados.xls\"");
   res.setHeader("Content-type", "application/vnd.ms-excel");
   
   //ini:formato
   WritableFont cabeceraFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, true);
   WritableFont cuerpoFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false);
   WritableFont domicilioFont = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false); 
   
   WritableCellFormat fCabecera = new WritableCellFormat(cabeceraFont);
   fCabecera.setAlignment(Alignment.JUSTIFY);
   fCabecera.setVerticalAlignment(VerticalAlignment.CENTRE);
   fCabecera.setBackground(Colour.CORAL);
   fCabecera.setBorder(Border.ALL,BorderLineStyle.THIN);
   
   WritableCellFormat fCuerpo = new WritableCellFormat(cuerpoFont);
   fCuerpo.setAlignment(Alignment.LEFT);
   fCuerpo.setBorder(Border.ALL,BorderLineStyle.THIN);
   
   WritableCellFormat fCuerpo2 = new WritableCellFormat(domicilioFont);
   fCuerpo2.setAlignment(Alignment.LEFT);
   fCuerpo2.setBorder(Border.ALL,BorderLineStyle.THIN);
   
   //fin:formato
   
   WritableWorkbook w = Workbook.createWorkbook(res.getOutputStream());
   WritableSheet s = w.createSheet("Informe", 0); //Nombre de hoja

   s.setColumnView(0,10);//ini:seteamos el ancho de las columnas 
   s.setColumnView(1,20);
   s.setColumnView(2,20);
   s.setColumnView(3,20);
   s.setColumnView(4,25);
   s.setColumnView(5,10);
   s.setColumnView(6,15);
   s.setColumnView(7,15);
   s.setColumnView(8,10);
   s.setColumnView(9,10);
   s.setColumnView(10,30);
   s.setColumnView(11,20);
   s.setColumnView(12,20);

  //ini: armando el excel
   s.addCell(new Label(0, 0, "Nº",fCabecera)); //añadiendo celdas
   s.addCell(new Label(1, 0, "Nro. Certificado",fCabecera));
   s.addCell(new Label(2, 0, "Apellido Paterno",fCabecera));
   s.addCell(new Label(3, 0, "Apellido Materno",fCabecera));
   s.addCell(new Label(4, 0, "Nombres",fCabecera));
   s.addCell(new Label(5, 0, "DNI",fCabecera));
   s.addCell(new Label(6, 0, "Fecha Inicio",fCabecera));
   s.addCell(new Label(7, 0, "Fecha Fin",fCabecera));
   s.addCell(new Label(8, 0, "Año",fCabecera));
   s.addCell(new Label(9, 0, "Horas",fCabecera));
   s.addCell(new Label(10, 0, "Región",fCabecera));   
 
   List<map> lstData = serviceFactory.getReporteService().getDataReporte(Long.valueOf(IdTaller));
   
   int i=1;
   for(Map map:lstData){
    s.addCell(new Number(0,i, Integer.parseInt(map.get("ORDEN").toString()),fCuerpo));
    s.addCell(new Label(1, i, StringUtils.EMPTY,fCuerpo));
    s.addCell(new Label(2, i, map.get("APE_PAT").toString(),fCuerpo));
    s.addCell(new Label(3, i, map.get("APE_MAT").toString(),fCuerpo));
    s.addCell(new Label(4, i, map.get("NOMBRES").toString(),fCuerpo));
    s.addCell(new Label(5, i, map.get("DNI").toString(),fCuerpo));
    s.addCell(new Label(6, i, map.get("DIA_INI").toString()+ " de "+Utils.getMesLetras(new Integer(map.get("MES_INI").toString())) ,fCuerpo));
    s.addCell(new Label(7, i, map.get("DIA_FIN").toString()+ " de "+Utils.getMesLetras(new Integer(map.get("MES_FIN").toString())),fCuerpo));
    s.addCell(new Label(8, i, map.get("ANIO").toString(),fCuerpo));
    s.addCell(new Label(9, i, map.get("HORAS").toString(),fCuerpo));
    s.addCell(new Label(10, i, map.get("REGION").toString(),fCuerpo2));

    i++;
   }
   //fin:armando el excel
   
   w.write();
   w.close();
   
   
  } catch (Exception ex) {
   log.error(ex.getMessage(),ex);
   sendErrorMessage(req,"errors.excel.load");
  } finally {
   if (out != null)
       out.close();  
  }

  log.info("Saliendo ... reporteCertificados() - Reportes");
return null;




Para Profundizar en el Tema

Bueno espero que les sirva la información proporcionada ... se despide su amigo edisonjc7.. y como dice un amigo ... "seguiremos socializando el conocimiento" xD... chau

1 comentarios:

david dijo...

Hola Pedro.

Estoy generando ficheros excel con esta librería y tu código. En principio con el código que proporcionas creo que resuelvo todas mis dudas, pero me gustaría poner un color determinado en una celda, por ejemplo "#0058b2" o "#2b8ac4". El problema que encuentro es que el método setBackground utiliza el tipo enumerado Colour y no veo como poner un color personalizado.

Gracias por el post.

Salu2

Publicar un comentario