java读取Excel中的数据并以json形式输出,动态保存到指定库表中

文章讲述了在业务场景中,如何将Excel数据动态读取并转换成JsonArray,以便于前端选择数据库和表进行动态保存。通过使用反射获取实体类的class对象遇到的问题,以及解决方案——先将Excel数据转换为JSON,然后由前端处理。过程中涉及到的工作簿操作,行和列的遍历,以及数据验证等步骤被详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近业务中需要将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的形式拿到值了。(动态往库表中保存数据可以看我的下一篇文章)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值