需求分析:

使用EasyExcel上传下载excel

excel上传:实际为读操作,从文件的输入流读取数据,然后将数据保存到数据库中

excel下载: 实际为写操作,将数据库的excel数据写入输出流,保存到excel文件

官方资料:

web上传、下载

DEMO代码地址:官方Demo代码

环境:

IDEA2018.3、jdk1.8、maven3.3.9、Springboot2.2.2、Mybatis-plus3.1.2、mysql5.7

编码:

可根据EasyExcel 官方Demo代码 ,修改得到如下Springboot+Mybtis-plus的实现excel上传下载demo项目。

1.数据库准备:

数据库

CREATE DATABASE IF NOT EXISTS stusys DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

数据表

CREATE TABLE `stu` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`sex` int(4) DEFAULT NULL,`age` int(11) DEFAULT NULL,`classid` varchar(20) DEFAULT NULL,`score` float(10,2) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;INSERT INTO `stu` VALUES (1, '张三', 0, 18, '3班', 72.23);
INSERT INTO `stu` VALUES (2, '李四', 1, 19, '1班', 85.50);
INSERT INTO `stu` VALUES (3, '王五', 0, 20, '2班', 86.36);

2.新建Springboot项目及编码:

pom.xml

    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.2.2.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.2.RELEASE</version></dependency><!-- mybaits-plus依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>

application.properties

spring.application.name=springbootmybatisplusspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/stusys?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123#打印sql语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# 当baseMapper的方法不能满足需求,需要自定义方法时,需要自己写xml来配置sql语句,即指定Mapper.xml的路径
# classpath*: 开头 (即加载多个 jar 包下的 XML 文件)
mybatis-plus.mapper-locations=classpath*:mybatis/*.xml

目录结构:

StuEntity.java

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("stu")
public class StuEntity {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer sex;private Integer age;private String classid;private Double score;
}

StuDao.java

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import top.jipson.easyexcel.web.entity.StuEntity;
@Mapper
public interface StuDao extends BaseMapper<StuEntity> {}

StuListener.java

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.jipson.easyexcel.web.entity.StuEntity;
import top.jipson.easyexcel.web.service.StuService;import java.util.ArrayList;
import java.util.List;/*** 模板的读取类*/
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class StuListener extends AnalysisEventListener<StuEntity> {private StuService stuService;//不能被spring管理,所以无法自动注入private static final Logger LOGGER =LoggerFactory.getLogger(StuListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;List<StuEntity> list = new ArrayList<StuEntity>();/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来* 多例,每次都新建一个实例** @param stuService*/public StuListener(StuService stuService) {this.stuService = stuService;}/*** 这个每一条数据解析都会来调用**/@Overridepublic void invoke(StuEntity stuEntity, AnalysisContext analysisContext) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(stuEntity));list.add(stuEntity);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());stuService.saveBatch(list);//自动去除了自动增长的id,SQL语句 :INSERT INTO stu ( name, sex, age, classid, score ) VALUES ( ?, ?, ?, ?, ? )LOGGER.info("存储数据库成功!");}
}

StuService.java

import com.baomidou.mybatisplus.extension.service.IService;
import top.jipson.easyexcel.web.entity.StuEntity;public interface StuService extends IService<StuEntity> {
}

StuServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import top.jipson.easyexcel.web.dao.StuDao;
import top.jipson.easyexcel.web.entity.StuEntity;
import top.jipson.easyexcel.web.service.StuService;@Service
public class StuServiceImpl extends ServiceImpl<StuDao, StuEntity> implements StuService {}

StuController.java

import com.alibaba.excel.EasyExcel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import top.jipson.easyexcel.web.entity.StuEntity;
import top.jipson.easyexcel.web.listener.StuListener;
import top.jipson.easyexcel.web.service.StuService;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;@RestController
@RequestMapping("/stu")
public class StuController {@Autowiredprivate StuService stuService;@GetMapping("list")public List<StuEntity> list(){List<StuEntity> list = stuService.list();return list;}@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.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");EasyExcel.write(response.getOutputStream(), StuEntity.class).sheet("模板").doWrite(list());}@PostMapping("upload")public String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), StuEntity.class, new StuListener(stuService)).sheet().doRead();return "upload success";}}

3.测试:

测试下载:用浏览器输入以下url

http://localhost:8080/stu/download

验证: 下载下来的excel数据与数据库中stu表的数据一致。

测试上传:

这里没有写前端页面,所以用postman测试

输入http://localhost:8080/stu/upload,选择POST请求,点击Headers,

KEY输入Content-Type

VALUE输入multipart/form-data

点击Body,选中form-data,

KEY输入file, KEY右侧选为File(默认为Text)

VALUE选择要上传的excel文件(确保字段名和数据库一致)

上传文件示例:

测试上传.xlsx

点击Send,看到返回为"upload success"

验证:检查数据库已插入了上传excel的数据。

如需要下载代码,点击右侧--> 项目完整代码

完成!enjoy it!

使用EasyExcel上传下载excel相关推荐

  1. WebFlux上传下载Excel文件

    文章目录 前言 一.引入相关jar包 二.开发过程 1.Excel上传 1.1 导入参数绑定 1.2 导入功能实现 2. Excel下载 总结 前言 最近在做一个API网关产品,要开发一个API批量导 ...

  2. element-ui上传下载excel(超详细der)

    1. 上传 EXCEL Upload组件 点击跳转到该组件官方文档 用到的upload组件参数 参数 说明 类型 可选 默认值 action 必选参数,上传的地址 string --- --- fil ...

  3. php上传下载excel,PHPExcel 上传下载的示例代码

    1:首先用composer require phpoffice/phpexcel 2: 引入相关的类: use PHPExcel; use PHPExcel_Cell; use PHPExcel_Wr ...

  4. Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板)

    Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板) 1. 加入依赖 2. 对读取excel内容(批量添加) 3. 模板下载: 1. 加入依赖 <depende ...

  5. 文件上传下载和Excel读写全家桶

    一.javaweb实现 upload package com.atqh.Servlet.FileServlet;import com.atqh.utils.ExcelUtil; import org. ...

  6. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  7. 使用poi实现excel的上传下载

    文章目录 前言 一.poi是什么? 二.使用步骤 1.引入依赖 2.导出excel 3.导入excel 总结 前言 excel的上传下载是常见的需求,这里记录一下使用poi实现Excel的上传和下载 ...

  8. java struts2 excel上传_文件上传下载——通过struts的FormFile上传单个excel文件

    通过struts的FormFile上传单个excel文件 思路: 1.通过struts的FormFile获取File(这个文件的路径是"客户端的选择的路径地址") 2.将客户端的文 ...

  9. struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览

    [Struts2]☆★之文件上传,下载,重传,预览 今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找 些源码给他,但是纵观全网,写的都不是太全,这让新手使用 ...

  10. 阿里云OSS文件上传下载,拿来即用

    什么是OSS 我们可以理解为就是一个资源服务器,在这之前我也尝试过Nginx当静态资源服务器,但效果比较一般,为什么选择阿里云OSS,只是因为最近刚好公司用到了,所以就接入了,还有其他的比如七牛云,腾 ...

最新文章

  1. python数据分享人力资源_Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度...
  2. Reporting Service 在文本框中换行的问题
  3. c/c++将字符串中的空格替换成%20
  4. 面试题27 二叉搜索树转换为双向链表
  5. vue.js--基础 数据的双向绑定
  6. python foc电机库_No.3 FOC SDK5.0电机库软件系统分析
  7. [ERP/鼎捷E10][生产制造]取代料/替代料
  8. [译] Vue 最黑暗的一天
  9. python判断是不是整数_python判断整数
  10. 黑马点评项目-优惠券秒杀
  11. 漫画:如何分别使用8种编程语言拯救公主
  12. OpenCV批量读取路径下所有图片
  13. 名帖104 赵孟頫 楷书《崑山州淮云院记》
  14. cobaltstrike如何安装使用(包含CS联动MSF详细用法!)? (゚益゚メ) 渗透测试
  15. [IT与培训]IT培训与企业建设的思路
  16. CTFshow_萌新(密码)
  17. 物联网设备数据流转之数据如何实时推送至前端:WebSocket前端接收
  18. 升级了win11系统后bug多不稳定?一键重装回win10系统
  19. VSCode插件开发 国际化
  20. plsql 客户端字符集_plsql软件字符集 plsql字符集设置utf8

热门文章

  1. 我对于创业公司的看法
  2. 什么是One Data体系?阿里数据中台解读
  3. 比较好用的学习、工具网站推荐
  4. 针对谷粒商城P46 验证码图片加载出来错误503
  5. 免费丨永洪科技2017用户大会@北京
  6. Java制作简易计算器
  7. OA实施周期:易用性才是关键因素
  8. (4层)域名系统 DNS
  9. 2021东北四省赛J. Transform(空间几何)
  10. 微博和微信公众号营销区别