hutool的excel读取和下载

2,091 阅读2分钟

实现的上传需求是将如下的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.所在园区和实验室存在一对多关系,不同园区下的实验室存在重名问题

根据园区和实验室字段共同确定一条记录,即可确定他们之间关系

image.png

//前端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表格(需要查表导出,前端只能打印当前页的数据)

image.png 难点:逻辑上不复杂,难在对方法的熟知程度。

//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);
		}
	}