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.