Páginas

18/3/15

Estilo y color en celdas Excel desde Java

Estilo y color en celdas Excel desde Java.

Color en reporte Excel desde Java. Estilos en las celdas.

Estilos Excel Java



Para ponerle color a las celdas en un Excel desde Java es fácil, en este ejemplo vamos a construir el Excel (Si no sabes cómo hacerlo puedes aprenderlo aquí), vamos a ponerle color a las celdas dependiendo de un dato que en el mismo Excel se encuentra. Por ejemplo nos dan un requerimiento para un reporte con estas columnas "ID, NOMBRE, INGRESO" y en el mismo se pide:
  • Si el ingreso de un cliente está entre (0 - 100) esta celda debe ser de color ROJO
  • Si el ingreso de un cliente está entre (100 - 600) esta celda debe ser de color AMARILLO
  • Si el ingreso de un cliente es mayor a 600 esta celda debe ser de color VERDE
Después que ya creamos todo el Excel vamos a recorrerlo de nuevo y le vamos a dar el estilo correspondiente dependiendo del ingreso del cliente. Este es el método para que lo hagas:
 /**
  * 
  * @param hssfWorkbook = El excel completo
  * @param numCelda = el numero de la celda que cambiara
  * 
  * @author datojava.blogspot.com
  */
 public void colorCeldas(HSSFWorkbook hssfWorkbook, int numCelda) {
  HSSFSheet mySheet = hssfWorkbook.getSheetAt(0);

  // Creamos el estilo de celda del color ROJO
  HSSFCellStyle styleGroup3 = hssfWorkbook.createCellStyle();
  styleGroup3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  styleGroup3.setFillForegroundColor(HSSFColor.RED.index);

  // Creamos el estilo de celda del color AMARILLO
  HSSFCellStyle styleGroup2 = hssfWorkbook.createCellStyle();
  styleGroup2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  styleGroup2.setFillForegroundColor(HSSFColor.YELLOW.index);

  // Creamos el estilo de celda del color VERDE
  HSSFCellStyle styleGroup1 = hssfWorkbook.createCellStyle();
  styleGroup1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  styleGroup1.setFillForegroundColor(HSSFColor.GREEN.index);

  
  // Recorrer cada columna del excel
  // Comenzamos en 1 porque la 0 es el header del excel
  for (int i = 1; i <= mySheet.getLastRowNum(); i++) {
   HSSFRow myRow = mySheet.getRow(i);

   // Recorremos sobre cada celda de la columna seleccionada
   Iterator cellIter = myRow.cellIterator();
   while (cellIter.hasNext()) {

    HSSFCell myCell = (HSSFCell) cellIter.next();
    
    // Cuando sea la celda correcta
    if (myCell.getCellNum() == numCelda) {
    
     // Hay que parsear el contenido de la celda de ser necesario, 
     // La mayoría de las veces insertamos datos como "String"
     if (Integer.parseInt(myCell.toString()) >= 0
       && Integer.parseInt(myCell.toString()) <= 100) {
       
      // Aplicamos el estilo correspondiente ROJO
      myCell.setCellStyle(styleGroup3);
     } else if (Integer.parseInt(myCell.toString()) > 100
       && Integer.parseInt(myCell.toString()) < 600) {
       
      // Aplicamos el estilo correspondiente AMARILLO
      myCell.setCellStyle(styleGroup2);
     } else if (Integer.parseInt(myCell.toString()) > 600) {
     
      // Aplicamos el estilo correspondiente VERDE
      myCell.setCellStyle(styleGroup1);
     }
    }
   }
  }
 }
Todo esta explicado en el mismo código, ojo este método es para darle estilo a las celdas una vez que el Excel ya está hecho, en el caso contrario puedes darle el estilo a la celda desde el principio. Si estas siguiendo el ejemplo anterior para crear las celdas con colores en el Excel deberías llamar este método justamente después de obtener el Excel completamente, para refrescar la memoria este es el método exportarExcel() que ejecuta el Excel, justamente en la línea 12 hacemos el llamado para cambiar el color de la celda que queremos dependiendo de el dato que esta contenga:

