首页 > 其他分享 >EasyExcel根据模板填充(多sheet页封装工具方法)

EasyExcel根据模板填充(多sheet页封装工具方法)

时间:2022-10-21 08:45:25浏览次数:56  
标签:map sheet 填充 EasyExcel param filename inputStream response 模板

原文链接:https://www.cnblogs.com/Donnnnnn/p/15412128.html

官方教程:

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);

}
复制代码

标签:map,sheet,填充,EasyExcel,param,filename,inputStream,response,模板
From: https://www.cnblogs.com/fswhq/p/16810592.html

相关文章

  • EasyExcel导出多个文件并直接打包成zip下载
    EasyExcel导出多个文件并直接打包成zip下载StringzipName="xxx.zip";try{response.addHeader("Content-Disposition","attachment;filename="+URLEncoder.......
  • CSP 普及 & 提高 考点 模板合集
    CSP普及&提高考点零、杂项加速cin/cout:ios::sync_with_stdio(false);。注:放在main函数的第一行,但使用它之后不能使用scanf/printf。避坑/防爆0指南。快读:inl......
  • vue3的学习笔记:MVC、Vue3概要、模板、数据绑定、用Vue3 + element ui 实现购物车案例
    一、前端MVC概要1.1、库与框架的区别框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。Vue是框架而jQuery则是库。......
  • #1369 : 网络流一·Ford-Fulkerson算法 模板题
    ​​http://hihocoder.com/problemset/problem/1369?sid=1108721​​别人都说先学网络流再学二分图,但是我先学了二分图的,感觉网络流好高端啊。首先对于原图,e[u][v],找到一条......
  • python下载站长素材免费简历模板(xpath)
    importos.pathimportrequestsfromlxmlimportetreeif__name__=='__main__':ifnotos.path.exists('./jianli'):os.mkdir('./jianli')he......
  • Vue模板是怎样编译的
    这一章我们开始讲模板解析编译:总结来说就是通过compile函数把tamplate解析成renderFunction形式的字符串compiler/index.jsimport{parse}from'./parser/index'imp......
  • P3386 【模板】二分图最大匹配
    #include<bits/stdc++.h>usingnamespacestd;constintN=5e5+4;intn,m;inth[N],to[N*2],nt[N*2],cnt;voidadd(intx,inty){nt[++cnt]=h[x];h[x]=cnt;......
  • P6242 【模板】线段树 3
    题目链接P6242【模板】线段树3【模板】线段树3题目背景本题是线段树维护区间最值操作与区间历史最值的模板。题目描述给出一个长度为\(n\)的数列\(A\),同时定义......
  • 快速缩略模板. ?imageView2/1/w/80/h/80
    通过 imageView2 接口提供常用图片处理模板。开发者根据业务需求,只需在下载URL后面附加相应的参数,就可以生成相应的缩略图。处理图片原图大小不超过32MB、宽高不超过30......
  • pentlab第三方镜像模板
    注意:使用此模板前,先把你的pentlab升级到最新版本,5.0.1链接:https://pan.baidu.com/s/1XNYo7CjD3ddSoC1gvHIt1w提取码:8a8i 更新模板引擎,对amdintel处理器做了区分使用......