我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot整合EasyExcel实现导入导出数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot整合EasyExcel实现导入导出数据

前言

创建一个普通的maven项目即可

项目目录结构

1.前端

存放在resources/static 下

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script class="lazy" data-src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link
      rel="stylesheet"
      href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow" 
    />
    <!-- 引入组件库 -->
    <script class="lazy" data-src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script class="lazy" data-src="https://unpkg.com/axios/dist/axios.min.js"></script>
  </head>
  <body>
    <div id="app">
      <div class="app-container">
        <div style="margin-bottom: 10px">
          <el-button
            @click="dialogVisible = true"
            type="primary"
            size="mini"
            icon="el-icon-download"
          >
            导入Excel
          </el-button>
          <el-dialog
            title="数据字典导入"
            :visible.sync="dialogVisible"
            width="30%"
          >
            <el-form>
              <el-form-item label="请选择Excel文件">
                <el-upload
                  :auto-upload="true"
                  :multiple="false"
                  :limit="1"
                  :on-exceed="fileUploadExceed"
                  :on-success="fileUploadSuccess"
                  :on-error="fileUploadError"
                  :action="importUrl"
                  name="file"
                  accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                >
                  <!--accept 只接受某种格式的文件-->
                  <el-button size="small" type="primary">点击上传</el-button>
                </el-upload>
              </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
              <el-button @click="dialogVisible = false">取消</el-button>
            </div>
          </el-dialog>

          <!-- 导出 -->
          <el-button
            @click="exportData"
            type="primary"
            size="mini"
            icon="el-icon-upload2"
          >
            导出Excel
          </el-button>

          <!-- 数据展示 -->
          <el-table :data="list" stripe style="width: 100%">
            <el-table-column prop="name" label="姓名" width="180">
            </el-table-column>
            <el-table-column prop="birthday" label="生日" width="180">
            </el-table-column>
            <el-table-column prop="salary" label="薪资"> </el-table-column>
          </el-table>
          <div>
            <el-pagination
              @size-change="handleSizeChange"
              @current-change="handleCurrentChange"
              :current-page="pageNum"
              :page-sizes="[2, 5, 10,  20]"
              :page-size="pageSize"
              background
              layout="total, sizes, prev, pager, next, jumper"
              :total="total"
            >
            </el-pagination>
          </div>
        </div>
      </div>
    </div>
  </body>
  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          dialogVisible: false, //文件上传对话框是否显示
          list: [], // 字典的数据
          importUrl: 'http://localhost:8811/api/excel/import',
          pageNum: 1, // 页数
          pageSize: 5, // 每页条数
          total: 1000,
        }
      },
      created() {
        this.showList()
      },
      methods: {
        showList() {
          //使用自定义配置
          const request = axios.create({
            baseURL: 'http://localhost:8811', //url前缀
            timeout: 1000, //超时时间
            // headers: { token: 'helen123456' }, //携带令牌
          })
          request
            .get('/api/excel/list', {
              params: {
                pageNum: this.pageNum,
                pageSize: this.pageSize,
              },
            })
            .then((res) => {
              this.total = res.data.size
              this.list = res.data.list
              console.log(res)
            })
        },
        // 上传多于一个文件时
        fileUploadExceed() {
          this.$message.warning('只能选取一个文件')
        },
		// 导出
        exportData() {
          window.location.href = 'http://localhost:8811/api/excel/export'
        },

        //上传成功回调
        fileUploadSuccess(response) {
          if (response.code === 0) {
            this.$message.success('数据导入成功')
            this.dialogVisible = false
          } else {
            this.$message.error(response.message)
          }
        },

        //上传失败回调
        fileUploadError(error) {
          this.$message.error('数据导入失败')
        },
        
        handleSizeChange(val) {
          console.log(`每页 ${val} 条`)
          this.pageSize = val
          this.showList()
        },
        handleCurrentChange(val) {
          console.log(`当前页: ${val}`)
          this.pageNum = val
          this.showList()
        },
      },
    })
  </script>
