最近业务中需要将Excel数据读取成指定的实体类对象数据然后动态保存到动态表中,但是想要和实体类对象中的字段一一对应那就必须首先要知道实体类是哪一个,这就需要反射拿到实体类的class对象。但是想要通过反射拿到对应实体类的class对象就必须要知道对象的全限定路径,显然业务中需要将Excel读取成实体类,我并不知道具体是哪一个实体对象,这是动态的,所以没有办法直接将数据读取成指定实体类。

所以就想着先把Excel中的数据先读取为一个JsonArray数据,然后蒋政数据再返回给前端,让前端动态去选择数据库与数据表。

首先将前端上传的文件读取成json串

try {
            FileInputExcelVO fileInputExcelVO = new FileInputExcelVO();
            InputStream inputStream = file.getInputStream();
            // 读取Excel文件
//            InputStream inputStream = new FileInputStream("path/to/excel.xlsx");
            Workbook workbook = new XSSFWorkbook(inputStream);
            //上传
            String fileName = file.getOriginalFilename().split("\\.")[0] +             
           DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".xlsx";
            ExcelUtil.workbookWrite(workbook, config.getFileErrorExcelPath(), fileName);
            String path = config.getFileErrorExcelPath().replace(config.getFilePath(), "");
            path += "/" + fileName;
            // 获取第一个Sheet
            Sheet sheet = workbook.getSheetAt(0);
            // 获取表头
            Row headerRow = sheet.getRow(number);
            // 创建JSON数组
            JSONArray jsonArray = new JSONArray();
            // 遍历每一行数据
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row dataRow = sheet.getRow(i + 1);
                if (!Objects.equals(null, dataRow)) {
                    JSONObject jsonObject = new JSONObject();
                    // 遍历每一列数据
                    for (int j = 0; j < headerRow.getLastCellNum(); j++) {
                        Cell headerCell = headerRow.getCell(j);
                        Cell dataCell = dataRow.getCell(j);
                        // 获取表头和对应列的数据
                        String header = headerCell.getStringCellValue();
                        String data = getStringCellValue(dataCell);
                        // 将数据放入JSON对象
                        jsonObject.put(header, data);
                    }
                    // 将JSON对象放入JSON数组
                    jsonArray.add(jsonObject);
                }
            }
            // 输出JSON数据
            System.out.println(jsonArray.toString());
            // 关闭工作簿和输入流
            workbook.close();
            inputStream.close();
            fileInputExcelVO.setPath(path);
            fileInputExcelVO.setJsonString(jsonArray.toString());
            return fileInputExcelVO;
        } catch (Exception e) {
            throw new ExcelException("模板有误无法导入");
        }
FileInputExcelVO这是我自己创建的传输数据的VO对象,每一行数据读取完事后都会封装到Jsonarray数组中,然后返给前端处理。这个方法拿来即用即可。

其中

Row headerRow = sheet.getRow(number);这一行代码可以通过number自行控制从Excel的哪一行开始读取数据,因为一般表中肯定都有表头,表头就是json数据中的key,确保他是第几行并且能成功读取到。

如果你还需要读取到的json数据进一步处理可以这么做:

因为我是将读取到的Jsonarray数据toString转换为了字符串封装到了VO对象中了,想要处理这个字符串,可以将VO中的这个对象取出来。通过:

JsonNode jsonNode = mapper.readTree(fileInputExcelVO.getJsonString());

将数据转为node节点数据,然后遍历循环就可以拿到刚刚Excel中的每一行数据了,在通过node中的方法,就可以拿到每一行表头对应的数据值了:

            for (JsonNode node : jsonNode) {

               System.out.println(node.get(dataFileChildren.getHeader()).asText())) ;

                        }
dataFileChildren这个对象是我从数据库查出来的数据规则,因为我的业务是提前得建立数据模板,还要根据模板进行数据规则的判断,比如数据长度、非空等等,所以我直接从数据库拿到了模板的表头,这样就可以以K-V的形式拿到值了。(动态往库表中保存数据可以看我的下一篇文章)

更多推荐