Método: 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");
  
  //Pasamos el "2" suponiendo que esa sea la celda
  //AQUI LA LLAMADA
  colorCeldas(hssfWorkbook, 2);

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

Un plus, si no sabes cómo hacer un autosize en las celdas del Excel desde Java para que aparezca todo el contenido de cada celda aprende aquí:
   /**
    * Primero obtenemos la primera hoja del excel, despues la primera
    * columna que viene siendo la cabecera y despues la cantidad de celdas
    * que tiene esa columna para darle autosize a cada celda en el for.
    */
   for (int i = 0; i < hssfWorkbook.getSheetAt(0).getRow(0)
     .getLastCellNum(); i++) {
    hssfWorkbook.getSheetAt(0).autoSizeColumn((short) i);
   }
 
Ya con este dato java no solo puedes darle color a una celda, puedes hacer muchas cosas, por ejemplo, la letra, el tamaño, color de letra, tamaño de la celda, queda a tu imaginación. Suerte.


Temas Relacionados:

9 comentarios :

  1. Buen post. Gracias por el aporte

    ResponderEliminar
    Respuestas
    1. Excelente Sergio Jose, gracias por comentar.

      Suerte!!!

      Eliminar
  2. Gracias, claro y realmente lo que se necesita

    ResponderEliminar
  3. Buen aporte me sirvio mucho gracias :D

    ResponderEliminar
  4. Alexander Velazquez29 de agosto de 2017, 17:23

    Asi es como creo mi archivo excel, como podria agregar estilos a mi celdas, si todas ellas se llenan dinamicamente:
    Este es mi codigo
    //creacion de archivo excel
    final int a=40;//Horas que se deben registrar por semana
    try{
    Thread t= new Thread(){
    public void run(){

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet hoja= workbook.createSheet("REGISTRO INCORRECTO");

    Este viene siendo como mi cabezera
    //se crean los campos de la base de datos para que aparezcan en el archivo excel
    XSSFRow fila= hoja.createRow(0);
    fila.createCell(0).setCellValue("NOMBRE");
    fila.createCell(1).setCellValue("HORAS REGISTRADAS");
    fila.createCell(2).setCellValue("TOTAL DE HORAS");
    fila.createCell(3).setCellValue("HORAS POR REGISTRAR");

    jProgressBar1.setMaximum(jTable1.getRowCount());
    XSSFRow filas;
    Rectangle rect;

    for(int z=0; z<jTable1.getRowCount(); z++){
    rect= jTable1.getCellRect(z,0,true);
    try{
    jTable1.scrollRectToVisible(rect);

    }catch(java.lang.ClassCastException e){}
    jTable1.setRowSelectionInterval(z, z);
    jProgressBar1.setValue(z+1);
    //SE CREAN LAS FILAS DE LA HOJA DE EXCEL
    filas= hoja.createRow(z+1);
    filas.createCell(0).setCellValue(jTable1.getValueAt(z,0).toString());
    filas.createCell(1).setCellValue(jTable1.getValueAt(z,1).toString());
    filas.createCell(2).setCellValue(a);

    //este try es para poder aumnetar o disminuir la lentitud de la barra de cargar PROGRESSBAR
    try{
    Thread.sleep(100);

    }catch (InterruptedException ex){
    Logger.getLogger(interfaz.class.getName()).log(Level.SEVERE,null,ex);
    }

    }//for

    jProgressBar1.setValue(0);
    jProgressBar1.setString("ARCHIVO EXCEL CREADO");

    try{
    workbook.write(new FileOutputStream(new File(ruta+"//Error_RegEsfuerzo.xlsx")));
    Desktop.getDesktop().open(new File(ruta+"//Error_RegEsfuerzo.xlsx")); // para abrir excel autimaticamente
    }catch(IOException ex){

    Tal vez sea igual que tu ejemplo pero si me gustaria mas o menos una orientacion, soy nuevo con los exceles.
    saludos

    ResponderEliminar
  5. Bastante bueno el tutorial! Da gusto ver que hay personas que comparten sus conocimientos para apoyar a quienes estamos aprendiendo! Saludos...

    ResponderEliminar
    Respuestas
    1. Hola Francisco, esa es la idea, compartir el conocimiento ya que todos pasamos por ahí! Saludos!

      Eliminar