需求:将一个Excel用户名单从后台管理系统上传到后台,后台判断名单中的人是否已在数据库中,然后将已存在的人用excel形式返回给前端。
问题:后台管理使用的是若依框架,接收不了从后台推流的Excel【也可能是我的方式错误】
解决方案:无奈下只能先将要返给前端的 已存在的用户名单上传到服务器,然后返回给前端一个存储地址,前端根据存储地址,使用window.open()从服务器上拉取Excel,然后推流给前端。
1.Excel上传到服务器:
public String keppExcel( List<xxUserExcelVo > userList) throws IOException {
if (Objects.isNull(userList)||Objects.equals(userList.size(),0)){
return "结果为空";
}
String fileName = System.currentTimeMillis() + "-导出用户已在数据库中的数据.xlsx";
//视频真实存放地址
String realPath = "/data/xx/xxx/excel";
//生成视频真实存放目录
newDir(realPath);
String name = realPath +"/"+ fileName;
// 指定文件输出位置
OutputStream outputStream = new FileOutputStream(name);
ExcelWriter excelWriter = EasyExcelFactory.getWriter(outputStream);
// 将要输出的内容填充到Sheet里
Sheet sheet = new Sheet(1, 0, xxUserExcelVo .class);
/**
* 写数据到Write上下文中
* 第一个参数:要写入的内容
* 第二个参数:要写入的sheet目标
*/
excelWriter.write(userList, sheet);
excelWriter.finish();
outputStream.close();
//返回存储地址
return name;
}
用户vo类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class xxUserExcelVo extends BaseRowModel {
/**
* 姓名
*/
@ExcelProperty(value = "姓名", index = 0)
private String name;
/**
* 手机号
*/
@ExcelProperty(value = "手机号", index = 1)
private Long phone;
}
创建目录
private static void newDir(String path) {
File dir = new File(path);
dir.mkdirs();
}
2.根据存储地址获取存储在服务器上的Excel
@GetMapping("/getExcel")
@ResponseBody
public void getExcel(@RequestParam("url") String url, HttpServletResponse response) throws IOException {
FileInputStream hFile = new FileInputStream(url); //得到文件大小
int i = hFile.available();
byte data[] = new byte[i]; //读数据
hFile.read(data); //得到向客户端输出二进制数据的对象
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=down.xls");
OutputStream toClient = response.getOutputStream(); //输出数据
toClient.write(data);
toClient.flush();
toClient.close();
hFile.close();
}
3.注意:前端代码:
window.open("/api/excel/xxx?url=" + res.data);
注意:测试和正式服的前缀一般不同,注意,更到不同的服务器上使用不同的前缀
|