java利用easyexcel实现导入与导出功能

目录
  • 前言
  • 1先添加依赖
  • 2批量插入数据
  • 3创建需要导出数据实体类
  • 4创建一个类ExcelListener
  • 5实现下载excel
  • 6控制器添加我们的导入操作代码
  • 7导出效果如图
  • 8导入直接调用

前言

poi的解析方式是dom解析,把结果一次都读入内存操作,这样的操作平时是不会有问题的,但是并发量上来的时候就会出现OOM,EasyExcel,底层对象其实还是使用poi包的那一套。它只是将poi包的一部分抽了出来,摒弃掉了大部分业务相关的属性。由于它关注的业务是导入导出这一块,所以在处理大数据量的导入导出能够通过本地缓存来避免OOM,在特定场景中,EasyExcel的表现能力还是可以的。

1先添加依赖

    <!-- EasyExcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>

2批量插入数据

再试下导入导出功能前,写批量插入数据的接口和查询数据的接口。

<?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="cn.demo.mapper.MedicnesMapper">
    <insert id="saveMedicnesList" parameterType="cn.demo.entity.Medicnes">
        insert into medices
        (food,remark)
        values
        <foreach collection="list" item="rm" separator=",">
            (#{rm.food},#{rm.remark})
        </foreach>
    </insert>
    <select id="medicnesList" parameterType="cn.demo.entity.Medicnes" resultType="cn.demo.entity.Medicnes">
        SELECT
        food,
        remark
        FROM
        medices
    </select>
</mapper>

3创建需要导出数据实体类

package cn.demo.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 @Data
@AllArgsConstructor
@NoArgsConstructor
public class Medicnes {
    @ExcelProperty("食物名称")
    private String  food;

    @ExcelProperty("食物产地")
    private String  remark;
}

4创建一个类ExcelListener

package cn.demo.config;

import cn.demo.entity.Medicnes;
import cn.demo.service.EmpService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;
/**
 * 有个很重要的点 ExcelListener
 * 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
 */
public class ExcelListener extends AnalysisEventListener<Medicnes> {

    private List<Medicnes> list = new ArrayList<>();

    //每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    private static final int BATCH_COUNT = 5;

    //假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象用
    @Autowired
    private EmpService empService;
     /**
     * 如果使用了spring,请使用这个构造方法。
     * 每次创建Listener的时候需要把spring管理的类传进来
     */
    public ExcelListener(EmpService empService) {
        this.empService = empService;
    }
    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(Medicnes goods, AnalysisContext analysisContext) {
        System.out.println("解析到一条数据:========================"+goods.toString());
        // 数据存储到data,供批量处理或后续自己业务逻辑处理。
        list.add(goods);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if(list.size() >= BATCH_COUNT){
            saveData();
            // 存储完成清理data
            list.clear();
        }

    }
    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //确保所有数据都能入库
        saveData();
    }
    /**
     * 加上存储数据库
     */
    private void saveData() {
        System.out.println("=============================="+list.size()+"条数据,开始存储到数据库");
        empService.saveMedicnesList(list);
    }
}

5实现下载excel

接下来编写我们的工具类--帮助我们来实现下载excel

public class DownExcel {
    public static void download(HttpServletResponse response, Class t, List list) throws IOException, IllegalAccessException,InstantiationException {
        response.setContentType("application/vnd.ms-excel");// 设置文本内省
        response.setCharacterEncoding("utf-8");// 设置字符编码
        response.setHeader("Content-disposition", "attachment;filename=demo.xlsx"); // 设置响应头
        EasyExcel.write(response.getOutputStream(), t).sheet("模板").doWrite(list); //用io流来写入数据
    }
}

//导出为Excel
@RequestMapping("/downloadexcel.do")
public void getExcel(HttpServletResponse response) throws IllegalAccessException, IOException,
InstantiationException {
    List<Medicnes> list = sysUserService.medicnesList();
    DownExcel.download(response,Medicnes.class,list);
}

