excel的导入导出的两种方案 (1 EasyExcel 2 Hutool工具类)


前言

介绍
excel的导入导出
两种方式
(1 EasyExcel(alibaba) 2 Hutool工具类)

已经实现了 1 EasyExcel 的导入导出
待完善 2023/4/18


1 EasyExcel的导入导出

导出

1 导入依赖

<!--      easyexcel  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

2 项目中的CourseEntity实体类

项目用到的课程实体类  

这个实体类是我们DAO层绑定用的

不能使用这个实体类操作EasyExcel 我们等会儿再创建一个VO类
用VO类 操作EasyExcel

这里使用的是mybatis-plus的操作方式

@TableName("course")  注解绑定的是数据库中的course表

@TableId(type = IdType.AUTO)  主键ID ID为AUTO自增策略

在这里插入图片描述
在这里插入图片描述


/**
 * 课程表
 */
@Data
@TableName("course")
public class CourseEntity {
    
    
    /**
     * 主键
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 课程id
     */
    private Integer cid;

    /**
     * 课程名
     */
    private String name;
}

3 CoureseVo VO类 (对CourseEntity进行EasyExcel导入导出操作)

@ExcelIgnore 忽略 也就是导出的时候没有这个字段

@ExcelProperty(value = "课程id",index = 0)
value是指 导出到excel中的列名称
Index 是指在第几列 0 代表在第一列

在这里插入图片描述

@Data
public class CoureseVo {
    
    

    /**
     * 主键
     */
    @ExcelIgnore
    private Integer id;

    /**
     * 课程id
     */
    @ExcelProperty(value = "课程id",index = 0)
    private Integer cid;

    /**
     * 课程名
     */
    @ExcelProperty(value = "课程名称",index = 1)
    private String name;
}

4 导出代码的编写 并最终测试导出效果

这里为了方便 
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {
    
    

    //注入的是Mybatis-plus Dao层
    // 这个CourseDao 与数据库中的course 表已经绑定了
    //这里注入 DAO 直接调Dao的方法进行测试
    @Autowired
    CourseDao courseDao;


    @RequestMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
    
    

        //1 设置下载
        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");

        // 2 查所有course实体  封装到coureseVo中  再把coureseVo通过Easyexcel写出
        //   coureseVo相当于 course实体 和 Easyexcel工具的一个中介  实现了解耦
        List<CourseEntity> courseEntities = courseDao.selectList(null);
        ArrayList<CoureseVo> vos = new ArrayList<>();
        for (CourseEntity courseEntity : courseEntities) {
    
    
            CoureseVo coureseVo = new CoureseVo();
            BeanUtils.copyProperties(courseEntity,coureseVo);
            vos.add(coureseVo);
        }

        //write写出(输出位置,输出类型) .sheet(标题) .diwrite(实际写出的list集合数据)
        EasyExcel.write(response.getOutputStream(), CoureseVo.class).sheet("数据库课程").doWrite(vos);



    }

}

结果 测试

直接启动项目,浏览器 url 端口加路径访问
结果
在这里插入图片描述

5 (前端内容 可选)通过vue按钮点击 导出

1 <template 标签内容>

<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 <script标签内容>
调我们后端写的接口

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

导入

1 导入依赖 跟导出相同

2 创建回调监听器

package com.example.cat.EasyExcelListen;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.cat.dao.CourseDao;
import com.example.cat.entity.CoureseVo;
import com.example.cat.entity.CourseEntity;
import org.springframework.beans.BeanUtils;

//监听器类
//需要继承阿里的 AnalysisEventListener 泛型里写 EasyExcel工具和实体类的  中介VO类
public class courseListener extends AnalysisEventListener<CoureseVo> {
    
    

    //这里注入 mybatis-plus Dao层 方便我们对从excel表中读到的数据进行处理
    private CourseDao courseDao;
    public courseListener(CourseDao courseDao) {
    
    
        this.courseDao = courseDao;
    }



    //这个方法会 一行一行的读取 excel
    //把excel 中的一行内容变成 一个 中介类coureseVo
    @Override
    public void invoke(CoureseVo coureseVo, AnalysisContext analysisContext) {
    
    
        //创建数据库中对应的实体类
        CourseEntity courseEntity = new CourseEntity();
        //把每个中介类VO的 属性 copy给 数据库中对应的实体类
        BeanUtils.copyProperties(coureseVo,courseEntity);
        //添加到数据库中 实现到导入
        courseDao.insert(courseEntity);

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
    

    }
}


3 编写导入代码

我这里直接在cont

这里为了方便 
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {
    
    

    //注入的是Mybatis-plus Dao层
    // 这个CourseDao 与数据库中的course 表已经绑定了
    //这里注入 DAO 直接调Dao的方法进行测试
    @Autowired
    CourseDao courseDao;



    @RequestMapping("/import")
    public void importData(MultipartFile file) throws IOException {
    
    


        System.out.println("打印出来的是_" + file.toString());

        //导入操作
        //  read(文件中,读的类型,设置监听器(传入一个Mybatis-plus的dao 方便数据添加))
        EasyExcel.read(file.getInputStream(),CoureseVo.class,new courseListener(courseDao)).sheet().doRead();
        
    }

}

4 最终测试

先准备一个excel
在这里插入图片描述

使用POSTMAN访问接口
在这里插入图片描述
插入成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51751186/article/details/130222392