java - 从Excel工作表中读取多行并存储到数据库

标签 java hibernate ms-office

我正在尝试从 Excel 工作表中读取多行并将它们复制到 java 对象,然后使用 hibernate 将该对象存储到数据库中。

示例-

  • 我有 userTravelBO java 对象。对于这个对象属性,我正在从 Excel 工作表中读取值。
  • 如果 Excel 工作表只有一行,那么它工作正常。
  • 如果 Excel 工作表包含多行,则从第二行开始,值不会设置为 userTravelBO 对象。

下面是我尝试过的代码。

Getting sheets from Excel file.

@Override
public Response addingUserFromExcel(String filename) {
    // TODO Auto-generated method stub
    File myFile = new File(filename);
    XSSFWorkbook myWorkBook = null;
    XSSFSheet mySheet = null;
    FileInputStream fis = null;
    int i = 0;
    try {
        fis = new FileInputStream(myFile);
        myWorkBook = new XSSFWorkbook(fis);
        while (i < myWorkBook.getNumberOfSheets()) {
            mySheet = myWorkBook.getSheetAt(i);
            switch(i){
            case 0 : addindUserToTable(mySheet);
                     break;
            case 1:  addVehicleToTable(mySheet);
                     break;
            case 2:  addTripToTable(mySheet);
                     break;
            case 3: addPackageToTable(mySheet);
                     break;
            }
            i++;

        }
        HashMap praf = new HashMap();
        praf.put("message", "uploaded successfully");
        return Response.ok(praf).build();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return Response.ok("file uploaded but not added to table").build();
    }


}

Setting values to the properties of UserTravelBO object and sending it store to DB.

    public Response addindUserToTable(XSSFSheet mySheet) {
    UserTravelBo userBO = null;
    Iterator<Row> rowIterator = mySheet.iterator();
    int j = 0;
    while (rowIterator.hasNext()) {
        userBO = new UserTravelBo();//creating a new object for each row.

        Row row = rowIterator.next();
        if(row.getRowNum()==0){
               continue; //just skip the rows if row number is 0 because it is heading
         }
        else{
        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();

            switch (j) {
            case 0:
                userBO.setUsername(cell.getStringCellValue());
                System.out.println("Excel"+cell.getStringCellValue());
                break;
            case 1:
                userBO.setPassword(cell.getStringCellValue());
                break;
            case 2:
                userBO.setHint(cell.getStringCellValue());
                break;
            case 3:
                userBO.setFirstname(cell.getStringCellValue());
                break;
            case 4:
                userBO.setMiddlename(cell.getStringCellValue());
                break;
            case 5:
                userBO.setLastname(cell.getStringCellValue());
                break;
            case 6:
                userBO.setStreet(cell.getStringCellValue());
                break;
            case 7:
                userBO.setArea(cell.getStringCellValue());
                break;
            case 8:
                userBO.setCity(cell.getStringCellValue());
                break;
            case 9:
                userBO.setState(cell.getStringCellValue());
                break;
            case 10:
                userBO.setCountry(cell.getStringCellValue());
                break;
            case 11:
                userBO.setPostalcode(cell.getStringCellValue());
                break;
            case 12:
                userBO.setTelephone(cell.getStringCellValue());
                break;
            case 13:
                userBO.setEmail(cell.getStringCellValue());
                break;
            case 14:
                userBO.setRolename(cell.getStringCellValue());
                break;
            case 15:
                userBO.setStatus(cell.getBooleanCellValue());
                break;

            default:
                break;
            }
            j++;
        }
    }
        System.out.println(userBO.getUsername());//for first row getting valid output but for the second row i am getting null.
        addUser(userBO);
    }
    return Response.ok("file uploaded and added to table").build();
}

Here I am creating new UserTravelBO object for each row iteration then why it is happening like this. I am not getting this.

One thing is coming in my mind that user has one to one relation with address table because of this only this thing happening.I don't know I am correct or wrong.

最佳答案

这是我的错误。我在每行的 while 循环之外初始化变量 j = 0。当一行完成时,“j”变量应该再次初始化为零,但我没有这样做。

Below is the correct code.

public Response addindUserToTable(XSSFSheet mySheet) {
UserTravelBo userBO = null;
Iterator<Row> rowIterator = mySheet.iterator();
//int j = 0; Here i was doing wrong
while (rowIterator.hasNext()) {
    userBO = new UserTravelBo();//creating a new object for each row.
    Row row = rowIterator.next();
    if(row.getRowNum()==0){
           continue; //just skip the rows if row number is 0 because it is   heading
     }
    else{
    int j = 0;//Here j should be initiated
    Iterator<Cell> cellIterator = row.cellIterator();
    while (cellIterator.hasNext()) {
        Cell cell = cellIterator.next();

        switch (j) {
        case 0:
            userBO.setUsername(cell.getStringCellValue());
            System.out.println("Excel"+cell.getStringCellValue());
            break;
        case 1:
            userBO.setPassword(cell.getStringCellValue());
            break;
        case 2:
            userBO.setHint(cell.getStringCellValue());
            break;
        case 3:
            userBO.setFirstname(cell.getStringCellValue());
            break;
        case 4:
            userBO.setMiddlename(cell.getStringCellValue());
            break;
        case 5:
            userBO.setLastname(cell.getStringCellValue());
            break;
        case 6:
            userBO.setStreet(cell.getStringCellValue());
            break;
        case 7:
            userBO.setArea(cell.getStringCellValue());
            break;
        case 8:
            userBO.setCity(cell.getStringCellValue());
            break;
        case 9:
            userBO.setState(cell.getStringCellValue());
            break;
        case 10:
            userBO.setCountry(cell.getStringCellValue());
            break;
        case 11:
            userBO.setPostalcode(cell.getStringCellValue());
            break;
        case 12:
            userBO.setTelephone(cell.getStringCellValue());
            break;
        case 13:
            userBO.setEmail(cell.getStringCellValue());
            break;
        case 14:
            userBO.setRolename(cell.getStringCellValue());
            break;
        case 15:
            userBO.setStatus(cell.getBooleanCellValue());
            break;

        default:
            break;
        }
        j++;
    }
}
    System.out.println(userBO.getUsername());//for first row getting valid    output but for the second row i am getting null.
    addUser(userBO);
}
return Response.ok("file uploaded and added to table").build();
}

谢谢。

关于java - 从Excel工作表中读取多行并存储到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41240497/

相关文章:

java - Jackson:JAX-RS 应用程序中的数组列表包装器

java - 从 SPIED 创建模式

hibernate - 为 UUID 配置 Grails/Hibernate/Postgres

python - 将 .xll 作为 AddIn 添加到 Excel

java - 如何在没有 session 工厂的情况下使用 IntelliJ 生成实体?

java - 有没有办法通过功能而不是值(value)来比较两种方法?

java - 如何解决 Hibernate 异常 "IllegalArgumentException occurred while calling setter"的原因?

hibernate - findAll() 方法在 Hibernate 中给出空结果集

javascript - 将字节数组输出转换为 Blob 损坏文件

php - 示例/如何使用 Exchange 03 Webdav 和 PHP 创建日历约会?