最近笔者遇到一个新需求,就是将一批数据进行导入数据库,但是要将校验不通过的数据生成一个Excel文件,放到七牛云上面,将地址返回前端,让前端自行下载.
我相信一开始很多人都是直接生成文件,然后使用response响应回去给前端的,因为我的做法是一个接口实现导入与将失败的数据导出,所以使用response,前端就无法接收到Message进行提示导入成功多少条数据,失败多少条数据了,废话少说,先看看response响应回去是怎么操作的,上代码
/**
* 默认的样式设置
*
* @return 样式信息
*/
public static HorizontalCellStyleStrategy excelStyleSet() {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 12);
headWriteCellStyle.setWriteFont(headWriteFont);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
WriteFont contentWriteFont = new WriteFont();
// 字体大小
contentWriteFont.setFontHeightInPoints((short) 10);
contentWriteCellStyle.setWriteFont(contentWriteFont);
return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
}
/**
* 动态表头,动态数据,生成Excel文件
* @param exportFilename 文件名
* @param obj 表头
* @param list 数据
* @param sheetName sheet名称
* @throws IOException
*/
public void writeToExcel(String exportFilename, Class<?> obj, List<?> list, String sheetName) throws IOException {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = requestAttributes.getResponse();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("Pragma", "no-cache");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(exportFilename, StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\";hrmInterface;" + "filename*=utf-8''" + fileName + ".xlsx");
//response.getOutputStream()流 obj表头 excelStyleSet()表格样式 sheetNamesheet名称 list数据集合
EasyExcel.write(response.getOutputStream(), obj).registerWriteHandler(excelStyleSet()).sheet(sheetName).doWrite(list);
}
通过上面代码,你会发现EasyExcel是将生成文件放到OutputStream流里面直接响应给前端的,所以这个时候我们无法在方法里面拿到文件,这个时候我们可以进入EasyExcel.write();里面看一下源码:
接下来往下看:
通过上面两个截图,我们可以看出来,EasyExcel是将文件生成了,那我们该如何在代码里面拿到生成的文件呢?接下来看新的代码段
/**
* 生成Excel文件放到七牛云
* 动态表态,动态数据,生成Excel文件
* @param exportFilename 文件名
* @param obj 表头
* @param list 数据
* @param sheetName sheet名称
* @param qiniuClient 七牛云引用
* @return
* @throws IOException
*/
public static String createExcel(Class<?> obj, List<?> list, String sheetName,QiniuClient qiniuClient){
ByteArrayOutputStream bos = new ByteArrayOutputStream();//字节流
EasyExcel.write(bos, obj).registerWriteHandler(excelStyleSet()).sheet(sheetName).doWrite(list);
//调用七牛云的上传方法,上传成功,七牛云会将地址返回
String resultUrl = qiniuClient.upload(bos.toByteArray());
System.out.println("水印文件上传七牛云成功返回resultUrl={}"+resultUrl);
logger.info("水印文件上传七牛云成功返回resultUrl={}",resultUrl);
return resultUrl;
}
剖析以上代码:
OK.这个是如何通过EasyExcel动态生成Excel文件,上传七牛云的我就不写出来了,要是需要上传七牛云的步骤,可以留言.
若有理解错误的地方,请指正哈.希望可以帮助到你们!