entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

duda con retorno de carro con Excel , apache POI y CSV en java

Buenos días comunidad.
Estoy trabajando en un proyecto informático, el cual consiste en un proceso
de importación de registros en Excel, para ello, quiero tomar a través de un formulario
en JSP un archivo (XLSX o XLS) para dar paso a la importación en una base de datos en Access (.mdb).

Como primera tarea para dar inicio a este paso, usé las librerías de apache POI para leer la
información proveniente del archivo en Excel.

Así mismo, he conseguido construir un archivo CSV, mismo que quiero usar para validar los campos del excel antes de importar, pero éste no delimita el principio y final de las filas de la tabla en excel, por lo que sólo logro conseguir
texto plano como el siguiente:

ID,VISITA,ESTATUS_VISITA,APELLIDO_PATERNO,APELLIDO_MATERNO,NOMBRE,EDAD_HR,50,03,pedro,ramos,millán,22

éste es mi código:

StringBuffer data=new StringBuffer();
         String extension=xArchivoEntrada.substring(xArchivoEntrada.lastIndexOf(".".toString().toLowerCase()));//Recupero la extensión
          if(extension.equals(".xlsx")){//Si es .xlsx(2007-presente)      
              try{
                  String pathSalida=path+"\\CsbOut\\";
                  File carpeta=new File(pathSalida);                
                  if(!carpeta.exists())
                      carpeta.mkdirs();

                  File salida=new File(pathSalida+""+"Xlsx_Csv1.csv");
                  FileOutputStream fos=new FileOutputStream(salida);
                  XSSFWorkbook wb=new XSSFWorkbook(new FileInputStream(xArchivoEntrada));

                  XSSFSheet sheet=wb.getSheetAt(0);
                  Row row=null;
                  Cell cell=null;

                  Iterator<Row>rowIterator=sheet.iterator();
                  while(rowIterator.hasNext()){
                      row=rowIterator.next();

                  Iterator<Cell>cellIterator=row.cellIterator();
                  while(cellIterator.hasNext()){
                      cell=cellIterator.next();       

                    switch(cell.getCellType()){

                        case Cell.CELL_TYPE_STRING:                     

                            data.append(cell.getStringCellValue()+ ",");
                            lista.add(cell.getStringCellValue());

                            break;
                        case Cell.CELL_TYPE_NUMERIC:

                            data.append(cell.getNumericCellValue()+ ",");

                            lista.add(cell.getNumericCellValue());

                            break;                            
                        case Cell.CELL_TYPE_BLANK: 

                            data.append("#########EN BLANCO##########"+",");

                            lista.add("#########EN BLANCO##########");//¿Puedo usarlo como validación?
                            break;

                        default:
                            data.append(cell+","+"\r\n");
                            break;         
                    }  
                  }
                  }
                  fos.write(data.toString().getBytes());
                  fos.close();
                  receiveList(lista, out,path);
              }catch(Exception er){
                  out.println(er);
              }               

Ahora bien, Usé las secuecias de escape "\r\n" en las líneas:

StringBuffer data=new StringBuffer();
         String extension=xArchivoEntrada.substring(xArchivoEntrada.lastIndexOf(".".toString().toLowerCase()));//Recupero la extensión
          if(extension.equals(".xlsx")){//Si es .xlsx(2007-presente)      
              try{
                  String pathSalida=path+"\\CsbOut\\";
                  File carpeta=new File(pathSalida);                
                  if(!carpeta.exists())
                      carpeta.mkdirs();

                  File salida=new File(pathSalida+""+"Xlsx_Csv1.csv");
                  FileOutputStream fos=new FileOutputStream(salida);
                  XSSFWorkbook wb=new XSSFWorkbook(new FileInputStream(xArchivoEntrada));

                  XSSFSheet sheet=wb.getSheetAt(0);
                  Row row=null;
                  Cell cell=null;

                  Iterator<Row>rowIterator=sheet.iterator();
                  while(rowIterator.hasNext()){
                      row=rowIterator.next();

                  Iterator<Cell>cellIterator=row.cellIterator();
                  while(cellIterator.hasNext()){
                      cell=cellIterator.next();       

                    switch(cell.getCellType()){

                        case Cell.CELL_TYPE_STRING:                     
                            int r=row.getRowNum();
                            if(r==r){
                            data.append(cell.getStringCellValue()+ ",");
                            lista.add(cell.getStringCellValue());
                            }
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            int px=row.getRowNum();
                            if(px==px){
                            data.append(cell.getNumericCellValue()+ ",");
                            }
                            lista.add(cell.getNumericCellValue());

                            break;                            
                        case Cell.CELL_TYPE_BLANK: 
                            int lel=row.getRowNum();
                            if(lel==lel){
                            data.append("#########EN BLANCO##########"+",");
                            }
                            lista.add("#########EN BLANCO##########");//¿Puedo usarlo como validación?
                            break;

                        default:
                            data.append(cell+","+"\r\n");
                            break;         
                    }  
                  }
                  }
                  fos.write(data.toString().getBytes());
                  fos.close();
                  receiveList(lista, out,path);
              }catch(Exception er){
                  out.println(er);
              }               

Y la nueva salida es:

ID,
VISITA,
ESTATUS_VISITA,
APELLIDO_PATERNO,
APELLIDO_MATERNO,
NOMBRE,
EDAD_HR,
50,
03,
pedro,
ramos,
millán,
22

Mi duda radica en saber cómo validar la salida del CSV en función al final de las filas de las tablas.
De antemano muchas gracias.

1 Respuesta

3votos

carlossevi Puntos63580

Tienes que añadir el retorno de carro cada vez que detectas que hay un cambio de línea, ¿cómo? en el iterador de filas.

En el fragmento de tu código:

XSSFSheet sheet=wb.getSheetAt(0);
Row row=null;
Cell cell=null;

// Iteras las filas:
Iterator<Row>rowIterator=sheet.iterator();
while(rowIterator.hasNext()){
    row=rowIterator.next();

    // Aquí, cada vez que se cambia de fila
    // añades un retorno de carro:
    data.append(cell+","+"\r\n");

    // Dentro de la fila, iteras las celdas:
    Iterator<Cell>cellIterator=row.cellIterator();
    while(cellIterator.hasNext()){
        cell=cellIterator.next();

        // ... Resto de tu código

    }
}

1voto

pWolfman_furry29 comentado

Muchas gracias Carlosssevi. el archivo de salida csv ha quedado delimitado entre
el principio y el final de la tabla.
No cabe duda que ésta fue una respuesta eficiente.
Una vez más. Gracias

ID,VISITA,ESTATUS_VISITA,APELLIDO_PATERNO,APELLIDO_MATERNO,NOMBRE,EDAD_HR
50,03,cerrada,pedro,ramos,millán,22
51,05,abierta,josé,pérez,estrada,20

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta