有时候页面查询的数据需要做一个导出接口,原则上导出数据需要与页面查询的一致,所以导出的接口入参要和查询列表的入参一致,后台根据入参自行查询数据库,然后再根据输出流写到前端,这样前端就可以获取导出的数据文件。
页面:
下面图只是打个比方,不作为代码依据
后台:
控制器
基本随意,根据自己喜好定url,参数实体至少两个,一个是HttpServletResponse ,另一个就是查询列表参数
@ApiOperation(value = "导出XX数据明细报表")
@GetMapping("/exportDetail")
public void exportDetail(HttpServletResponse response, RequestDTO requestDTO ) {
xxService.exportDetail(response, requestDTO );
}
服务类方法exportDetail()
@Override
public void exportDetail(HttpServletResponse response, RequestDTO requestDTO ) {
try {
long startTime = System.currentTimeMillis();
//1 获取需要导出数据的集合 FindDetailList方法自行编写,不同业务实现不同
List<User> data = this.FindDetailList(requestDTO);
//2 创建ExcelWriter
ExcelWriter writer = ExcelUtil.getBigWriter();
//3 设置excel每一列表头,并且表头关联上对应的 User 实体中的参数名
writer.addHeaderAlias("name","名称");
writer.addHeaderAlias("sex","性别");
writer.addHeaderAlias("age","年龄");
writer.setOnlyAlias(true);
writer.write(data,true);
//4 设置excel表对应列的宽度(非必要)
writer.setColumnWidth(0, 20);
writer.setColumnWidth(1, 20);
writer.setColumnWidth(2, 20);
//5 设置excel表名,编码等基础信息
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + URLEncoder.encode("XX明细报表" + "-" + LocalDate.now() + ".xlsx", "UTF-8") + "\"");
ServletOutputStream out=response.getOutputStream();
writer.flush(out, true);
writer.close();
log.info("导出XX明细报表耗时{}ms", System.currentTimeMillis() - startTime);
}catch (Exception e){
log.error("XX明细报表导出异常!",e);
}
}
至此代码完成,可直接用api工具测试。
测试:
可以看到返回一堆乱码 ,影响不大,点左上方的下载按钮即可下载(如果是网页调用会直接到下周的小窗口)
完成