Java: cómo insertar una fila en una tabla db después de leer el archivo de Excel

Puedo leer los datos del archivo de Excel del siguiente código, pero no puedo obtener la lógica detrás de cómo obtener datos de Excel para almacenarlos en la clase POJO después de leer el archivo de Excel.

En resumen: estoy confundido sobre cómo enviar estos datos leídos de Excel a mi clase de modelo para que se almacenen en la tabla de mi base de datos.

El siguiente código imprime correctamente las filas de Excel en mi consola Eclipse:

                     ..............
                          ..............
        public String execute()
        {
            try
            { 
                 String filePath=servletRequest.getSession().getServletContext().getRealPath("/"); 
                 File fileToCreate= new File(filePath,this.excelDataFileName);
                 FileUtils.copyFile(this.excelData, fileToCreate); 
                 UploadExcel obj=new UploadExcel();
                 obj.readExcel(excelData.getAbsolutePath()); 

            }
            catch(Exception e){
                e.printStackTrace();
                addActionError(e.getMessage());
                return INPUT;
            }
            return SUCCESS;
        }


        /*
         *Method to read the each sheet ,row & column of the excel sheet of the uploaded xls file  
        */
        public void readExcel(String filePath)
        { 
            try
             {
                FileInputStream file=new FileInputStream(new File(filePath));

                //Getting the instance for XLS file 
                 HSSFWorkbook workbook=new HSSFWorkbook(file);

                 //Get First sheet from the workbook
                HSSFSheet sheet=workbook.getSheetAt(0);

                 ArrayList myList = new ArrayList();
                //Iterate start from the first sheet of the uploaded excel file
                  Iterator<Row> rowIterator = sheet.iterator();
                  while(rowIterator.hasNext())
                  {
                      Row  row=rowIterator.next();

                      if(row.getRowNum()==0)
                      {
                          continue;//skip to read the first row of file
                      }

                      //For each row, iterate through each columns
                      Iterator<Cell> cellIterator=row.cellIterator();

                      while(cellIterator.hasNext())
                      {
                          Cell cell=cellIterator.next();
                          if(cell.getColumnIndex()==0)
                          {
                              continue;
                          }
                          switch(cell.getCellType())
                          {
                             case Cell.CELL_TYPE_BOOLEAN:
                                  System.out.print(cell.getBooleanCellValue() + "\t\t");
                                 // myList.add(cell.getBooleanCellValue());
                                  break;
                             case Cell.CELL_TYPE_NUMERIC:
                                 System.out.print(cell.getNumericCellValue()+ "\t\t");
                                //  myList.add(cell.getNumericCellValue());
                                 break;
                             case Cell.CELL_TYPE_STRING:
                                 System.out.print(cell.getStringCellValue()+ "\t\t");
                                // myList.add(cell.getStringCellValue());
                                 break;
                          }

                      }     
                      System.out.println(""); 


                  }
                  file.close();
                FileOutputStream out=
                        new FileOutputStream(new File(filePath));

                  workbook.write(out);
                  out.close();



            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }




    }

En la salida de la consola:

TEXTit      6695 PROSPECT RD        Nova Scotia     B3z 3t1 

row2sdfsda      61695 P         sfsdfdsf        23B3z 3t1   

Lo que pensé es: tengo que obtener la fila una por una y agregaré los datos de esta fila a mi objeto de clase POJO y lo enviaré a dao, y finalmente usaré saveOrupdate(tableobj) del método de hibernación para guardar los datos en mi tabla db.

Pero no pude pensar cómo puedo agregar estos datos a mi clase Pojo.

Espero que alguien pueda ayudarme aquí.

preguntado el 11 de septiembre de 13 a las 14:09

No envíes cada fila a tu DAO una por una. Será terriblemente lento ... Puede simplemente pasar una Lista de su tipo de objeto y hacerlo en 1 transacción limpia con una inserción por lotes:

