使用hutool库,对excel进行一些导出、导入操作

时间:2025-03-10 14:20:53
package com.example.demo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import com.domain.MagBackAmountInfo; import com.domain.ReturnResult; import com.example.service.impl.MagBackAmountInfoServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController //允许跨域访问 @CrossOrigin @RequestMapping("/member") public class ExcelController { @Autowired MagBackAmountInfoServiceImpl backAmountInfoService; @GetMapping("/testExport") public void test(HttpServletRequest request, HttpServletResponse response){ int pageStart = Integer.parseInt(request.getParameter("Pagenumber")); int pageSize = Integer.parseInt(request.getParameter("number")); /** 这里写你自己获取数据的方法*/ List<MagBackAmountInfo> magBackAmountInfos = backAmountInfoService.selectByPrimarybyid(null); ExcelWriter writer = ExcelUtil.getWriter(true); /** 这里的作用是将你的字段与excel展示名称做匹配 */ Map<String,String> map = new HashMap<>(); map.put("backAmountId","VIN"); map.put("makeInvocId","ICCID"); map.put("customerName","客户名称"); map.put("vehiclesName","车系名称"); map.put("vehicleModel","车型名称"); map.put("vehicleConf","配置名称"); map.put("customerType","客户类型"); map.put("activedTime","实销通过日期"); map.put("realStatus","实名状态"); writer.setHeaderAlias(map); /** 这里的作用时,写出之后不展示你的字段名,只展示你设置的别名,客户类型,实销通过日期。这些 */ writer.setOnlyAlias(true); writer.write(magBackAmountInfos,true); response.setContentType("application/;charset=utf-8"); response.setHeader("Content-Disposition","attachment;filename="); ServletOutputStream out= null; try { out = response.getOutputStream(); writer.flush(out, true); // 关闭writer,释放内存 writer.close(); //此处记得关闭输出Servlet流 IoUtil.close(out); } catch (IOException e) { e.printStackTrace(); } } @ResponseBody @RequestMapping(value = "/moban", method = RequestMethod.GET) public void moban(HttpServletRequest request, HttpServletResponse response){ ExcelWriter writer = ExcelUtil.getWriter(true); List<String> row = CollUtil.newArrayList("backAmountId", "makeInvocId", "customerName", "vehiclesName","vehicleModel","vehicleConf","customerType","activedTime","realStatus"); List<String> secRow = CollUtil.newArrayList("VIN", "ICCID", "客户名称", "车系名称","车型名称","配置名称","客户类型","实销通过日期-(yyyy-MM-dd HH:mm:ss)","实名状态"); writer.writeHeadRow(row); writer.writeRow(secRow); /** 这里说是隐藏,但是其实就是将高度置为0,有点鸡肋 */ writer.getSheet().getRow(0).setZeroHeight(true); response.setContentType("application/;charset=utf-8"); response.setHeader("Content-Disposition","attachment;filename="); ServletOutputStream out= null; try { out = response.getOutputStream(); writer.flush(out, true); // 关闭writer,释放内存 writer.close(); //此处记得关闭输出Servlet流 IoUtil.close(out); } catch (IOException e) { e.printStackTrace(); } } //导入excel @PostMapping("/import") public ReturnResult importExcel(@RequestParam("file") MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); if (file==null|| file.isEmpty()){ return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "上传文件为空,请重新上传"); } else if (!suffix.equals("xls")&&!suffix.equals("xlsx")){ return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件格式错误,请上传excel文件"); } ExcelReader reader = ExcelUtil.getReader(file.getInputStream()); /** 因为模板中有两行为提示信息,所以这儿设置从0,2之后读取 */ List<MagBackAmountInfo> blackDtos = reader.read(0, 2, MagBackAmountInfo.class); if (blackDtos.size() == 0) { return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件数据为空,请重新上传"); } else { /** 可以直接批量插入,也可以在service层做一些关键值的判断 */ backAmountInfoService.batchInsert(blackDtos); return ReturnResult.ok(); } } }