功能需求:浏览器直接敲URL
就可以下载文件,也就是前端触发后端提供的GET
接口,就可以下载文件。
1、Controller
//根据userId查询数据,处理逻辑之后生成excel客户端下载
@GetMapping("/downloadUser")
@ApiOperation(value="下载用户数据", notes="")
public void downloadUser(String userId, HttpServletResponse response){
//下载的请求给客户端的返回可以为void,占用的是客户端的响应流,往它写入数据
tDpCountsService.downloadUserData(deviId, response);
}
2、Service
//生成用户excel用户数据
int downloadUserData(String userId, HttpServletResponse response);
3、Impl
@Override
public int downloadUserData(String deviId, HttpServletResponse response) {
String filename = "test.xls";
//可以使用Mapper进行数据库查询
//可以查询redis
//可以从查询业务数据
//一个简单的测试Bean,将来放到list里边通过hutool的ExcelWriter生成excel
DownloadDatasVo downloadDatasVo = new DownloadDatasVo();
downloadDatasVo.setUserName(userName);
downloadDatasVo.setAddress(address);
List<DownloadDatasVo> rows = CollUtil.newArrayList(downloadDatasVo);
// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter();
//自定义标题别名
writer.addHeaderAlias("userName", "用户姓名");
writer.addHeaderAlias("address", "用户地址");
writer.setOnlyAlias(true);
//设置列宽
writer.setColumnWidth(1, 20);
//设置标题
writer.merge(2, "用户数据");
writer.write(rows, true);
//out为OutputStream,需要写出到的目标流
//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;filename="+filename);
ServletOutputStream out= null;
try {
out = response.getOutputStream();
} catch (IOException e) {
throw new ServiceException("生成用户数据异常");
}
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
return 0;
}