如何解析这个excel?

How parse this excel?

我有一个 excel 文件,我必须解析为对象列表: excel: excel

我的POJO:

我的服务:

public List<RegisterModel> parse(MultipartFile file) throws IOException {
        Workbook workbook = new HSSFWorkbook(file.getInputStream());
        Sheet worksheet = workbook.getSheetAt(0);
        List<RegisterModel> registerModelList = new ArrayList<>();
        RegisterModel registerModel = new RegisterModel();
        for (int i = 3; i < worksheet.getPhysicalNumberOfRows(); i++) {

            Row row = worksheet.getRow(i);
            String headers = String.valueOf(row.getCell(0));
            String values = String.valueOf(row.getCell(1));

            if (headers.equals("OPERDAY")){
                registerModel.setDate(values);
            }
            if (headers.equals("SUIP")){
                registerModel.setSuip(values);
            }
            if (headers.equals("STATE")){
                registerModel.setSuip(values);
            }
            if (headers.equals("NOM_OPER")){
                registerModel.setTransactionID(values);
            }
            registerModelList.add(registerModel);

        }
        System.out.println(registerModelList);
        return registerModelList;
    }

但它不起作用(

结果:值重复

[RegisterModel(date=2022-03-01T23:48:47, suip=Проведён, state=null, transactionID=1888314188),

RegisterModel(date=2022-03-01T23:48:47, suip=Проведён, state=null, transactionID=1888314188),

RegisterModel(date=2022-03-01T23:48:47, suip=Проведён, state=null, transactionID=1888314188)]

问题是由于在 for 循环之外仅创建了一个 registerModel 实例引起的。您只需一遍又一遍地编辑该对象,而不是创建它的新实例。解决这个问题的方法是在每次完成前一个对象或开始一个新对象之前创建一个新的 registerModel 实例。

有多种方法可以通过使用嵌套循环或将 for 循环一次增加 5 个(订单中的行)并专门跟踪项目所在的位置来实现此目的。但是,如果我们假设订单中的最后一位数据是“NOM_OPER”行,那么我们可以执行以下快速简便的解决方案。

这是修改后的代码:

    if (headers.equals("NOM_OPER")){
        registerModel.setTransactionID(values);

        //Now that the object is complete we can add it to the list (moved here from below)
        registerModelList.add(registerModel);

        //The lastly we NEED to create a new instance of registerModel for the next order to use
        registerModel = new RegisterModel();
    }
    //Remove the below line after the if statements.
    //You should only add the model to the list once the object is complete. Don't add it on every row.
    //registerModelList.add(registerModel);

完整的方法如下所示:

public List<RegisterModel> parse(MultipartFile file) throws IOException {
    Workbook workbook = new HSSFWorkbook(file.getInputStream());
    Sheet worksheet = workbook.getSheetAt(0);
    List<RegisterModel> registerModelList = new ArrayList<>();
    RegisterModel registerModel = new RegisterModel();
    for (int i = 3; i < worksheet.getPhysicalNumberOfRows(); i++) {
        Row row = worksheet.getRow(i);
        String headers = String.valueOf(row.getCell(0));
        String values = String.valueOf(row.getCell(1));

        if (headers.equals("OPERDAY")){
            registerModel.setDate(values);
        }
        if (headers.equals("SUIP")){
            registerModel.setSuip(values);
        }
        if (headers.equals("STATE")){
            registerModel.setSuip(values);
        }
        if (headers.equals("NOM_OPER")){
            registerModel.setTransactionID(values);

            //Now that the object is complete we can add it to the list (moved here from below)
            registerModelList.add(registerModel);

            //The lastly we NEED to create a new instance of registerModel for the next order to use
            registerModel = new RegisterModel();
        }
        //Remove the below line after the if statements.
        //You should only add the model to the list once the object is complete. Don't add it on every row.
        //registerModelList.add(registerModel);

    }
    System.out.println(registerModelList);
    return registerModelList;
}