guardias.CalendarioExcel.java Source code

Java tutorial

Introduction

Here is the source code for guardias.CalendarioExcel.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package guardias;

import exceptions.ExceptionColumnaDisponibilidad;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *
 * @author garciapj
 */
public class CalendarioExcel {

    private List<DiaCalendario> listadoDiasCalendario;

    //Se elimina la cabecera
    private static final int FILA_DEFINICION_GUARDIAS_PREVISTAS = 1;
    private static final int COMIENZO_FILAS = 2;
    private static final int COLUMNA_FECHA_MES = 0;
    private static final int COLUMNA_FESTIVO = 2;
    private static final int COLUMNA_PETICION = 8;

    private static final Double ERROR_GUARDIA_PREVISTA = -1.0;

    private static final String ES_FESTIVO = "F";

    public static final String PETICION_SILVIA = "S";
    public static final String PETICION_VICKY = "V";
    public static final String PETICION_ROBERTO = "R";
    public static final String PETICION_NURIA = "N";
    public static final String PETICION_CAROLINA = "C";

    public static final String CONSTANTE_FIESTA = "LIBRE";
    public static final String CONSTANTE_CONSULTA = "CONSULTA";

    private static final Logger LOGGER = Logger.getLogger(CalendarioExcel.class.getName());

    public CalendarioExcel(String ccalendarioxls, List<Medico> listaMedicos) {
        File excel = new File(ccalendarioxls);
        this.leerExcelFile(excel, listaMedicos);
    }