6控制器添加我们的导入操作代码

//导入Excel
@RequestMapping("/importexcel.do")
@ResponseBody
public String importexcel(@RequestParam(value = "excelFile") MultipartFile file) throws IOException{
    EasyExcel.read(file.getInputStream(), Medicnes.class, new ExcelListener(sysUserService)).sheet().doRead();
    return "success";
}

7导出效果如图

8导入直接调用

到此这篇关于java利用easyexcel实现导入与导出功能的文章就介绍到这了,更多相关java easyexce 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java使用easyExcel实现导入功能

    今天带来的是esayExcel的简单使用小结,一个高效的Excel的处理框架 临时接到领导要求需要做一个Excel导入功能,于是发挥我的特长——面向百度编程. 在百度搜索了一圈都是POi导入方式,找到一个看着还算靠谱的demo,这种方式在我看来相当的笨重,读取到Excel内容后逐个进行判断.折腾了一个上午,代码像是一个年迈的老人-岿然不动,为我的菜感到汗颜. 经过公司经验丰富的老人的指导,使用阿里巴巴开源的easyExcel导入方式使用很便捷,更重要的是快,十分钟就完成了整个导入过程的开发. 书

  • Java实现自定义Excel数据排序的方法详解

    目录 1.引入jar包 2.自定义排序 通常,我们可以在Excel中对指定列数据执行升序或者降序排序,排序时可依据单元格中的数值.单元格颜色.字体颜色或图标等.在需要自定义排序情况下,我们也可以自行根据排序需要编辑数据排列顺序.本文,将通过Java应用程序来实现如何自定义排序. 1.引入jar包 使用jar包:Spire.Xls.jar version: 12.8.4 导入方法1:手动下载jar到本地,解压,然后找到lib文件夹下的Spire.Xls.jar文件.然后在IDEA中打开“Proje

  • Java使用POI实现导出Excel的方法详解

    目录 一.前景 二.概念 2.1. 简介 2.2.Excel版本和相关对象 2.3.WorkBook 2.4.POI依赖 三.POI - 写 3.1.代码示例 3.2. 性能对比 3.3. 测试rowAccessWindowSize 3.4. 导出Excel样式设置 四.POI - 读 4.1.代码示例 4.2.读取不同的数据类型 4.3.读取公式 五.POI - 遇到的坑 一.前景 在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据

  • Java操作Excel文件解析与读写方法详解

    目录 一.概述 二.Apache POI 三.XSSF解析Excel文件 1.Workbook(Excel文件) 2.Sheet(工作簿) 3.Row(数据行) 4.Cell(单元格) 四.超大Excel文件读写 1.使用POI写入 2.使用EasyExcel 一.概述 在应用程序的开发过程中,经常需要使用 Excel 文件来进行数据的导入或导出.所以,在通过Java语言实现此 类需求的时候,往往会面临着Excel文件的解析(导入)或生成(导出). 在Java技术生态圈中,可以进行Excel文件

  • Java 将Excel转为UOS的操作方法

    目录 [导入jar包] [Excel转UOS] 以.uos为后缀的文件,表示Uniform Office Spreadsheet文件,是一种国产的办公文件格式,该格式以统一办公格式(UOF)创建,使用XML和压缩保存电子表格.既有的Excel表格文件,可以通过格式转换的方式转换为UOS格式,本文将对此作相关介绍. [导入jar包] 使用jar包:Spire.Xls.jar version: 12.7.4 导入方法1:手动下载 jar到本地,解压,然后找到lib文件夹下的Spire.Xls.jar

  • Java利用EasyExcel读取写入Excel详情

    目录 EasyExcel介绍 为什么使用EasyExcel? 封装使用 例子 EasyExcel介绍 EasyExcel是一个基于Java的.快速.简洁.解决大文件内存溢出的Excel处理工具.他能让你在不用考虑性能.内存的等因素的情况下,快速完成Excel的读.写等功能. 为什么使用EasyExcel? Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但PO

  • java利用easyexcel实现导入与导出功能

    目录 前言 1先添加依赖 2批量插入数据 3创建需要导出数据实体类 4创建一个类ExcelListener 5实现下载excel 6控制器添加我们的导入操作代码 7导出效果如图 8导入直接调用 前言 poi的解析方式是dom解析,把结果一次都读入内存操作,这样的操作平时是不会有问题的,但是并发量上来的时候就会出现OOM,EasyExcel,底层对象其实还是使用poi包的那一套.它只是将poi包的一部分抽了出来,摒弃掉了大部分业务相关的属性.由于它关注的业务是导入导出这一块,所以在处理大数据量的导

  • java实现CSV文件导入与导出功能

    年前在开发功能模块的时候用到了CSV文件导入导出,就此整理一下,便于大家参考. 导入导出功能很多时候用到的都是Excel文件,但是现在越来越多的使用了CSV文件进行此操作,它是一个纯文本文件,可以用记事本打开,也可以用Excel打开.CSV文件不像Excel那样有很多条条框框,它使用硬回车分割每条记录,用逗号分隔每条数据的字段. CSV格式的文件就是用硬回车和文本都好实现的表格,用Excel一读就成了表格.文件名后缀就是 .csv. 直接上代码吧! 导入部分 导入的时候基于Ajax请求,js代码

  • Java利用EasyExcel解析动态表头及导出实现过程

    目录 前言 参考地址 前端下载 模板下载 EasyExcel动态表头解析 EasyExcel动态表头导出 总结 前言 excel文件导入及导出,是日常开发中经常遇到的需求.本次笔者以EasyExcel为例,针对在项目中遇到的动态表头解析及导出的场景,详细介绍具体的代码实现过程. 参考地址 https://github.com/alibaba/easyexcel 前端下载 const download = () => { axios({ method: 'GET', url: config.htt

  • Java利用Easyexcel导出excel表格的示例代码

    目录 1.导入 EasyExcel Maven包 2.配置 3.输出Excel到前端 1.导入 EasyExcel Maven包 <!--easyexcel 导出excel依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </depend

  • Java利用POI实现导入导出Excel表格

    本文实例为大家分享了Java利用POI实现导入导出Excel表格的具体代码,供大家参考,具体内容如下 一.Java利用POI实现导入导出Excel表格demo 1.引入依赖 <dependency>       <groupId>org.apache.poi</groupId>       <artifactId>poi-ooxml</artifactId>        <version>4.1.2</version>

  • Spring Boot项目如何优雅实现Excel导入与导出功能

    目录 背景 EasyExcel 问题 分析与解决 Spring Boot Excel 导入与导出 依赖引入 Excel 导入 基本导入功能 进阶导入功能 Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则 ExcelValidator 接口定义校验规则 校验结果接收 异常捕获接收校验结果 controller 方法参数接收校验结果 总结 背景 Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel

  • SpringBoot整合EasyExcel实现Excel表格导出功能

    目录 栗子 1.组件介绍 2.配置文件 SpringBoot项目pom.xml 3.项目代码 项目结构 ExportController.java Mock.java CitySheet.java CompanySheet.java UserSheet.java SpringBootEasyexcelApplication.java 4.效果展示 单个sheet导出 多个sheet导出 5.总结 栗子 在后端管理系统的开发中,经常有需要导出当前表格数据的功能,有些前端表格组件可以直接做到,但是不

  • 详解Java如何实现百万数据excel导出功能

    目录 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个sheet 5.计算limit的起始位置 6.文件上传到OSS 7.通过WebSocket推送通知 8.总条数可配置 9.order by商品编号 总结 前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在UI界面上点击全部导出按钮,就能导

  • Java利用EasyExcel实现合并单元格

    目录 pom版本 1.自定义合并单元格 1.1 不合并单元格 1.2 合并单元格 1.3 写多个sheet 1.4 WriteTable pom版本 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency> 1.自定义合并单元格 在某些

随机推荐