如何使用Easypoi按模板导出Excel?

Easypoi为谁开发

  • 不太熟悉poi的
  • 不想写太多重复太多的
  • 只是简单的导入导出的
  • 喜欢使用模板的

Easypoi的目标是什么

不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样的工作

独特的功能
  • 基于注解的导入导出,修改注解就可以修改Excel
  • 支持常用的样式自定义
  • 基于map可以灵活定义的表头字段
  • 支持一堆多的导出,导入
  • 支持模板的导出,一些常见的标签,自定义标签
  • 支持HTML/Excel转换,如果模板还不能满足用户的变态需求,请用这个功能
  • 支持word的导出,支持图片,Excel

如何使用

  1. easypoi 父包--作用大家都懂得
  2. easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
  3. easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  4. .easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能

加入maven依赖,如果没有maven请直接下jar,在alimaven

    <dependency>    
        <groupId>cn.afterturn</groupId>    
        <artifactId>easypoi</artifactId>   
        <version>3.2.0</version>   
        <type>pom</type>
    </dependency>
    <dependency>   
        <groupId>cn.afterturn</groupId>   
        <artifactId>easypoi-base</artifactId> 
        <version>3.2.0</version>
    </dependency>
    <dependency>    
        <groupId>cn.afterturn</groupId>    
        <artifactId>easypoi-annotation</artifactId>    ]
        <version>3.2.0</version>
     </dependency>
    <dependency>   
        <groupId>cn.afterturn</groupId>  
        <artifactId>easypoi-web</artifactId>  
        <version>3.2.0</version>
    </dependency>
java导出接口
/**
     * 自定义导出过磅记录excel
     *
     * @param poundLogDto 查询条件
     * @return
     */
    @RequestMapping(value = "/poundLog/exportCustomExcel", method = {RequestMethod.GET})
    @ResponseBody
    public Result exportCustomExcel(PoundLogDto poundLogDto) {
        //1.获取废品的excel模板
        TemplateExportParams params = new TemplateExportParams("doc/customLog.xlsx");
        //2.获取所有过磅数据
        List<Map<String, Object>> allMap = poundLogService.findAllMapByCondition(poundLogDto, null);

        Map<String, Object> map = new HashMap<String, Object>(100);
        map.put("poundLogList", allMap);
        //3.执行excel导出
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);

        //4.创建文件存储路径
        String dateStr = DateUtil.dateString("yyyy_MM_dd", new Date());
        File saveFile = new File(systemProperties.getFileLocation() + "/excel/" + dateStr);
        if (!saveFile.exists()) {
            saveFile.mkdirs();
        }
        FileOutputStream fos;
        String filePath;
        try {
            //4.写入文件
            filePath = saveFile + "\\过磅记录.xlsx";
            fos = new FileOutputStream(filePath);
            workbook.write(fos);
            fos.close();

            JSONObject data = new JSONObject();
            data.put("filepath", filePath);
            return ResultUtil.success("数据导出成功!", data);
        } catch (FileNotFoundException e) {
            logger.error("FileNotFoundException={}", e.getMessage());
            return ResultUtil.error("数据导出失败!" + e.getMessage());
        } catch (IOException e) {
            logger.error("IOException={}", e.getMessage());
            return ResultUtil.error("数据导出失败!" + e.getMessage());
        }
    }
    
    
 /**
     * 获取所有数据封装成mapList
     *
     * @param poundLogDto 查询条件
     * @param types       进出货类型 0:进货 1:出货 null:全选
     * @return mapList
     */
    @Override
    public List<Map<String, Object>> findAllMapByCondition(PoundLogDto poundLogDto, Integer types) {
        if (Integer.valueOf(PoundLogConstant.TYPES_IN).equals(types) || Integer.valueOf(PoundLogConstant.TYPES_OUT).equals(types)) {
            poundLogDto.setTypes(types);
        }
        List<PoundLog> poundLogList = httpService.findAllLogByCondition(poundLogDto);
        if (null == poundLogList) {
            return new ArrayList<>(0);
        }

        List<Map<String, Object>> mapList = new ArrayList<>(poundLogList.size());

        for (PoundLog poundLog : poundLogList) {
            Map<String, Object> mapOne = new HashMap<>(100);
            if (StringUtils.isNotEmpty(poundLog.getShopCode())) {
                WorkShop workShop = workShopMapper.findByShopCode(poundLog.getShopCode());
                poundLog.setWorkShopName(workShop.getShopName() + "-" + workShop.getOrganization().getOrgName());
                mapOne.put("workShopName", poundLog.getWorkShopName());
            }
            mapOne.put("createTime", DateUtil.parseToFormatDateString(poundLog.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
            mapOne.put("goodsName", poundLog.getGoodsName());
            mapOne.put("compName", poundLog.getCompName());
            mapOne.put("orgName", poundLog.getUnitName());
            mapOne.put("plateNo", poundLog.getPlateNo());
            mapOne.put("grossWeight", poundLog.getGrossWeight());
            mapOne.put("tareWeight", poundLog.getTareWeight());
            mapOne.put("netWeight", poundLog.getNetWeight());
            mapOne.put("diffWeight", poundLog.getDiffWeight());
            mapOne.put("returnWeightTotal", poundLog.getReturnWeightTotal());
            mapOne.put("unit", "公斤");
            mapOne.put("remark", poundLog.getRemark());
            mapOne.put("poundLogNo", poundLog.getPoundLogNo());
            mapOne.put("inspNo", poundLog.getInspNoList());
            mapOne.put("month", DateUtil.getMonth(poundLog.getCreateTime()) + "月");
            mapList.add(mapOne);
        }

        return mapList;
    }
excel模板
Image.png
模板指令介绍

模板是处理复杂Excel的简单方法,复杂的Excel样式,可以用Excel直接编辑,完美的避开了代码编写样式的雷区,同时指令的支持,也提了模板的有效性 下面列举下EasyPoi支持的指令以及作用,最主要的就是各种fe的用法

  1. 空格分割
  2. 三目运算 {{test ? obj:obj2}}
  3. n: 表示 这个cell是数值类型
  4. {{n:}}le: 代表长度{{le:()}}
  5. 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  6. fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  7. fn: 格式化数字 {{fn:(obj;###.00)}}
  8. fe: 遍历数据,创建row!fe: 遍历数据不创建row$fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入#
  9. fe: 横向遍历v_fe: 横向遍历值
  10. !if: 删除当前列 {{!if:(test)}}
  11. 单引号表示常量值 '' 比如'1' 那么输出的就是 1
  12. &NULL& 空格
  13. ]] 换行符
  14. 多行遍历导出
  15. sum: 统计数据

整体风格和el表达式类似,大家应该也比较熟悉 采用的写法是{{}}代表表达式,然后根据表达式里面的数据取值

关于样式问题

easypoi不会改变excel原有的样式,如果是遍历,easypoi会根据模板的那一行样式进行复制

友情链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353