EasyPoi Excel多Sheet導出(Java spring boot)


本文摘要

文中介紹了便捷Excel輪子easypoi,特點及使用方法,以及如何實現Excel多Sheet的導出功能

前言

Excel 作為開發中常用功能,經常需要用到,小老弟找了網上一些多Sheet導出的實現,都不太滿意,因此根據EasyPoi的說明文檔寫了一個工具類,在這里和大家分享
EasyPoi和阿里的EasyExcel都有用過,是為便捷操作Excel的開源輪子,基於不重復造的原則,小老弟對使用較多的easyPoi進行本文所需功能的實現

EasyPoi支持如下

功能列表 詳細
Excel導入 注解導入 && Map導入 && 大數據量導入sax模式 && 導入文件保存 && 文件校驗 && 字段校驗
Excel導出 注解導出 && 模板導出 && html導出,Excel自適應xls和xlsx兩種格式
Excel轉html
word導出 word只支持docx模式
pdf導出

准備工作

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>

多sheet的Excel導出

生成workbook關鍵代碼

    /**
     * 創建workbook,
     * 通過maplist填充Excel內容
     * 返回workbook
     *
     * 進一步使用可以寫入流,e.g.
     * FileOutputStream fos = new FileOutputStream(file);
     * workbook.write(fos);
     * */
    public static Workbook mutiSheet(List<Map<String, Object>> mapListList){
        Workbook workbook = null;
        workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF);
        return workbook;
    }

多sheet工具類WorkBookUtils

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.jdcloud.task.domain.vo.wenxian.IndustryStoreMomFungi;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WorkBookUtils {
    /**
     * 創建workbook,
     * 通過maplist填充Excel內容
     * 返回workbook
     *
     * 進一步使用可以寫入流,e.g.
     * FileOutputStream fos = new FileOutputStream(file);
     * workbook.write(fos);
     * */
    public static Workbook mutiSheet(List<Map<String, Object>> mapListList){
        Workbook workbook = null;
        workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF);
        return workbook;
    }
    public static Map<String, Object> createOneSheet(ExportParams exportParams,Class<?> clazz,List<?> data){
        Map<String, Object> map = new HashMap<>();
        map.put("title",exportParams);//new ExportParams("title"+i, "sheetName"+i, ExcelType.XSSF)
        map.put("entity", clazz);
        map.put("data",data);
        return map;
    }
    /*
    * 創建一個表格並填充內容
    * 返回map供工作簿使用
    * */
    public static Map<String, Object> createOneSheet(String sheetName,String title,Class<?> clazz,List<?> data){
        ExportParams exportParams = new ExportParams(title,sheetName, ExcelType.XSSF);
        return createOneSheet(exportParams,clazz,data);
    }
}

service

    /**
     * 將數據存儲進response,調用接口就能下載文件
     * */
    public void exportData(HttpServletRequest request, HttpServletResponse response ) throws URISyntaxException, IOException {
        String fileName="data.xlsx";
        File file = createDatafile(fileName);
        Object data=null;
        fillData(file,data);
        datatoResponse(request,response,file,fileName);
    }

    /**
     * 將數據存儲進response,調用接口就能下載文件
     * */
    private void datatoResponse(HttpServletRequest request, HttpServletResponse response,File file,String fileName) throws IOException {
        OutputStream out = null;
        FileInputStream in = null;
        try {
            // 1.讀取要下載的內容
            in = new FileInputStream(file);
            // 2. 告訴瀏覽器下載的方式以及一些設置
            // 解決文件名亂碼問題,獲取瀏覽器類型,轉換對應文件名編碼格式,IE要求文件名必須是utf-8, firefo要求是iso-8859-1編碼
            String agent = request.getHeader("user-agent");
            if (agent.contains("FireFox")) {
                fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
            } else {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            }
            // 設置下載文件的mineType,告訴瀏覽器下載文件類型
            String mineType = request.getServletContext().getMimeType(fileName);
            response.setContentType(mineType);
            // 設置一個響應頭,無論是否被瀏覽器解析,都下載
            response.setHeader("Content-disposition", "attachment; filename=" + fileName);
            // 將要下載的文件內容通過輸出流寫到瀏覽器
            out = response.getOutputStream();
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                in.close();
            }
        }
    }
    /**
     *  設置文件路徑 && 保證文件對象的正確打開
     * */
    private File createDatafile(String fileName) throws URISyntaxException, IOException {
        File file = null;
        String resource = this.getClass().getClassLoader().getResource("").getPath()+fileName;
        URI uri = new URI(resource);
        File myFile = new File(resource);//創建File對象,參數為String類型,表示目錄名
        //判斷文件是否存在,如不存在則調用createNewFile()創建新目錄,否則跳至異常處理代碼
        if(!myFile.exists()) myFile.createNewFile();
        System.out.println("文件創建成功");
        return myFile;
    }

    private File fillData(File savefile,Object data) throws IOException {
        List<Map<String, Object>> lists = new ArrayList<>();
        //sheet1
        List<Map<String, String>> datas1 = excelDao.queryTableColumns("whole_network_wenxian_region_trend_info");
        Map<String, Object> temp1 = WorkBookUtils.createOneSheet("表1", "表頭大標題", Map.class, datas1);
        lists.add(temp1);
        //sheet2
        List<Map<String, String>> datas2 = excelDao.queryTableColumns("whole_network_wenxian_industry_trend");
        Map<String, Object> temp2 = WorkBookUtils.createOneSheet("表2", "表頭大標題", Map.class, datas2);
        lists.add(temp2);
        Workbook workbook = WorkBookUtils.mutiSheet(lists);
        FileOutputStream fos = new FileOutputStream(savefile);
        workbook.write(fos);
        fos.close();
        return savefile;
    }

controller

    @RequestMapping("/export")
    public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
        excelService.exportData(request,response);
    }

最終的效果圖


免責聲明!

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



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