    private void leerExcelFile(File excelFile, List<Medico> listadoMedicos) {
        InputStream excelStream = null;
        try {
            excelStream = new FileInputStream(excelFile);
            // Representacin del ms alto nivel de la hoja excel.
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(excelStream);
            // Elegimos la hoja que se pasa por parmetro.
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);
            // Objeto que nos permite leer un fila de la hoja excel, y de aqu extraer el contenido de las celdas.
            HSSFRow hssfRow;
            // Obtengo el nmero de filas ocupadas en la hoja
            int rows = hssfSheet.getLastRowNum();
            // Cadena que usamos para almacenar la lectura de la celda
            Date cellCalendario;
            String cellFestivo;
            String cellPeticion;

            this.leerGuardiasPrevistas(hssfSheet.getRow(FILA_DEFINICION_GUARDIAS_PREVISTAS), listadoMedicos);

            List<DiaCalendario> listadoDias = new ArrayList<>();
            // Para este ejemplo vamos a recorrer las filas obteniendo los datos que queremos            
            for (int r = COMIENZO_FILAS; r < rows; r++) {
                hssfRow = hssfSheet.getRow(r);
                if (hssfRow == null) {
                    break;
                } else {
                    cellCalendario = hssfRow.getCell(COLUMNA_FECHA_MES).getDateCellValue();

                    if (cellCalendario != null) {
                        cellFestivo = hssfRow.getCell(COLUMNA_FESTIVO) == null ? ""
                                : hssfRow.getCell(COLUMNA_FESTIVO).getStringCellValue();
                        LOGGER.log(Level.FINE, "Row: {0} -> [Columna {1}: {2}] [Columna {3}: {4}] ",
                                new Object[] { r, COLUMNA_FECHA_MES, cellFestivo, COLUMNA_FESTIVO, cellFestivo });

                        DiaCalendario diaCalendario = new DiaCalendario();
                        diaCalendario.setTime(cellCalendario.getTime());

                        //Se comprueba si es sabado o Domingo
                        if (TratarFechas.esFinde(diaCalendario)) {
                            diaCalendario.setEsFinde(Boolean.TRUE);
                            //TODO setear nivel de importancia (cada dia del finde tiene una importancia)
                        } else {
                            diaCalendario.setEsFinde(Boolean.FALSE);
                        }

                        if (ES_FESTIVO.equalsIgnoreCase(cellFestivo)) {
                            //Por norma general los festivos se pondrn a dedo
                            diaCalendario.setEsFestivo(Boolean.TRUE);
                        } else {
                            diaCalendario.setEsFestivo(Boolean.FALSE);
                        }

                        //No se tiene en cuenta que tipo de falta tiene (solo tiene que estar vacio)
                        this.obtenerDisponibilidadMedicosEnExcel(listadoMedicos, hssfRow, diaCalendario,
                                listadoMedicos);

                        cellPeticion = hssfRow.getCell(COLUMNA_PETICION) == null ? ""
                                : hssfRow.getCell(COLUMNA_PETICION).getStringCellValue();
                        LOGGER.log(Level.FINE, "----{0}", cellPeticion);
                        diaCalendario.setPeticionMedico(cellPeticion);

                        listadoDias.add(diaCalendario);
                    }
                }
            }
            this.setListadoDiasCalendario(listadoDias);
        } catch (FileNotFoundException fileNotFoundException) {
            LOGGER.log(Level.WARNING, "The file not exists (No se encontro el fichero): {0}",
                    fileNotFoundException);
        } catch (IOException ex) {
            LOGGER.log(Level.WARNING, "Error in file procesing (Error al procesar el fichero): {0}", ex);
        } catch (ExceptionColumnaDisponibilidad ex) {
            LOGGER.log(Level.WARNING,
                    "Error en lectura de celdas al leer la dispoibilidad, hay alguna celda que no es ni "
                            + CONSTANTE_FIESTA + " ni " + CONSTANTE_CONSULTA + "{0}",
                    ex);
        } finally {
            try {
                excelStream.close();
            } catch (IOException ex) {
                LOGGER.log(Level.WARNING,
                        "Error in file processing after close it (Error al procesar el fichero despues de cerrarlo): {0}",
                        ex);
            }
        }
    }

    private void leerGuardiasPrevistas(HSSFRow row, List<Medico> listaMedicos) {
        for (Medico medico : listaMedicos) {
            medico.setTotalGuardiasPrevistasPeriodo(
                    this.obtenerGuardiasPrevistasExcel(row, medico.getColumnaExcel()));
        }
    }

    private int obtenerGuardiasPrevistasExcel(HSSFRow row, int columnaMedico) {
        Double d = row.getCell(columnaMedico) == null ? ERROR_GUARDIA_PREVISTA
                : row.getCell(columnaMedico).getNumericCellValue();
        return d.intValue();
    }

    private void obtenerDisponibilidadMedicosEnExcel(List<Medico> listaMedicos, HSSFRow hssfRow,
            DiaCalendario diaCalendario, List<Medico> listadoMedicos) throws ExceptionColumnaDisponibilidad {
        for (Medico medico : listaMedicos) {
            this.comprobarDisponibilidadExcel(hssfRow, diaCalendario, medico.getColumnaExcel(),
                    medico.getSiglaExcel(), listadoMedicos);
        }
    }

    private void comprobarDisponibilidadExcel(HSSFRow hssfRow, DiaCalendario diaCalendario, int opcionDisponible,
            String siglaMedico, List<Medico> listadoMedicos) throws ExceptionColumnaDisponibilidad {
        if (hssfRow.getCell(opcionDisponible) == null
                || "".equals(hssfRow.getCell(opcionDisponible).getStringCellValue())) {
            Medico medico = Medico.getMedicoPorSigla(listadoMedicos, siglaMedico);
            diaCalendario.agregarMedicoDisponible(medico);
        } else if (!hssfRow.getCell(opcionDisponible).getStringCellValue().equalsIgnoreCase(CONSTANTE_FIESTA)
                && !hssfRow.getCell(opcionDisponible).getStringCellValue().equalsIgnoreCase(CONSTANTE_CONSULTA)) {
            throw new ExceptionColumnaDisponibilidad();
        }
    }

    public List<DiaCalendario> getListadoDiasCalendario() {
        return listadoDiasCalendario;
    }

    public void setListadoDiasCalendario(List<DiaCalendario> listadoDiasCalendario) {
        this.listadoDiasCalendario = listadoDiasCalendario;
    }
}