EasyExcel实现表格导入导出

简介: EasyExcel实现表格导入导出

EasyExcel实现表格导入导出

1.简介

Java领域解析,生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc.

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百MExcel github地址:https://github.com/alibaba/easyexcel

2.入门案例

2.1.创建maven工程

2.2.导入pom依赖

<dependency>

   <groupId>com.alibaba</groupId>

   <artifactId>easyexcel</artifactId>

   <version>3.0.0-beta2</version>

</dependency>

准备表格

2.3.学生实体类

package cn.demo.domain;

 

import com.alibaba.excel.annotation.ExcelProperty;

 

import java.util.Date;

 

/**

 * 学生实体类

 */

public class Student {

    /**

     * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据

     */

    @ExcelProperty("姓名")

    private String name;

    @ExcelProperty("性别")

    private String sex;

    @ExcelProperty("出生日期")

    private Date birthDate;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public String getSex() {

        return sex;

    }

 

    public void setSex(String sex) {

        this.sex = sex;

    }

 

    public Date getBirthDate() {

        return birthDate;

    }

 

    public void setBirthDate(Date birthDate) {

        this.birthDate = birthDate;

    }

 

    @Override

    public String toString() {

        return "Student{" +

                "name='" + name + '\'' +

                ", sex='" + sex + '\'' +

                ", birthDate=" + birthDate +

                '}';

    }

}

2.4.测试读取excel

package cn.demo;

 

import cn.demo.domain.Student;

import com.alibaba.excel.EasyExcel;

import com.alibaba.excel.context.AnalysisContext;

import com.alibaba.excel.read.listener.PageReadListener;

import com.alibaba.excel.read.listener.ReadListener;

import org.junit.Test;

 

import java.io.File;

 

/**

 * 测试导入导出

 */

public class EasyExcelTest {

 

    /**

     * 测试读取

     * @throws Exception

     */

    @Test

    public void testRead() throws Exception{

        // 写法1JDK8+

        // 读取的文件

        String fileName = "d:/test.xls";

        // 这里需要指定读用哪个class去读,然后读取第一个sheet 指定headRowNumber参数,如果不传默认是然后读文件流会自动关闭

        EasyExcel.read(fileName, Student.class, new PageReadListener<Student>(dataList -> {

            dataList.forEach(System.out::println);

        })).sheet().headRowNumber(2).doRead();

        // 写法2: 使用匿名内部类

        EasyExcel.read(fileName, Student.class, new ReadListener<Student>() {

            // 一行行读取excel内容

            @Override

            public void invoke(Student student, AnalysisContext analysisContext) {

                System.out.println("读取到的数据:"+student);

            }

            // 读取完成之后

            @Override

            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

                System.out.println("解析完成....");

            }

        }).sheet().headRowNumber(2).doRead();

    }

}

测试读取结果

2.5.测试写入Excel

准备数据

/**

     * 模拟数据

     * @return

     */

    private List<Student> data() {

        List<Student> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {

            Student data = new Student();

            data.setName("王天霸"+i);

            data.setSex(i%2==0?"":"");

            data.setBirthDate(new Date());

            list.add(data);

        }

        return list;

    }

测试写入

/**

     * 测试写入

     * @throws Exception

     */

    @Test

    public void testWrite() throws Exception{

        // 写法1JDK8+

        // 输出的文件名

        String fileName = "d:/"+System.currentTimeMillis() + ".xlsx";

        // 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为模板然后文件流会自动关闭

        EasyExcel.write(fileName, Student.class)

                .sheet("模板")

                .doWrite(() -> {

                    // 分页查询数据

                    return data();

                });

        // 写法2

        EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(data());

    }

测试写入结果

3.  web中的运用

3.1.web中的读与写

新建一个springboot项目,过程略过

导入相关依赖

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

        </dependency>

        <!--引入easyexcel依赖-->

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>easyexcel</artifactId>

            <version>3.0.0-beta2</version>

</dependency>

控制层代码

package cn.demo.web.controller;

 

import cn.demo.domain.Student;

