EasyExcel介绍

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在
一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程
度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel
解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用
POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现
内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使
用者更加简单方便。
    EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。
    在尽可能节约内存的情况下支持读写百M的Excel。

文档地址
github地址

导出示例

示例链接

导入示例

示例链接

EasyExcel集成

1. 添加依赖

1,添加依赖
<dependencies>
    <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.1.1</version>
    </dependency>
</dependencies>
说明:我们已经在yygh-parent中的pom.xml中添加了所有依赖管理

2.导入导出需要定义对象,对象上需要引用easyexcel标签,所以model模块需要引入,scope:provided

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<scope>provided </scope>
</dependency>

3.导入导出我们会把它封装成工具类,放在common-util中,所有模块公用,所以该模块也得引入

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>

数据字典导出

导出接口封装

1.在model模块添加导出实体

在model模块查看实体:com.atguigu.yygh.vo.cmn.DictEeVo
package com.atguigu.yygh.vo.cmn;

@Data
public class DictEeVo {

@ExcelProperty(value = "id",index = 0)
private Long id;

@ExcelProperty(value = "上级id",index = 1)
private Long parentId;

@ExcelProperty(value = "名称",index = 2)
private String name;

@ExcelProperty(value = "值",index = 3)
private String value;

@ExcelProperty(value = "编码",index = 4)
private String dictCode;

}

2.在service-cmn模块添加service方法

在DictService类添加接口
/**
 * 导出
 * @param response
*/
void exportData(HttpServletResponse response);
在DictServiceImpl类添加接口实现类
@Override
public void exportData(HttpServletResponse response) {
try {
      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");

      List<Dict> dictList = dictMapper.selectList(null);
      List<DictEeVo> dictVoList = new ArrayList<>(dictList.size());
for(Dict dict : dictList) {
         DictEeVo dictVo = new DictEeVo();
         BeanUtils.copyBean(dict, dictVo, DictEeVo.class);
         dictVoList.add(dictVo);
      }

      EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(dictVoList);
   } catch (IOException e) {
      e.printStackTrace();
   }
}
说明:直接复制示例代码中的“web中的写”,改造即可

3. 在service-cmn模块添加controller方法

在DictController类添加方法
@ApiOperation(value="导出")
@GetMapping(value = "/exportData")
public void exportData(HttpServletResponse response) {
dictService.exportData(response);
}

4. 测试

导出前端实现

1.列表页面添加导出按钮

<div class="el-toolbar">
<div class="el-toolbar-body"style="justify-content: flex-start;">
<el-button type="text"@click="exportData"><i class="fa fa-plus"/> 导出</el-button>
</div>
</div>

2.添加导出方法

exportData() {
window.location.href = 'http://localhost:8202/admin/cmn/dict/exportData'
}

3.测试

数据字典导入

导入接口封装

创建回调监听器

public class DictListener extends AnalysisEventListener<DictEeVo> {

    private DictMapper dictMapper;
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }

    //一行一行读取
    @Override
    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
        //调用方法添加数据库
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictEeVo,dict);
        dictMapper.insert(dict);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

在service-cmn模块添加service方法

//导入数据字典
@Override
public void importDictData(MultipartFile file) {
    try {
        EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在service-cmn模块添加controller方法

@ApiOperation(value = "导入")
@PostMapping("importData")
public Result importData(MultipartFile file) {
 dictService.importData(file);
 return Result.ok();
}

导入前端实现

列表页面添加导入按钮

src/views/cmn/dict/list.vue
<el-button type="text"@click="importData">
	<i class="fa fa-plus"/> 导入
</el-button>
说明:按钮位置与导出并列

添加导入弹出层

<el-dialog title="导入":visible.sync="dialogImportVisible"width="480px">
<el-form label-position="right"label-width="170px">

<el-form-item label="文件">
<el-upload
:multiple="false"
:on-success="onUploadSuccess"
:action="'http://localhost:8202/admin/cmn/dict/importData'"
class="upload-demo">
<el-button size="small"type="primary">点击上传</el-button>
<div slot="tip"class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
</el-upload>
</el-form-item>

</el-form>
<div slot="footer"class="dialog-footer">
<el-button @click="dialogImportVisible = false">
      取消
</el-button>
</div>
</el-dialog>

添加弹出可见模型

// 定义数据
data() {
return {
list: [],
listLoading: true,
dialogImportVisible: false
}
}

添加方法

importData() {
this.dialogImportVisible = true
},

onUploadSuccess(response, file) {
this.$message.info('上传成功')
this.dialogImportVisible = false
  this.fetchData()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值