@steelshark, ¿puede publicar una respuesta como sugirió? Estoy aprendiendo hibernación de struts2, no pude obtener las cosas que dijiste en este comentario. -

@steelshark escribí código aquí ¡Haga clic aquí! como sugirió en su comentario, pero no se está insertando en mi base de datos, ni muestra ningún error:

2 Respuestas

Puede inyectar/pasar una referencia a su DAO en la clase UploadExcel. Luego, cuando esté en el método readExcel(), puede crear una nueva ENTIDAD y llenarla con valores.

                  Entity entity = new Entity();


                  while(cellIterator.hasNext())
                  {
                      Cell cell=cellIterator.next();
                      if(cell.getColumnIndex()==0)
                      {
                          continue;
                      }
                      switch(cell.getCellType())
                      {
                         case Cell.CELL_TYPE_BOOLEAN:
                              entity.setBooleanValue(cell.getBooleanValue);
                              break;
                         ...
                      }

                  }   

Finalmente, inserta/crea o actualiza su entidad por su DAO.

                  dao.insertOrUpdate(entity);

* EDITAR * Código para explicar el comentario

La entidad es solo un ejemplo de entidad personalizada que modela los datos que lee de Excel. Si, por ejemplo, su Excel contiene datos sobre el Cliente, puede crear una entidad de cliente.

public class Customer {

    private String name;
    private String surname;
    private Integer age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
       return name;
    }

    // + getters and setters for other fields
}    

Luego, envía esta entidad llena de datos de Excel a su DAO (que administra la tabla de clientes) e inserta la entidad dada en la base de datos.

* EDIT2 *

Eliminar "dao.saveOrUpdateCompany(empresa);" del siguiente código:

    public String execute()
    {
        try
        { 
             String filePath=servletRequest.getSession().getServletContext().getRealPath("/"); 
             File fileToCreate= new File(filePath,this.excelDataFileName);
             FileUtils.copyFile(this.excelData, fileToCreate); 
             UploadExcel obj=new UploadExcel();
             obj.readExcel(excelData.getAbsolutePath());  
        }
        catch(Exception e){
            e.printStackTrace();
            addActionError(e.getMessage());
            return INPUT;
        }
        return SUCCESS;
    }

Quiere una nueva entidad POR FILA, ahora solo crea una entidad al comienzo de la clase

