java如何拿到EasyExcel生成文件,上传到七牛云

最近笔者遇到一个新需求,就是将一批数据进行导入数据库,但是要将校验不通过的数据生成一个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文件,上传七牛云的我就不写出来了,要是需要上传七牛云的步骤,可以留言.

若有理解错误的地方,请指正哈.希望可以帮助到你们!

记得转载的时候,加上来源.谢谢!

posted @ 2021-02-04 17:44  陈程序员  阅读(1649)  评论(0编辑  收藏  举报