1、导入依赖
<!--导入导出-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
2、创建导入中一对多的一的实体类
建议导入导出的实体类(只有需要导入导出的字段)重新写一个Vo,不要和表的实体类混在一起
注意这里使用的 @Excel 的包,是红框圈出来的,不要导错包,要不然没有用
@Excel(name = "年级")
import cn.afterturn.easypoi.excel.annotation.Excel;
3、创建导入中一对多的多的的实体类
4、将多的这个实体类放入到一的里面
5、制作模版
模版制作中每个字段的名称都要和实体类中的字段名称一样,要不然导入不成功
6、Controller
在 importCustomer()方法中
MultipartFile file 第一个参数是文件
int sheet 第二个参数是工作簿的索引(从0开始)
int rows 第三个参数是表头行数(表头占几行,就是几)
/*一对多导入*/
@PostMapping("/importData")
@ApiOperation("一对多导入")
public AjaxResult importData(@RequestPart("file") MultipartFile file,String trainId) throws Exception {
// 调用业务层
String importCustomer = testService.importCustomer(file, 1, 2,trainId);
return AjaxResult.success(importCustomer);
}
7、service
/*一对多导入*/
String importCustomer(MultipartFile file, int sheet, int rows,String trainId);
8、impl
@Transactional
@Override
public String importCustomer(MultipartFile file, int sheet, int rows,String trainId) {
TbExaminationTitle tbExaminationTitle = new TbExaminationTitle();
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
// 设置sheet 跟行头(也就是所谓的字段展现在哪行)
ImportParams importParams = new ImportParams();
//表头行数,默认1
importParams.setHeadRows(rows);
// importParams.setTitleRows(sheet);
//开始读取的sheet位置,默认为0
importParams.setStartSheetIndex(sheet);
importParams.setNeedVerify(true);
try {
// TODO 获取导入的全部数据
//获取数据时使用 import cn.afterturn.easypoi.excel.annotation.Excel; 注解 @Excel(name = "获取值")
List<Vo> importVoList =
ExcelImportUtil.importExcel(file.getInputStream(), Vo.class, importParams);
//判断导入数据是否为空,可以找一个必填字段做为校验
if (StringUtils.isNull(importVoList.get(0).getTitle())){
failureNum++;
failureMsg.append("导入数据不能为空");
}
// 判断主表是否有数据导入,如果有进行获取添加到主表数据库
for (Vo importParam:importVoList) {
// TODO 循环的获取到主表数据,添加到数据库之中
//复制一下
tbTitle = BeanUtil.copyProperties(importParam, TbTitle.class);
//可以添加一些默认数据
int i = Mapper.insert(tbnTitle);
// TODO 判断主表是否插入成功 添加试题内容表
if (i > 0) {
List<Vo> List = importParam.getList();
//做自己想要进行的操作
}
successNum++;
successMsg.append( successNum + "、"+importParam.getTitle()+" 导入成功 ");
}else {
failureNum++;
failureMsg.append( failureNum + "导入失败,请修改完成后重新导入");
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
//如果主表没有数据添加,那样直接结束,
} catch (IOException e) {
failureNum++;
String msg = failureNum + "、导入失败:";
failureMsg.append(msg + e.getMessage());
} catch (Exception e) {
throw new RuntimeException(e);
}
return successMsg.toString();
}
到这里一对多的导入就完成了,代码仅供参考,有些地方不太规范,需要自己去完善一下