Leer comentarios siguiendo el código

    public void readExcel(String filePath)
    { 
        try
         {
             List sheetData = new ArrayList();
            FileInputStream file=new FileInputStream(new File(filePath));

            //Getting the instance for XLS file 
             HSSFWorkbook workbook=new HSSFWorkbook(file);

             //Get First sheet from the workbook
            HSSFSheet sheet=workbook.getSheetAt(0);

            //Iterate start from the first sheet of the uploaded excel file
              Iterator<Row> rowIterator = sheet.iterator();

              while (rowIterator.hasNext()) {
                   Row row = (Row) rowIterator.next();

                   // CHANGE 
                   Company company = new Company();
                   company.setName(getCellValue(row.getCell((short)1)));

                   // HERE YOU CAN SAVE COMPANY 
                   dao.saveOrUpdateCompany(company);

                   // OR ADD COMPANY TO LIST 
                   // List<Company> companies = new ArrayList<Company>();
                   // Declare just one list for entire class not per row
                   // In this case you call custom made DAO method which batch save
                   // all company entities in list but you call this custom method
                   // at the end of excel processing (your original dao code position).
                   // Try it without list first  
                   list.add(company);    


              }



              System.out.println("Seet data size-"+sheetData.size());
              file.close();
            FileOutputStream out=
                    new FileOutputStream(new File(filePath));

              workbook.write(out);
              out.close();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

* EDIT3 *

Creo que esto finalmente debería funcionar.

       try{
            session=HibernateUtil.getSessionFactory().openSession();
            transaction=session.beginTransaction();
            for(int i=0;i<companies.size();i++)
            {   
                // THIS IS BAD 
                //Company com=new Company();
                //You need this
                Company com = companies.get(i);
                session.saveOrUpdate(com);
            }
            transaction.commit();
            status++;

        }

Respondido el 12 de Septiembre de 13 a las 13:09

De qué paquete el Entity ¿pertenece a? - principiante

Usé entidad como ejemplo. Tendrá su propio bean de Entidad personalizado (POJO), por ejemplo, Cliente. Entonces, en su caso, está leyendo valores de Excel para que pueda completar los campos en su objeto de entidad personalizado. El cliente puede tener campos como: nombre, apellido, edad. Luego, cuando itera las celdas de Excel, asigna valores a su objeto de entidad, por ejemplo, customer.setName (cell.getStringValue) si la celda contiene el nombre del cliente. - tomastrajan

Intenté lo mismo que dijiste, pero está insertando muchas filas nulas con datos no exactos en los campos de la columna de la tabla. P.ej. insertó el nombre en la columna de dirección y otros datos en una columna diferente. If it is possible, please post almost complete code, for me. I have shown all my model,& pojo in above question. Soy nuevo en esto, tratando de aprender pero estructurado aquí desde los últimos 2 días. - principiante

gracias de esta manera está funcionando bien. Pero quiero hacer lo mismo de la segunda manera como sugeriste en tus últimos comentarios como List<Company> companies = new ArrayList<Company>();... Bueno, déjame intentar hacer esto, si vuelvo a tener algún problema relacionado con esto, entonces puedo preguntarte aquí... - principiante

hola, el primer método funcionó pero es demasiado lento, por eso probé el segundo método, pero muestra un error Rollback:org.hibernate.MappingException: Unknown entity: java.util.ArrayList Intenté pasar ` dao.saveOrUpdateCompany(companies);` desde la acción y luego en mi DAO, defino mi método DAO comenzando con public int saveOrUpdateCompany(List<Company> companies){....} pero DAO está arrojando un error - principiante

     Iterator iterator = workSheet.rowIterator();
          while (iterator.hasNext()) {
         Row row = (Row) iterator.next();
// check each cell for null and by using getCellValue() method. and inject the value in to user defined pojo.
    }


 private String getCellValue(Cell cell) {
        if (cell == null) {
            return null;
        }
        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
            return cell.getStringCellValue();
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return cell.getNumericCellValue() + "";
        } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return cell.getBooleanCellValue() + "";
        }else if(cell.getCellType() == Cell.CELL_TYPE_BLANK){
            return cell.getStringCellValue();
        }else if(cell.getCellType() == Cell.CELL_TYPE_ERROR){
            return cell.getErrorCellValue() + "";
        } 
        else {
            return null;
        }
    }

Respondido el 12 de Septiembre de 13 a las 06:09

¿Qué intentas mostrar con tu respuesta? Parece que acaba de escribir un código para mostrar datos de Excel, que ya he escrito. Quiero saber cómo puedo enviar estos datos a mi DAO para almacenarlos en mi tabla DB. Por favor, lea mi pregunta una vez más: principiante

Una vez que pasa los datos de Excel a pojo. Al usar ese pojo, puede guardar datos en la base de datos usando hibernate. Si necesita un código de hibernate, puedo darle: swamy

mi pregunta es "¿cómo puedo pasar estos datos a mi pojo?" mi nombre pojo es "Compañía" - principiante

Del código anterior. después de iterar cada fila. obtener valor como fila.getCell((corto) colNum).getStringCellValue().(columna comienza desde '0').si el valor no es nulo. Por ejemplo: company.setTown(getCellValue(row.getCell((short) 1)))); - swamy

lo que es getCell((short) 1))))? Actualicé mi pregunta anterior, agregué mi POJO y un método modelo. Por favor, ayúdame con tu respuesta con más código. - principiante

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.