//视频链接
https://www.bilibili.com/video/av99022731/?p=2
导出要求,根据选中多少人,每个人的信息就是一个excel文件,每个文件有两个sheet页面。最后多个文件压缩成一个压缩包返回前端。下面是导出的文件图片
//controller
@Autowired
private EasyExcelKeyAccountService easyExcelKeyAccountService;
@ApiOperation(value = "重点账号导出")
@ApiOperationSupport(order = 1)
@PostMapping("/keyAccountExport")
public void keyAccountExport(@RequestBody List<ElementAccountCommonVO> listNew , HttpServletResponse response)throws IOException {
this.easyExcelKeyAccountService.keyAccountExport(listNew,response);
}
//实现类
@Override
public void keyAccountExport(List<ElementAccountCommonVO> listNew, HttpServletResponse response) {
try {
// 登录用户校验
Long userId = ThreadLocalHolder.getUserIdLocal();
Assert.isTrue(ObjectUtil.isNotNull(userId), "获取登录用户信息失败,查询失败");
response.setHeader("content-type", "application/octet-stream");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode("keyAccounts", "UTF-8") + ".zip");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); // 暴露文件名
//循环集合 导出多个excel 集合循环次数就是excel个数
for (int m = 0; m < listNew.size(); m++) {
//要导出sheet0的集合数据
List<ElementAccountDetailsExcel> warningDetails = new ArrayList();
//要导出sheet1的集合数据
List<ElementAccountExcel> resList = new ArrayList();
//导出excel 这个方法里面就是导出 (一个 )excel 里面有两个sheet页面的excel文件,上面循环就是导出多个 文件
createExcel(m, warningDetails, resList);
}
//创建压缩包路径名称
String zipFilePath = keyAccountExportPath + File.separator + "keyAccounts.zip";
// 创建输出流
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos);
// 压缩文件
for (int i = 0; i < listNew.size(); i++) {
// 获取当前 Excel 文件路径
String excelFilePath = keyAccountExportPath + File.separator + i + ".xlsx";
File file = new File(excelFilePath);
if (file.exists()) {
addFileToZip(file, zos);
}
}
// 关闭流
zos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
log.error("导出重点账号失败:{}", e);
}
//压缩完之后获取文件返回前端流
try {
// 创建 File 对象
File file = new File(keyAccountExportPath + File.separator + "keyAccounts.zip");
// 读取文件内容并写入响应输出流
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// 关闭流
fileInputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
log.error("下载文件返回前端流失败:{}", e);
}
//压缩完删除之前的文件
for (int i = 0; i < listNew.size(); i++) {
String excelFilePath = keyAccountExportPath + File.separator + i + ".xlsx";
File file = new File(excelFilePath);
if (file.exists()) {
file.delete();
}
}
}
//里面主要创建两个sheet页面 然后生成一个文件 这是上面的方法
private void createExcel(int m, List<ElementAccountDetailsExcel> warningDetails, List<ElementAccountExcel> resList) {
ExcelWriter excelWriter = null;
//判断文件夹是否存在 不存在就创建一个 keyAccountExportPath是你存入本地的路径
File files = new File(keyAccountExportPath);
if (!files.exists()) {
files.mkdirs();
}
String fileName = keyAccountExportPath + File.separator + m + ".xlsx";
try {
// 这里 sheet1
excelWriter = EasyExcel.write(fileName).build();
// 这里 sheet0
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
WriteSheet writeSheet2 = EasyExcel.writerSheet(0, "重点账号信息" + 0).build();
//每个class根据自己的来 可以替换 实体类加上注解
writeSheet2.setClazz(ElementAccountExcel.class);
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
excelWriter.write(resList, writeSheet2);
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
WriteSheet writeSheet1 = EasyExcel.writerSheet(1, "预警信息" + 1).build();
//每个class根据自己的来 可以替换 实体类加上注解
writeSheet1.setClazz(ElementAccountDetailsExcel.class);
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
excelWriter.write(warningDetails, writeSheet1);
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
}
/**
* 文件添加压缩包
* @param file
* @param zipOutputStream
* @throws IOException
*/
private static void addFileToZip(File file, ZipOutputStream zipOutputStream) throws IOException {
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, length);
}
zipOutputStream.closeEntry();
fis.close();
}