EasyExcel根據報表模板來填充報表(多sheet頁填充、封裝工具方法)


官方教程:

https://www.yuque.com/easyexcel/doc/fill

 

 

 

一、填充模板里單個sheet頁

 

模板

 

 

 

feeDate:要填充的單個的值

.name:是個集合

 

 

封裝的公共方法

/**
     *
     * EasyExcel 填充報表
     *
     * @param response
     * @param list  填充集合
     * @param map     填充單個的值
     * @param sheetNo   填充到哪個Sheet頁 Index of sheet, 0 base.
     * @param filename   文件名
     * @param inputStream   文件流.
     */
    public void fillReportWithEasyExcel(HttpServletResponse response, Integer sheetNo, List<?> list, Map<String, String> map, String filename, InputStream inputStream){
        ExcelWriter excelWriter = null;
        try {
            OutputStream outputStream = response.getOutputStream();
            response.setHeader("Content-disposition", "attachment; filename=" + filename);
            response.setContentType("application/msexcel;charset=UTF-8");//設置類型
            response.setHeader("Pragma", "No-cache");//設置頭
            response.setHeader("Cache-Control", "no-cache");//設置頭
            response.setDateHeader("Expires", 0);//設置日期頭
            excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build();
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(list, fillConfig, writeSheet);
            excelWriter.fill(map, writeSheet);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            excelWriter.finish();
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

業務代碼調用例子:

//數據庫里查詢得到的list集合
List<XXX> list = mapper.select();

//要填充的單個的值
Map<String, String> map = new HashMap<>();
map.put("feeDate", feeDate);
map.put("name", name);

String filename = "filename";

//工程路徑下有個模板文件
String modelPath = "classpath:static/XXX/xxxxxx.xlsx";
//讀取模板文件
InputStream inputStream = ResourceUtils.getURL(modelPath).openStream();

//調用方法即可
fillReportWithEasyExcel(response, 0, list, map, filename, inputStream);

 

 

 

二、填充一個模板里多個sheet頁

 

對上面的封裝的公共方法進行改進

/**
 *
 * EasyExcel 填充報表
 *
 * @param response
 * @param sheetAndDataMap  key:sheet頁,value:填充的list集合
 * @param map     填充單個的值
 * @param filename   文件名
 * @param inputStream   文件流.
 */
public static void fillReportWithEasyExcel(HttpServletResponse response, Map<String, List<?>> sheetAndDataMap, 
                                           Map<String, String> map, String filename, InputStream inputStream){
    ExcelWriter excelWriter = null;
    try {
        OutputStream outputStream = response.getOutputStream();
        response.setHeader("Content-disposition", "attachment; filename=" + filename);
        response.setContentType("application/msexcel;charset=UTF-8");//設置類型
        response.setHeader("Pragma", "No-cache");//設置頭
        response.setHeader("Cache-Control", "no-cache");//設置頭
        response.setDateHeader("Expires", 0);//設置日期頭
        excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build();
        for(Map.Entry<String, List<?>> entry : sheetAndDataMap.entrySet()){
            List<?> value = entry.getValue();
            WriteSheet writeSheet = EasyExcel.writerSheet(Integer.valueOf(entry.getKey())).build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(value, fillConfig, writeSheet);
            excelWriter.fill(map, writeSheet);

        }

    }catch (Exception e){
        e.printStackTrace();
    }finally {
        excelWriter.finish();
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 說明:

(1)List<?>:泛型,支持填充不同類型的List

(2)sheetAndDataMap  key:sheet頁,value:填充的list集合;for循環往不同的sheet頁里填充不同的list

 

業務代碼調用例子:

public void exportAllReport(HttpServletResponse response, String feeDate) throws Exception {

    String filename = "test.xlsx";
    String modelPath = "classpath:static/test.xlsx";//模板所在路徑
    InputStream inputStream = ResourceUtils.getURL(modelPath).openStream();//獲取輸入流
    
    //填充單個的值
    Map<String, String> map = new HashMap<>();
    map.put("feeDate", feeDate);
    
    //待填充的多個sheet頁的list,都加入此map
    Map<String, List<?>> dataMap = new HashMap<>();
    
    //填充sheet1
    List<Model1> list1 = dao.select1(feeDate);
    dataMap.put("0", list1);
    
    //填充sheet2
    List<Model2> list2 = dao.select2(feeDate);
    dataMap.put("1", list2);
    
    //填充sheet3
    List<Model3> list3 = dao.select3(feeDate);
    dataMap.put("2", list3);
    
    //填充報表,並下載
    ExcelUtil.fillReportWithEasyExcel(response, dataMap, map, filename, inputStream);

}

 


免責聲明!

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



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