直接上代码
Controller层
@Slf4j @RestController @RequestMapping("/thermal/tatsworksheettargetd") public class TaTsWorksheetTargetDController { @Autowired private TaTsWorksheetTargetDService taTsWorksheetTargetDService; @GetMapping("/exportTargetD") public R exportTargetD(@RequestParam(value = "prvnceId",required = false)String prvnceId, @RequestParam(value = "pageSize",defaultValue = "20")String pageSize, @RequestParam(value = "pageNum",defaultValue = "1")String pageNum, @RequestParam(value = "tsType",required = false)String tsType, @RequestParam(value = "monthId",required = false)String monthId, HttpServletResponse response) { try { taTsWorksheetTargetDService.exportTargetD(prvnceId,tsType,monthId,response); return R.ok(); } catch (Exception e) { log.error(e.getMessage(), e); return R.error("导出Excel出现错误!"); } }
}
Service层
void exportTargetD(String prvnceId, String tsType, String monthId, HttpServletResponse response);
ServiceImpl层
@Override public void exportTargetD(String prvnceId,String tsType,String monthId,HttpServletResponse response) { try { ExcelWriter writer = new ExcelWriter(true,"投诉信息表"); String fileName; //设置文件名称 fileName = "投诉信息.xlsx"; //创建标题映射 exportTitleMap(writer); //未映射的不显示 writer.setOnlyAlias(true); //设置分页条件 //获取数据 IPage<Map> excelList = taTsWorksheetTargetDDao.getMapData(new Page(1,99999),monthId,prvnceId,tsType); writer.write(excelList.getRecords()); writer.autoSizeColumnAll(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "iso8859-1")); ServletOutputStream out = response.getOutputStream(); writer.flush(out, true); //关闭Writer,释放内存 writer.close(); //此处记得关闭输出Servlet流 IoUtil.close(out); } catch (Exception e) { log.error(e.getMessage(), e); } }
遇到的问题
首先,我们导出Excel需要调用查询接口获取数据,问题出现了,我们在查询接口的时候使用了Mybatis-Plus分页插件,所以我们需要拿Ipage<Map>来接收数据,但是当我们把excelList这个参数传给writer.write中时,会发现报错。
导出Excel使用的是Hutool工具,分页使用的是Mybatis-Plus分页插件,个人觉得是这两种工具作者不同,不支持这样的传参。(小白一个如果有大神明白怎么回事希望能不吝赐教 ^ ^)
解决方案
点击进入Page类
里面的 List<T> records 就是我们实际分页的数据,所以在刚才传参的地方传入excelList.getRecords()参数