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

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("文件内容为空");
}
}
结果
各位,因为是公司项目最近的需求,所以一些无关参数和按钮都被我删了或隐藏,但不影响功能,请各位谅解。。。


说明
这次的需求突然给我的,所以写的较快,递归和excel合并单元格等方式还没有试过,我代码中的第一列和后续列循环应该可以归纳在一起,但时间紧,没有考虑太多,有想法的兄弟可以一起探讨。
这篇博客介绍了如何使用Java将具有父子结构的Excel数据导入到MySQL数据库,并在页面上以树形结构展示。内容包括Excel的数据结构、Java代码实现,特别是Controller层的处理,以及导入结果和相关说明。作者指出,代码中的递归和Excel单元格合并等功能还有优化空间,欢迎讨论。
8750

被折叠的 条评论
为什么被折叠?



