poi java导入树状结构即父子数据的excel

父子结构的excel(java)导入数据库,页面上展示成树状结构

excel数据结构

poi java导入树状结构即父子数据的excel_第1张图片

java代码

Controller层

我这里传入的参数除了文件,有一个id,id为页面上的目录上的一个节点id,可理解为我导入的目录实在某一个节点下展现,id也可为总的父节点,我这里为判断传入的id为所有节点的父id,默认为0,也可为已存在的某一节点id.

@SneakyThrows
    @RequestMapping("/importBookExcel")
    public AjaxResult importBookExcel(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) {
        //获取参数
        String id = request.getParameter("id");
        if (id == null || "".equals(id)) {
            id = "0";
        }
        //poi解析excel
        InputStream inputStream = file.getInputStream();
        // 读取工作薄
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        //定义一个cellId,此为每一次循环前一列的id
        int cellId = 0;
        if (sheet.getPhysicalNumberOfRows() > 1) {
            //按照行进行循环,读取当前行的列
            for (int k = 1; k < sheet.getPhysicalNumberOfRows(); k++) {
                // 读取单元格
                Row row = sheet.getRow(k);
                if (row != null) {
                //第一列单独拿出操作
                    Cell cell1 = row.getCell(0);
                    //判断单元格是否为空
                    if (!(cell1 == null || "".equals(cell1.toString().trim()))) {
                        cell1.setCellType(Cell.CELL_TYPE_STRING);
                        //根据传入的id和得到的name查询此节点是否存在
                        Book book= bookService.getByName(Integer.parseInt(id), cell1.getStringCellValue());
                        //如果第一列的name相关为空,向数据库添加此记录
                        if (book== null) {
                            Booklog bk= new Book();
                            bk.setName(cell1.getStringCellValue());
                            bk.setParentId(Integer.parseInt(id));
                            bk.setCreateTime(new Date());
                            //创建人一般从当前用户session或者redis拿取,我这里随便填了
                            bk.setCreateUser("test"));
                            Boolean result = bookService.save(bk);
                            //因为id自增,所以插入后,查询刚插入数据,得到id,作为下一列的父id
                            if (result) {
                                Book bookResult= catalogService.getByName(bk.getParentId(), bk.getName());
                                cellId = bookResult.getId();
                            }
                        } else {
                            cellId = book.getId();
                        }
                    }
                    //从第二列开始循环遍历列,我这里excel一行就三列,已查询第一列
                    for (int j = 1; j < 3; j++) {
                        Cell cell = row.getCell(j);
                        Book bo= null;
                        //父id
                        if (cellId != 0) {
                            bo= bookService.getById(cellId);
                        }
                        //判断此列是否为空
                        if (!(cell == null || "".equals(cell.toString().trim()))) {
                        //懒得编对象别名了
                            Book book1= bookSerice.getByName(book.getId(), cell.getStringCellValue());
                            if (cat == null) {
                                Book  book2= new Book();
                                book2.setName(cell.getStringCellValue());
                                book2.setParentId(cellId);
                                book2.setCreateTime(new Date());
                                book2.setCreateUser("test");
                                Boolean bl = bookService.save(book2);
                                if (bl) {
                                    Book book3= bookService.getByName(cellId, book2.getName());
                                    cellId = book3.getId();
                                }
                            } else {
                                cellId = book2.getId();
                            }
                        }
                    }
                }
            }
            return AjaxResult.success("文件导入成功");
        } else {
            return AjaxResult.fail("文件内容为空");
        }
    }

结果

各位,因为是公司项目最近的需求,所以一些无关参数和按钮都被我删了或隐藏,但不影响功能,请各位谅解。。。
poi java导入树状结构即父子数据的excel_第2张图片
poi java导入树状结构即父子数据的excel_第3张图片

说明

这次的需求突然给我的,所以写的较快,递归和excel合并单元格等方式还没有试过,我代码中的第一列和后续列循环应该可以归纳在一起,但时间紧,没有考虑太多,有想法的兄弟可以一起探讨。

你可能感兴趣的:(poi java导入树状结构即父子数据的excel)