reporteExcel

mi objetivo primario es tener una tablemodel generico pero para eso he tenido que leer conceptos que son nuevos para como reflexion e introespecion y me a parecido lo cool lo que uno puefo estandarizar para no repetir el mismo proceso cada vez que lo necesitamos y para practicar los conceptos quise hacer un reporte de excel generico tan solo es pasar un list de cualquier tipo de objecto y te genera un excel
falta pulirle ciertas cosas como :

el ordeen de encabezado y datos no me cuadra
mis tipos de datos compuestos no me los toma

pero hacer su trabajo espero que me den ideas para terminarlo y quede super cool
aqui comparto para que es nuevo en estos temas tenga ejemplo concreto para facilitar su aprendisaje.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

public class ReporteExcel
{
     private static HSSFWorkbook workbook;
 
       public static <T> void  writeReportToExcel(List<T> data)
       {
        try {
                workbook = new HSSFWorkbook();
                HSSFCellStyle csText = workbook.createCellStyle();
                csText.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
                csText.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csText.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csText.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csText.setBorderTop(HSSFCellStyle.BORDER_THIN);
               
                HSSFCellStyle csTitle = workbook.createCellStyle();
                csTitle.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
                csTitle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csTitle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csTitle.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csTitle.setBorderTop(HSSFCellStyle.BORDER_THIN);
                HSSFFont font = workbook.createFont();
                font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
                csTitle.setFont(font);
               
                HSSFCellStyle csBool = workbook.createCellStyle();
                csBool.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csBool.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csBool.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csBool.setBorderTop(HSSFCellStyle.BORDER_THIN);
               
                HSSFCellStyle csDecNum = workbook.createCellStyle();
                csDecNum.setDataFormat(workbook.createDataFormat().getFormat("#,##0.#####"));
                csDecNum.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csDecNum.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csDecNum.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csDecNum.setBorderTop(HSSFCellStyle.BORDER_THIN);
               
                HSSFCellStyle csIntNum = workbook.createCellStyle();
                csIntNum.setDataFormat(workbook.createDataFormat().getFormat("#,##0"));
                csIntNum.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csIntNum.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csIntNum.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csIntNum.setBorderTop(HSSFCellStyle.BORDER_THIN);
               
                HSSFCellStyle csDateTime = workbook.createCellStyle();
                csDateTime.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"/*opt.getDateTimeFormat()*/));
                csDateTime.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                csDateTime.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                csDateTime.setBorderRight(HSSFCellStyle.BORDER_THIN);
                csDateTime.setBorderTop(HSSFCellStyle.BORDER_THIN);
           
                HSSFSheet sheet = workbook.createSheet(data.get(0).getClass().getName());
                int rowCount = 0;
                int columnCount = 0;
                Row row = sheet.createRow(rowCount++);
                for (String fieldName : setupFieldsForClass(data.get(0).getClass()))
                {
                     Cell cell = row.createCell(columnCount++);
                     cell.setCellValue(fieldName);
                }
            if(data.size()>0)
            {    
                for(int i=0; i<data.size();i++)
                {
                      row = sheet.createRow(rowCount++);
                      columnCount =0;
                      for( Method m : data.get(i).getClass().getMethods())
                      {
                          if (m.isAnnotationPresent(Column.class) )
                          {
                                  System.out.println("metodos:"+m.getName());
                                  Method me = data.get(i).getClass().getMethod(m.getName());
                                  Object value = me.invoke(data.get(i), new Object[0]);
                                  Cell cell = row.createCell(columnCount++);
                                  System.out.println("aja:"+value);
                                  if (value != null)
                                  {
                                        if (value instanceof String)
                                        {
                                              cell.setCellValue(value.toString());
                                              cell.setCellStyle(csText);
                                        }
                                        else if (value instanceof Integer ||
                                                 value instanceof Short ||
                                                 value instanceof Long ||
                                                 value.getClass()==Integer.TYPE ||
                                                 value.getClass()==Short.TYPE ||
                                                 value.getClass()==Long.TYPE)
                                        {
                                                 cell.setCellValue(Double.parseDouble(value.toString()));
                                                 cell.setCellStyle(csIntNum);
                                        }    
                                       else if (value instanceof BigDecimal ||
                                                value instanceof Double ||
                                                value instanceof Float ||
                                                value.getClass()==Double.TYPE ||
                                                value.getClass()==Float.TYPE)
                                       {
                                                cell.setCellValue(Double.parseDouble(value.toString()));
                                                cell.setCellStyle(csDecNum);
                                       }
                                       
                                        else if (value instanceof Boolean)
                                        {
                                                 cell.setCellValue(((Boolean)value).booleanValue());
                                                 cell.setCellStyle(csBool);
                                         }
           
                                         else if (value.getClass().equals(boolean.class))
                                         {
                                                  cell.setCellValue(((Boolean)value).booleanValue());
                                                  cell.setCellStyle(csBool);
                                         }
           
                                         else if (value instanceof Date ||
                                                  value instanceof java.util.Date ||
                                                  value instanceof java.sql.Timestamp)
                                         {
                                                  cell.setCellValue((java.util.Date)value);
                                                  cell.setCellStyle(csDateTime);
                                         }
                                       
                                        else {
                                                  cell.setCellValue("");
                                                  cell.setCellStyle(csText);
                                          }}}}}
           
               generarExcel();
            }
           
            else
            {
                UtilFrame.setMensajeInformation("No hay datos Para exportar  a Excel", "INFORMACION");
            }
           
            }
            catch (Exception ex)
            {
                UtilFrame.setMensajeInformation("Problemas a generar el reporte", "INFORMACION");
            }
       }
       
           public  static List<String> setupFieldsForClass(Class<?> clazz) throws Exception
           {  List<String>listaCampos = new  ArrayList<String>();
              Field[] fields = clazz.getDeclaredFields();
              for (int i = 0; i < fields.length; i++)
              {
                 listaCampos.add(fields[i].getName());
              }
              return listaCampos;
           }
           
           private static void generarExcel()
           {
               try
                  {
                     FileOutputStream out = new FileOutputStream(new File("C:\\new.xls"));
                     workbook.write(out);
                     out.close();
                  }
                  catch (FileNotFoundException e)
                  {
                      UtilFrame.setMensajeError("Error al generar Informe de excel.", "ERROR");

                  }
                  catch (IOException e)
                  {
                      UtilFrame.setMensajeError("Error al generar Informe de excel.", "ERROR");
                  }
           }
   
}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

no se porque

cuando uso:

if (m.isAnnotationPresent(Column.class) )

no me trae en el orden definido en la clase