实现的上传需求是将如下的excel表格中的字段录入数据库,其中所在园区和所在实验室字段转换为对应的id
问题难点:
1.读excel中数据用什么方法 hutool自带方法
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
List<List<Object>> hiddenDangerInfoList = reader.read(1, Integer.MAX_VALUE, false);
2.所在园区和实验室存在一对多关系,不同园区下的实验室存在重名问题
根据园区和实验室字段共同确定一条记录,即可确定他们之间关系
//前端controller
@PostMapping(value = "/uploadExcel")
public R upload(@RequestPart("file") MultipartFile file) {
Msg msg= new Msg();
try {
msg = excelService.readFile(file);
} catch (IOException e) {
e.printStackTrace();
}
return R.ok(msg);
}
//serviceImpl
public Msg readFile(MultipartFile file) {
List<List<Object>> hiddenDangerInfoList = new ArrayList<>();
//初始化返回信息
int rightNum = 0;
String wrongMsg = "";
try {
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
hiddenDangerInfoList = reader.read(1, Integer.MAX_VALUE, false);
for (List<Object> dangerInfoL : hiddenDangerInfoList) {
String park = (String) dangerInfoL.get(3);
String laboratory = (String) dangerInfoL.get(4);
//执行插入 条件:在实验室表中能 根据园区(String -id)和实验室(名称查找)找到信息
ParkInfo parkInfo = parkInfoMapper.selectOne(new LambdaQueryWrapper<ParkInfo>().eq(ParkInfo::getParkName, park));
if (parkInfo == null) {
//不能抛异常会影响执行 打印记录下即可
System.out.println(park + "园区不存在");
wrongMsg += park + "园区不存在;";
} else {
Integer parkId = parkInfo.getId();
//根据园区id和实验室名称在实验室表中查找是否有该 信息
LaboratoryInfo laboratoryInfo = laboratoryInfoMapper.selectOne(new LambdaQueryWrapper<LaboratoryInfo>()
.eq(LaboratoryInfo::getId, parkId).eq(LaboratoryInfo::getLaboratoryName, laboratory));
if (laboratoryInfo != null) {
//有记录 读取excel中的值 放进隐患信息表
String hidden_danger_name = (String) dangerInfoL.get(0);
String hidden_danger_no = (String) dangerInfoL.get(1);
String hidden_danger_source_name = (String) dangerInfoL.get(2);
Integer laboratoryId = laboratoryInfo.getLaboratoryId();
String addr_desc = (String) dangerInfoL.get(5);
Date flowTime = (Date) dangerInfoL.get(7);
HiddenDangerInfo dangerInfo = new HiddenDangerInfo();
dangerInfo.setHiddenDangerName(hidden_danger_name)
.setHiddenDangerNo(hidden_danger_no)
.setHiddenDangerSourceName(hidden_danger_source_name)
.setParkId(parkId)
.setLaboratoryId(laboratoryId)
.setAddrDesc(addr_desc)
.setFlowTime(flowTime);
baseMapper.insert(dangerInfo);
rightNum++;
} else {
//不满足条件,查找不到信息 不插入打印相关信息(园区xxx下没有实验室xxx)
System.out.println("所在园区" + park + " 和 实验室" + laboratory + "不匹配");
wrongMsg += "所在园区" + park + " 和 实验室" + laboratory + "不匹配;";
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
Msg msg = new Msg();
msg.setMsg(wrongMsg)
.setWrongNum(hiddenDangerInfoList.size() - rightNum)
.setRightNum(rightNum);
return msg;
}
下载功能实现
需求:将如下信息经过筛选,然后导出相应的excel表格(需要查表导出,前端只能打印当前页的数据)
难点:逻辑上不复杂,难在对方法的熟知程度。
//controller
@ApiOperation(value = "导出隐患信息表")
@GetMapping("/export")
public void exportHiddenDangerInfo(HiddenDangerInfo hiddenDangerInfo, HttpServletResponse response){
excelService.exportHiddenDangerInfo(hiddenDangerInfo,response,"隐患信息");
}
//serviceImpl
public void exportHiddenDangerInfo(HiddenDangerInfo hiddenDangerInfo, HttpServletResponse response,String fileName) {
List<HiddenDangerInfoVo> list = hiddenDangerInfoMapper.getHiddenDangerInfoByAddition(hiddenDangerInfo);
//自定义别名 别名的key和实体类中的名称要对应上!!
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("hiddenDangerName","隐患名称");
map.put("hiddenDangerNo","隐患编号");
map.put("hiddenDangerSourceName","隐患来源");
map.put("parkName","所在园区");
map.put("laboratoryName","所在实验室");
map.put("addrDesc","位置描述");
map.put("flowTime","治理时间");
ExcelWriter writer = new ExcelWriter();
writer.setHeaderAlias(map);
//水平居中对齐,垂直中间对齐
writer.getStyleSet().setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
//所有单元格宽25个字符
writer.setColumnWidth(-1, 25);
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(list, true);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
ServletOutputStream out = null;
try {
// 设置请求头属性
response.setHeader("Content-Disposition",
"attachment;filename=" + new String((fileName + ".xlsx").getBytes(), StandardCharsets.ISO_8859_1));
out = response.getOutputStream();
// 写出到文件
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
// 此处记得关闭输出Servlet流
IoUtil.close(out);
} catch (IOException e) {
throw new CheckedException("文件下载失败==" + e);
}
}