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文件,上傳七牛雲的我就不寫出來了,要是需要上傳七牛雲的步驟,可以留言.

若有理解錯誤的地方,請指正哈.希望可以幫助到你們!

記得轉載的時候,加上來源.謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM