当前位置: 首页 > news >正文

手拉手EasyExcel极简实现web上传下载(全栈)

环境介绍

技术栈

springboot+mybatis-plus+mysql+easyexcel

软件

版本

mysql

8

IDEA

IntelliJ IDEA 2022.2.1

JDK

1.8

Spring Boot

2.7.13

mybatis-plus

3.5.3.2

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。

他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

官网https://easyexcel.opensource.alibaba.com/

加入依赖

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

编写实体类

@TableName(value ="product")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {
    /**
     * 序号_自动生成
     */
    @TableId(type = IdType.AUTO)
    @ExcelProperty("序号")
    private Integer number;

    /**
     * 创建时间
     */
    @ExcelProperty("创建时间")
    private Date createtime;

    /**
     * 产品名称
     */
    @ExcelProperty("产品名称")
    private String productname;

    /**
     * 产品编号
     */
    @ExcelProperty("产品编号")
    private String productnumber;

    /**
     * 产品型号
     */
    @ExcelProperty("产品型号")
    private String manufacturer;

    /**
     * 产品位置
     */
    @ExcelProperty("产品位置")
    private String producepath;

    /**
     * 图片位置
     */
    @ExcelProperty("图片位置")
    private String imagepath;

    /**
     * 使用单位
     */
    @ExcelProperty("使用单位")
    private String unit;

    /**
     * 金额
     */
    @ExcelProperty("金额")
    private Integer money;

    /**
     * 入库时间
     */
    @ExcelProperty("入库时间")
    private Date intime;

    /**
     * 出库时间
     */
    @ExcelProperty("出库时间")
    private Date puttime;

    /**
     * 操作人
     */
    @ExcelProperty("操作人")
    private String operator;

    /**
     * 创建人
     */
    @ExcelProperty("创建人")
    private String createduser;

    /**
     * 备注
     */
    @ExcelProperty("备注")
    private String notes;

    /**
     * 产品数量
     */
    @ExcelProperty("产品数量")
    private Integer producedigit;

    /**
     * 产品单位
     */
    @ExcelProperty("产品单位")
    private String productunit;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

自定义监听器

public class MyListener implements ReadListener<Product> {// private ArrayList<Product> list = new ArrayList<>();private ProductService productService;int sum=0;public MyListener(ProductService testMapper) {this.productService = productService;}//每读一行,则调用该方法@Overridepublic void invoke(Product product, AnalysisContext analysisContext) {sum++;//数据库新增// productService.save(product);}//每读完整个excel,则调用该方法@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取了"+sum+"行数据");}
}

web中的读(上传)

后端

//上传//上传@PostMapping("/upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {long start = System.currentTimeMillis();EasyExcel.read(file.getInputStream(), Product.class, new MyListener(productService)).sheet().doRead();long end = System.currentTimeMillis();System.out.println("耗时:"+(end-start)/1000+"秒");return "success";}

前端(vue2+Element)

<el-uploadclass="upload-demo"action="http://192.168.1.8:8007/excel/upload":on-preview="handlePreview":on-remove="handleRemove":before-remove="beforeRemove"multiple:limit="3":on-exceed="handleExceed":file-list="fileList"><el-button size="small" type="primary">点击上传</el-button>
</el-upload>

效果

web中的写(下载)

后端

@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), Product.class).sheet("模板").doWrite(productService.list());
}

前端

<button @click="download">导出Excel</button>methods:{download(){document.location.href="http://192.168.1.8:8007/excel/download";}},

效果

相关文章:

  • 《Linux C编程实战》笔记:文件属性操作函数
  • 【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51
  • 四. 基于环视Camera的BEV感知算法-BEVDet
  • webgpu demo阅读 A-Buffer
  • 什么是NPM,NPM使用方法
  • 优化问题笔记(1)
  • python如何通过自身日志系统读写日志文件
  • 2024测试开发面试题完整版本(附答案)
  • StarCCM+ 导入STL几何模型进行仿真
  • 掌握学习方法——作为开发者最重要的能力
  • go学习redis的学习与使用
  • c++知识总结
  • ue4 解决角度万向锁的问题 蓝图节点
  • 【算法Hot100系列】正则表达式匹配
  • 智慧路灯杆如何实现雪天道路安全监测
  • django开发-定时任务的使用
  • JAVA 学习IO流
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java的Interrupt与线程中断
  • Redux 中间件分析
  • Vue2.0 实现互斥
  • Vue实战(四)登录/注册页的实现
  • vue学习系列(二)vue-cli
  • 彻底搞懂浏览器Event-loop
  • 从输入URL到页面加载发生了什么
  • 飞驰在Mesos的涡轮引擎上
  • 关于 Cirru Editor 存储格式
  • 计算机常识 - 收藏集 - 掘金
  • 检测对象或数组
  • 你真的知道 == 和 equals 的区别吗?
  • 前端面试之CSS3新特性
  • 如何编写一个可升级的智能合约
  • 一个完整Java Web项目背后的密码
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Java性能优化之JVM GC(垃圾回收机制)
  • puppet连载22:define用法
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #pragma once
  • (2020)Java后端开发----(面试题和笔试题)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)Linux下编译安装log4cxx
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET CLR基本术语
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 获取url的方法
  • @Autowired和@Resource装配
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [100天算法】-目标和(day 79)
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [BUUCTF]-Reverse:reverse3解析