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 Puntos53050

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

    }
}

pWolfman_furry29 comentado Octubre 16, 2015

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 ingresa o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

  • leog.1992 ganó una medalla hace 19 horas

    Renovador - Received Buena Respuesta badge in resp…
  • leog.1992 ganó una medalla hace 19 horas

    Medallista - Received total of 10 badges
  • leog.1992 ganó una medalla hace 19 horas

    Buena Respuesta - Recibido +1 votos en respuesta
  • sagrario ganó una medalla hace 19 horas

    Buena Pregunta - Recibido +1 votos en pregunta
  • leog.1992 respondió hace 1 día

    ticket en java con mysql
  • leog.1992 ganó una medalla hace 1 día

    Antepasado - Primera visita hace más de 365 días
  • leog.1992 ganó una medalla hace 1 día

    Veterano - Primera visita hace más de 180 días
  • Leonardo-Tadei ganó una medalla hace 1 día

    Buena Respuesta - Recibido +1 votos en respuesta
  • nico140 ganó una medalla hace 3 días

    Buena Pregunta - Recibido +1 votos en pregunta

¿Eres Usuario Apple?

...

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

Conecta