import com.alibaba.excel.EasyExcel;

import com.alibaba.excel.context.AnalysisContext;

import com.alibaba.excel.read.listener.ReadListener;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.multipart.MultipartFile;

 

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.net.URLEncoder;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

 

/**

 * 导入导出Controller

 */

@RestController

public class ExcelController {

 

    /**

     * 上传excel

     * @param file

     * @return

     * @throws IOException

     */

    @PostMapping("/upload")

    public String upload(@RequestParam("file")MultipartFile file) throws IOException {

        EasyExcel.read(file.getInputStream(), Student.class, new ReadListener<Student>() {

 

            @Override

            public void invoke(Student student, AnalysisContext analysisContext) {

                System.out.println("读取到的数据:"+student);

                // 这里可以做保存数据库操作

            }

 

            @Override

            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

                System.out.println("解析完成....");

            }

        }).sheet().doRead();

        return "success";

    }

 

    /**

     * 导出excel

     * @param response

     * @throws IOException

     */

    @GetMapping("/download")

    public void download(HttpServletResponse response) throws IOException {

        // 这里注意请直接用浏览器或者用postman

        response.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(), Student.class).sheet("模板").doWrite(data());

    }

 

    /**

     * 模拟数据

     * @return

     */

    private List<Student> data() {

        List<Student> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {

            Student data = new Student();

            data.setName("王天霸"+i);

            data.setSex(i%2==0?"":"");

            data.setBirthDate(new Date());

            list.add(data);

        }

        return list;

    }

}

测试导入导出

导入用postman测试

导出直接在浏览器上测试,输入地址即可下载

 

 

 

 

相关文章
|
easyexcel Java 测试技术
读取Excel还用POI?试试这款开源工具EasyExcel
读取Excel还用POI?试试这款开源工具EasyExcel
437 0
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
|
前端开发 easyexcel Java
springboot使用EasyExcel导入数据(获取行号)
springboot使用EasyExcel导入数据(获取行号)
1654 1
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
32324 0
|
存储 数据安全/隐私保护
贴片卡与插拔卡的优缺点
在讨论贴片卡(通常指的是嵌入在设备内部的存储卡,如SIM卡、eMMC等)与插拔卡(如SD卡、microSD卡等,用户可以轻松插入和拔出的存储卡)的优缺点时,我们可以从多个方面进行比较:
|
easyexcel Java 数据挖掘
SpringBoot整合EasyExcel,Excel导入导出就靠它了
SpringBoot整合EasyExcel,Excel导入导出就靠它了
4232 0
|
边缘计算 人工智能 监控
边缘计算与AI结合的场景案例研究
【8月更文第17天】随着物联网(IoT)设备数量的爆炸性增长,对实时数据处理的需求也随之增加。传统的云计算模型在处理这些数据时可能会遇到延迟问题,尤其是在需要即时响应的应用中。边缘计算作为一种新兴的技术趋势,旨在通过将计算资源更靠近数据源来解决这个问题。本文将探讨如何将人工智能(AI)技术与边缘计算结合,以实现高效的实时数据分析和决策制定。
1441 1
|
IDE Java API
Java模块化:从理论到实践
【4月更文挑战第18天】本文探讨了Java模块化系统(JPMS),旨在解决大型Java应用的可扩展性和维护问题。模块是相关类和接口的集合,模块化有助于依赖管理和版本控制,改善代码组织和重用。核心概念包括模块描述符(module-info.java)、模块路径和自动/显式模块。实践案例涉及创建模块化项目、声明依赖、导出及打开模块,以及运行模块化应用。理解并应用模块化能提升开发效率和应用质量。
1038 2
|
存储 SQL 缓存
Redis完全教程:全面学习指南(一)
Redis完全教程:全面学习指南
277 1
Redis完全教程:全面学习指南(一)
|
Java easyexcel Maven
【Java专题_04】集成EasyExcel进行Excel导入导出详细教程
【Java专题_04】集成EasyExcel进行Excel导入导出详细教程
977 0