</html>

2.数据库

CREATE TABLE `student` (
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `salary` decimal(10,4) DEFAULT NULL COMMENT '薪资'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.后端

3.1 contrller

StudentController

@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/api/excel/")
public class StudentController {

    @Resource
    private StudentMapper studentMapper;

    @GetMapping("list")
    public HashMap<String, Object> list(@RequestParam int pageNum,@RequestParam int pageSize){
        // 分页查询
        Page<Student> page = new Page<>(pageNum, pageSize);
        studentMapper.selectPage(page,null);
        
        // 封装数据
        HashMap<String, Object> map = new HashMap<>();
        ArrayList<ExcelStudentDTO> excelDictDTOList = new ArrayList<>();
        // 转换数据
        page.getRecords().forEach(student -> {
            ExcelStudentDTO studentDTO = new ExcelStudentDTO();
            BeanUtils.copyProperties(student,studentDTO);
            excelDictDTOList.add(studentDTO);
        });
        
        map.put("list",excelDictDTOList);
        map.put("size",page.getTotal());
        return map;
    }

    
    @RequestMapping("import")
    @Transactional(rollbackFor = {Exception.class})
    public String importData( @RequestParam("file") MultipartFile file){
        try {
            // 读取文件流
            EasyExcel.read
                    (file.getInputStream(),// 前端上传的文件
                            ExcelStudentDTO.class,// 跟excel对应的实体类
                            new ExcelDictDTOListener(studentMapper))// 监听器 
                    .excelType(ExcelTypeEnum.XLSX)// excel的类型
                    .sheet("模板").doRead();
            log.info("importData finished");
        } catch (IOException e) {
           log.info("失败");
           e.printStackTrace();
        }
        return "上传成功";
    }

    
    @GetMapping("export")
    public String exportData(HttpServletResponse response){

        try {
            // 设置响应体内容
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");

            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("myStu", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            EasyExcel.write(response.getOutputStream()
                    ,ExcelStudentDTO.class).sheet().doWrite(studentMapper.selectList(null));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "上传成功";
    }

}

3.2 mapper

StudentMapper

@Mapper
public interface StudentMapper extends BaseMapper<Student> {
    void insertBatch(List<ExcelStudentDTO> list);
}

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="look.word.mapper.StudentMapper">
  <insert id="insertBatch" >
    insert into student(name, birthday, salary)
    values
    <foreach collection="list"   item="item" separator=",">
               (
        #{item.name} ,
        #{item.birthday} ,
        #{item.salary} 
        )
    </foreach>
  </insert>
</mapper>

3.3 bean

ExcelStudentDTO

导入数据时 要保证excel中列名和ExcelStudentDTO一致奥


@Data
public class ExcelStudentDTO {
	// excel中的列名
    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("生日")
    private Date birthday;

    @ExcelProperty("薪资")
    private BigDecimal salary;
}

Student


@Data
@TableName(value = "student")
public class Student {
    
    @TableField(value = "name")
    private String name;

    
    @TableField(value = "birthday")
    private Date birthday;

    
    @TableField(value = "salary")
    private BigDecimal salary;

    public static final String COL_NAME = "name";

    public static final String COL_BIRTHDAY = "birthday";

    public static final String COL_SALARY = "salary";
}

3.4 listener

官方文档

EasyExcel读取文件需要用到

ExcelDictDTOListener


@Slf4j
//@AllArgsConstructor //全参
@NoArgsConstructor //无参
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelStudentDTO> {


    
    private static final int BATCH_COUNT = 5;
    List<ExcelStudentDTO> list = new ArrayList<ExcelStudentDTO>();

    private StudentMapper studentMapper;

    //传入mapper对象
    public ExcelDictDTOListener(StudentMapper studentMapper) {
        this.studentMapper = studentMapper;
    }

    
    @Override
    public void invoke(ExcelStudentDTO data, AnalysisContext context) {
        log.info("解析到一条记录: {}", data);
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!");
    }

    
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", list.size());
        studentMapper.insertBatch(list);  //批量插入
        log.info("存储数据库成功!");
    }
}

3.5 config

mybatisPlus分页插件

MybatisPlusConfig

@Configuration
public class MybatisPlusConfig {

    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
}

3.6 配置文件

application.yaml

server:
  port: 8811
spring:
  datasource: # mysql数据库连接
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/2022_source_springboot?serverTimezone=GMT%2B8&characterEncoding=utf-8
    username: root
    password: 317311
mybatis-plus:
  configuration:# sql日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations:
    - classpath:mapper/*.xml

4.启动测试

启动springboot哦

页面效果图

导出效果

注意

导入数据时要保证excel中列名和ExcelStudentDTO一致奥

到此这篇关于SpringBoot整合EasyExcel实现导入导出数据的文章就介绍到这了,更多相关SpringBoot EasyExcel导入导出数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot整合EasyExcel实现导入导出数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot整合easyExcel实现CSV格式文件的导入导出

本文介绍了如何使用EasyExcel集成SpringBoot实现CSV格式文件的导入导出。导出时,配置EasyExcel并编写代码将数据写入响应流。导入时,配置EasyExcel并编写一个监听器类来处理读取到的数据。通过使用EasyExcel,可以轻松地在SpringBoot应用程序中处理CSV格式的文件,实现数据导入导出功能。
SpringBoot整合easyExcel实现CSV格式文件的导入导出
2024-04-02

SpringBoot+Mybatis-plus整合EasyExcel批量导入Excel到数据库+导出Excel

今天小编带大家一起整合一下EasyExcel,之所以用这个,是因为EasyExcel性能比较好,不会报OOM!
SpringBootExcel2024-12-13

Spring Boot + EasyExcel实现数据导入导出

这篇文章主要介绍了Spring Boot+EasyExcel实现数据导入导出,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

基于EasyExcel实现百万级数据导入导出详解

大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。本文将为大家详细介绍一下如何利用EasyExcel实现百万级数据导入导出,需要的可以参考一下
2023-01-28

使用EasyExcel实现Excel的导入导出

文章目录 前言一、EasyExcel是什么?二、使用步骤1.导入依赖2.编写文件上传配置3.配置表头对应实体类4.监听器编写5.控制层6.前端代码 总结 前言 在真实的开发者场景中,经常会使用excel作为数据的载体,进行
2023-08-17

Java+EasyExcel如何实现文件的导入导出

这篇文章将为大家详细讲解有关Java+EasyExcel如何实现文件的导入导出,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。引言项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导
2023-06-22

EasyExcel实现导入+各种数据校验

实现的功能 实现的功能 1.导入非xls和xlsx格式的文件2.导入空数据的excel文件3.数据缺失4.导入的excel文件中有重复的数据5.导入的excel文件数据错误6.导入的模板不是正确模板 1.导入非xls和xlsx
2023-08-23

使用 Spring Boot + EasyExcel 实现百万级数据导入导出功能开发

在实际开发中,大家需要根据具体的业务需求对数据的处理逻辑进行进一步的优化和完善。同时,还需要考虑异常处理、数据校验等方面,以确保系统的稳定性和可靠性。

Spring Boot 集成 EasyExcel 3.x 优雅实现Excel导入导出

Spring Boot 集成 EasyExcel 3.x 本章节将介绍 Spring Boot 集成 EasyExcel(优雅实现Excel导入导出)。 🤖 Spring Boot 2.x 实践案例(代码仓库) 介绍
2023-08-22

EasyExcel实现导入+各种数据校验功能

这篇文章主要介绍了EasyExcel实现导入+各种数据校验,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录