springboot+easyExcel实现导出操作

目的

根据业务需求对数据进行导出excel操作,该excel包括4个模版(sheet),每一个模板代表一个实体对象。如图:


sheet

开始

本项目使用的是springboot + vue +elementUI 实现,由于需要使用导出excel功能,所以浅入了easyExcel模块。

1、导入easyExcel坐标依赖
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

easyExcel官方文档:https://www.yuque.com/easyexcel/doc/quickstart

2、实体类编写

在这里使用了lombok插件,使用easyExcel只需要设置导出的excel表列名,使用@ExcelProperty(value="")注解。具体配置列名、数据转换,日期格式,自定义excel表格样式,请去官网查看。


实体类部分图
3、controller编写
/**
     * 导出档案
     */
    @RequestMapping("/export")
    public void export(@RequestParam Map<String, Object> params, HttpServletResponse response) throws IOException {
        OutputStream outputStream = response.getOutputStream();
        // 获取数据
        PageUtils page = archService.getStatistics(params);
        // 获取农合档案信息
        List<ArchEntity> archEntityList = (List<ArchEntity>) page.getList();
        // 遍历设置List
        if (archEntityList.size() > 0) {
            List<FamilyEntity> familyEntityList = new ArrayList<>();
            List<CardEntity> cardEntityList = new ArrayList<>();
            List<PayEntity> payEntityList = new ArrayList<>();
            for (int i = 0; i < archEntityList.size(); i++) {
                // 获取家庭档案
                familyEntityList.add(i, archEntityList.get(i).getFamilyEntity());
                // 获取慢性病卡档案
                cardEntityList.add(i, archEntityList.get(i).getCardEntity());
                // 获取慢性病报销信息
                payEntityList.add(i, archEntityList.get(i).getPayEntity());
            }
            try {
                // 设置response
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
                String fileName = URLEncoder.encode("统计信息", "UTF-8");
                response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
                //新建ExcelWriter
                ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
                //获取archSheet对象
                WriteSheet archSheet = EasyExcel.writerSheet(0, "农合信息档案").head(ArchEntity.class).build();
                //获取参合人员信息,向archSheet写入数据
                excelWriter.write(archEntityList, archSheet);
                //获取archSheet对象
                WriteSheet familySheet = EasyExcel.writerSheet(1, "参合家庭档案").head(FamilyEntity.class).build();
                //获取家庭参合信息,向familySheet写入数据
                excelWriter.write(familyEntityList, familySheet);
                //获取cardSheet对象
                WriteSheet cardSheet = EasyExcel.writerSheet(2, "慢性病卡信息").head(CardEntity.class).build();
                //获取家庭参合信息,向cardSheett写入数据
                excelWriter.write(cardEntityList, cardSheet);
                //获取paySheet对象
                WriteSheet paySheet = EasyExcel.writerSheet(3, "报销记录").head(PayEntity.class).build();
                //获取家庭参合信息,向paySheet写入数据
                excelWriter.write(payEntityList, paySheet);
                //关闭流
                excelWriter.finish();
                outputStream.flush();
            } catch (IOException e) {
                log.error("导出异常{}", e.getMessage());
            }
        }
    }
  • 1、创建OutputStream对象
OutputStream outputStream = response.getOutputStream();
  • 2、设置头、类型、编码格式
// 设置response
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("统计信息", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  • 3、创建ExcelWriter对象
//新建ExcelWriter
ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
  • 4、创建WriteSheet对象,调用EasyExcel.writerSheet()方法写入参数
//获取archSheet对象
WriteSheet archSheet = EasyExcel.writerSheet(0, "农合信息档案").head(ArchEntity.class).build();

0为第一个模板(sheet),名称是农合信息档案。head()中传入的参数为实体类

  • 5、调用excelWriter.write()向sheet模板写入参数
//获取参合人员信息,向archSheet写入数据
excelWriter.write(archEntityList, archSheet);

向excelWriter.write()方法中传入List数据与WriteSheet对象

  • 6、关闭excelWriter.finish()
//关闭流
excelWriter.finish();
  • 7 、关闭outputStream.flush();
 outputStream.flush();
3、前端界面编写
// 导出档案
    exportHandle () {
      this.$nextTick(() => {
        this.$http({
          url: this.$http.adornUrl('/mxbbx/arch/export'),
          method: 'get',
          responseType: 'blob',
          params: this.$http.adornParams({
            'page': this.pageIndex,
            'limit': this.pageSize,
            'groupId': this.dataForm.groupId,
            'apName': this.dataForm.apName,
            'areaTime': this.dataForm.areaTime,
            'drName': this.dataForm.drName
          })
        }).then(({data}) => {
          // 创建Blob对象
          let blob = new Blob([data], { type: 'application/vnd.ms-excel;charset=utf-8' })
          // 获取路径
          let url = window.URL.createObjectURL(blob)
          // 创建a标签
          const link = document.createElement('a')
          // 设置a标签链接参数
          link.href = url
          // 重命名文件
          link.download = '报销信息.xlsx'
          link.click()
          // 下载完成释放URL 对象
          URL.revokeObjectURL(url)
          // 移除a标签
          document.body.removeChild(link)
        })
      })
    },

注意事项
1、这里我使用的axios异步调用处理(和ajax没啥大区别)
2、请求参数中设置:responseType: 'blob',将返回响应类型设置为blob
3、在返回成功then()中,创建a标签,并为a标签设置超链接,并设置点击下载文件流。如果不使用创建a标签的方式,将不会显示下载弹窗!!!(大坑,后端成功了,前端一直没有出现下载文件的弹窗,可能是vue的原因,在html中无需设置)

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

推荐阅读更多精彩内容