EasyExcel使用教程-实现页面中批量导入导出数据-详解

2023-10-27

EasyExcel介绍

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel特点

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

  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

  • EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

开始使用:

1.pom中引入xml相关依赖

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

先在Java内进行测试

2.创建实体-设置表头和添加的数据字段

这里的ExcelProperty表示在Excle表格中第一行,表头的列名称

@Data
public class Stu {
    //设置表头名称
    @ExcelProperty("学生编号")
    private int sno;
    //设置表头名称
    @ExcelProperty("学生姓名")
    private String sname;
}

3.写入用EasyExcel写入表格数据Excle

package com.atguigu.excel;

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.List;

public class TestWrite {
    public static void main(String[] args) {
        //设置文件名称和路径
        String fileName="D:\\桌面内容迁移\\测试创建excel.xlsx";
        EasyExcel.write(fileName, User.class)
                .sheet("写操作")
                .doWrite(data());
    }
    //循环设置要添加的数据,最终封装到list集合中
    private static List<User> data() {
        List<User> list = new ArrayList<User>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(i+1);
            user.setName("张三");
            list.add(user);
        }
        return list;
    }
}

4.EasyExcel读取Excle表格数据

先实现一个EasyExcel提供的类AnalysisEventListener

package com.atguigu.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.util.ConverterUtils;

import java.util.Map;

public class ExcelListener extends AnalysisEventListener<User> {
    //一行一行去读取excel内容并封装到User中
    //默认从第二行读取数据,因为第一行一般都是表头
    @Override
    public void invoke(User user, AnalysisContext context) {
        System.out.println(user.toString());
    }
    //读取表头内容
    @Override
    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
        //System.out.println("表头:"+headMap);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }
}

5.编写读取测试类并执行

package com.atguigu.excel;

import com.alibaba.excel.EasyExcel;

public class TestRead {
    public static void main(String[] args) {
        String fileName="D:\\桌面内容迁移\\测试创建excel.xlsx";
        EasyExcel.read(fileName, User.class,new ExcelListener())
                .sheet()
                .doRead();
    }
}

与前端页面进行集成

1.编写业务逻辑层与控制器

注:这里使用的是Mybatis-plus

先写两个实体类,第一个是数据库对应的实体类(EasyExcel中要求实体类属性个数与表中表头列的名称个数一致,我们一般实体类还会自己添加一些其他属性,比如说多表联查还需要嵌入一个属性是另一个表的实体类,那么这就不符合EasyExcel的规范,所以要写一个实体类属性与表格完全一致的实体类),第二个是你业务中需要的实体类(可能添加了一些其他的属性值,一般我们开发中都是用的这个,不需要添加)

这里第一个是我重新写的实体类,第二个是原本的实体类,被我自己加了属性,大家可以进行对比

package com.atguigu.ggkt.vo.vod;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * <p>
 * Dict
 * </p>
 *
 * @author qy
 */
@Data
public class SubjectEeVo {

	@ExcelProperty(value = "id" ,index = 0)
	private Long id;

	@ExcelProperty(value = "课程分类名称" ,index = 1)
	private String title;

	@ExcelProperty(value = "上级id" ,index = 2)
	private Long parentId;

	@ExcelProperty(value = "排序" ,index = 3)
	private Integer sort;


}

package com.atguigu.ggkt.model.vod;

import com.atguigu.ggkt.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Data
@ApiModel(description = "Subject")
@TableName("subject")
public class Subject {

	private static final long serialVersionUID = 1L;
	@ApiModelProperty(value = "id")
	private Long id;

	@ApiModelProperty(value = "创建时间")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@TableField("create_time")
	private Date createTime;

	@ApiModelProperty(value = "更新时间")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@TableField("update_time")
	private Date updateTime;

	@ApiModelProperty(value = "逻辑删除(1:已删除,0:未删除)")
	@JsonIgnore
	@TableLogic
	@TableField("is_deleted")
	private Integer isDeleted;

	@ApiModelProperty(value = "其他参数")
	@TableField(exist = false)
	private Map<String,Object> param = new HashMap<>();

	@ApiModelProperty(value = "类别名称")
	@TableField("title")
	private String title;

	@ApiModelProperty(value = "父ID")
	@TableField("parent_id")
	private Long parentId;

	@ApiModelProperty(value = "排序字段")
	@TableField("sort")
	private Integer sort;

	@ApiModelProperty(value = "是否包含子节点")
	@TableField(exist = false)
	private boolean hasChildren;

}

 2.Service接口与Impl

package com.atguigu.ggkt.vod.service;


import com.atguigu.ggkt.model.vod.Subject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 课程科目 服务类
 * </p>
 *
 * @author atguigu
 * @since 2023-04-19
 */
public interface SubjectService extends IService<Subject> {

    void exportData(HttpServletResponse response);

    void importDictData(MultipartFile file);
}

package com.atguigu.ggkt.vod.service.impl;

import com.alibaba.excel.EasyExcel;
import com.atguigu.ggkt.model.vod.Subject;
import com.atguigu.ggkt.vo.vod.SubjectEeVo;
import com.atguigu.ggkt.vod.listener.SubjectListener;
import com.atguigu.ggkt.vod.mapper.SubjectMapper;
import com.atguigu.ggkt.vod.service.SubjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程科目 服务实现类
 * </p>
 *
 * @author atguigu
 * @since 2023-04-19
 */
@Service
public class SubjectServiceImpl extends ServiceImpl<SubjectMapper, Subject> implements SubjectService {
    @Resource
    SubjectService subjectService;
    @Resource
    SubjectListener subjectListener;
    //课程分类导出功能
    @Override
    public void exportData(HttpServletResponse response) {
        try{
//设置从数据库下载值的信息
            response.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");
            List<Subject> subjects = subjectService.list();
            List<SubjectEeVo> subjectEeVos = new ArrayList<>(subjects.size());
            for(Subject dict : subjects) {
                SubjectEeVo dictVo = new SubjectEeVo();
//                dictVo.setId(dict.getId());
//                dictVo.setParentId(dict.getParentId());
//                以上的赋值写法较为复杂,Java提供一个方法让一个对象的属性赋值给另一个对象
                BeanUtils.copyProperties(dict,dictVo);
                subjectEeVos.add(dictVo);
            }
            EasyExcel.write(response.getOutputStream(), SubjectEeVo.class)
                    .sheet("课程分类")
                    .doWrite(subjectEeVos);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(),SubjectEeVo.class,subjectListener)
                    .sheet().doRead();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 3.Controller

没有使用swagger的记得把@ApiOperation注解删掉

package com.atguigu.ggkt.vod.controller;


import com.atguigu.ggkt.model.vod.Subject;
import com.atguigu.ggkt.result.Result;
import com.atguigu.ggkt.vod.service.SubjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * <p>
 * 课程科目 前端控制器
 * </p>
 *
 * @author atguigu
 * @since 2023-04-19
 */
@RestController
@RequestMapping("/admin/vod/subject")
@CrossOrigin(origins = "*")
public class SubjectController {
    @Resource
    SubjectService subjectService;

    @ApiOperation("课程分类导出")
    @GetMapping("/exportData")
    public void exportData(HttpServletResponse response){
            subjectService.exportData(response);
    }
    @ApiOperation(value = "导入")
    @PostMapping("importData")
    public Result importData(MultipartFile file) {
        subjectService.importDictData(file);
        return Result.ok(null);
    }
}

4.前端页面

导出按钮与对应的方法

<div class="el-toolbar">
    <div class="el-toolbar-body" style="justify-content: flex-start;">
      <el-button type="text" @click="exportData"><i class="fa fa-plus"/> 导出</el-button>
    </div>
</div>
exportData() {
    window.open("http://localhost:8301/admin/vod/subject/exportData")
}

导入按钮、点击按钮弹出的界面、弹出层的data值与对应的导入方法

按钮

<el-button type="text" @click="importData"><i class="fa fa-plus"/> 导入</el-button>

点击对应的弹出层

<el-dialog title="导入" :visible.sync="dialogImportVisible" width="480px">
    <el-form label-position="right" label-width="170px">
        <el-form-item label="文件">
            <el-upload
                       :multiple="false"
                       :on-success="onUploadSuccess"
                       :action="'http://localhost:8333/admin/vod/subject/importData'"
                       class="upload-demo">
                <el-button size="small" type="primary">点击上传</el-button>
                <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
            </el-upload>
        </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
        <el-button @click="dialogImportVisible = false">取消</el-button>
    </div>
</el-dialog>

data中添加弹出层的属性

data() {
    return {
        dialogImportVisible: false,
        list:[] //数据字典列表数组
    }
}

添加导入方法

importData() {
    this.dialogImportVisible = true
},
onUploadSuccess(response, file) {
    this.$message.info('上传成功')
    this.dialogImportVisible = false
    this.getSubList(0)
},

这里的this.getSubList(0)只是导入数据后调用重新加载页面数据的一个方法,可以自行编写

测试!!

 

准备好我们要导入到数据库的表格

 

然后打开树形菜单,可以发现表格中的数据已经被渲染上去了

对service中的sersheet方法和doWrite、doRead方法有疑问的这里解答一下,sersheet是excel表格中底端的那个名称,doRead通过监听器每次读取一行,这也是EasyExcel的优点,一次一行,读完这行再下一行不会全部读取出来,举个极端例子。比如说你内存仅剩100kb了,你表格有500kb,那是不是一下子就蹦了?那读一行完加载到内存中,再下一行就可以很好的解决了这种问题,doWrite就是写入的操作了

以上就是 EasyExcel的读写操作并且与Element-ui进行整合实现导入导出功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EasyExcel使用教程-实现页面中批量导入导出数据-详解 的相关文章

  • 使用查询选择器从 VBA 中抓取

    我使用了该网站的代码来提取数据site https bazashifer ru proflist profnastil Option Explicit Public Sub GetInfo Dim sResponse As String i
  • 如何将 Excel 中的图表导出为图形

    我有一系列 Excel 电子表格 每个电子表格至少包含一页数据和一页根据数据创建的图表 我需要捕获 不从数据中重新生成 将现有图表作为网络友好图像 这可以通过 Java 或 Net 实现吗 我知道 POI 的东西 Java 不会这样做 或者
  • 将字段重新格式化为列,其他字段(与先前结构中成为列的字段配对)成为新列中的字段

    我的任务是清理慈善机构设计的移动应用程序中的数据 在一个部分中 用户问答应用程序使用会话由一行表示 该部分由重复的问题答案字段对组成 其中一个字段代表所提出的问题 然后它旁边的字段代表相应的答案 每个问题 字段和答案列对一起代表一个独特的问
  • 使用 js-xlsx 解析 Excel 工作表

    我正在尝试解析用户指定的目录中的所有 Excel 文件 但js xlsx我正在使用的库似乎需要手动导航 var url test files test xlsx lt Located in the project directory var
  • Windows Azure 远程站点“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册[重复]

    这个问题在这里已经有答案了 以下代码在我的本地开发计算机上可以正常运行 但是当我部署它时 我收到以下错误消息Azure 远程网站 我已经查看了SO答案和谷歌搜索结果 但我仍然不清楚我必须在本地计算机上安装什么 这样当我将代码推送到Azure
  • 拆分具有多行文本和单行文本的行

    我试图弄清楚如何拆分数据行 其中行中的 B C D 列包含多行 而其他列不包含多行 我已经弄清楚如何拆分多行单元格 如果我将这些列复制到新工作表中 手动插入行 然后运行下面的宏 仅适用于 A 列 但我在编码时迷失了休息 Here s wha
  • 通过 PHP 检测 excel .xlsx 文件 mimetype

    我无法通过 PHP 检测 xlsx Excel 文件的 mimetype 因为它是 zip 存档 文件实用程序 file file xlsx file xlsx Zip archive data at least v2 0 to extra
  • 即使 Excel 中存在多条记录,CopyFromRecordset 也仅复制并粘贴第一行

    我有一个包含表格数据的 Excel 工作表 strSQL SELECT S FIELD NAME1 S FIELD NAME2 S FIELD NAME3 from SourceData A1 IV6 S Dim cn as ADODB C
  • 基于多个动态过滤条件过滤Excel范围

    我想过滤数据集 考虑几个可以根据可能值列表动态更改的过滤条件 我有过滤条件team其具有以下值 Team A Team B ALL 其中 ALL 是代表所有团队的通配符 对于第二个标准release 如果我想在过滤器中包含多个版本 则值之间
  • MS Access 中的舍入

    VBA Access 中舍入的最佳方法是什么 我目前的方法是利用Excel方法 Excel WorksheetFunction Round 但我正在寻找一种不依赖Excel的方法 请注意 VBA Round 函数使用 Banker 舍入 将
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 标准 VBA 函数“找不到项目或库”

    因此 我必须在我的 PC 上运行别人的 Excel 应用程序 并且在标准函数 如日期 格式 十六进制 中间等 上收到 找不到项目或库 的信息 一些研究表明 如果我在这些函数前加上 VBA 前缀 如 VBA Date 中那样 它会正常工作 网
  • For...VBA 中的下一个循环超出限制

    我正在使用一个For Next循环填充数组 如下所示 ReDim array 1 to 100 1 to 100 For i 1 to 100 Next i But the i计数器似乎总是转到 101 而不是停止在 100 因此 这会在我
  • Excel VBA 导出到文本文件。需要删除空行

    我有一个工作簿 使用以下脚本将其导出到文本文件 它工作正常 但是当我打开文本文件时 末尾总是有一个空行 这导致我在生成此文本文件后运行的另一个脚本出现问题 有关如何从导出中删除空行的任何帮助 Code Sub Rectangle1 Clic
  • 如何使用 VBA 将 mm/dd/yyyy 更改为 dd/mm/yyyy

    我在使用 VBA 将 mm dd yyyy 转换为 dd mm yyyy 日期格式时遇到问题 我有一个这样的表 仅供参考 该表是从报告工具自动生成的 字符串操作 或任何 Excel 函数可以提供帮助吗 希望知道如何解决这个问题的人可以给我一
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • 无法将 Excel 值的类型“double”转换为“string”

    我正在加载 Excel 文件 如网络上许多地方所示 OpenFileDialog chooseFile new OpenFileDialog chooseFile Filter Excel files xls xlsl xls xlsx i
  • 我可以用文本框设置变量名称吗? excel

    我可以使用 TextBox Vba Excel 设置变量的名称吗 我必须以在文本框中写入组名称并单击命令按钮的方式输入新的产品组 代码必须从文本框中获取字符串 并将该字符串设置为新创建的数组的名称 我只想在运行时创建一个新变量 或数组 据信
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错

随机推荐

  • R语言常用的绘图参数

    1 点线结构参数 在plot函数中 使用参数type来控制点线输出结构 参数type的取值及定义 参数取值 描述 type p 点 type l 线 type b 点连线 type o 线穿过点 type h 悬垂线 type s 阶梯线
  • Oracle ORA-00903:表名无效

    order是保留字 如果不小心用了order这个单词就只能加上双引号 order 操作
  • 报错:ABRT 已检测到 ‘1‘ 个问题。预了解详细信息请执行:abrt-cli list --since 1653881497

    文章目录 ABRT 已检测到 1 个问题 预了解详细信息请执行 abrt cli list since 1653881497 报错 表现 解决方案 检测 ABRT 已检测到 1 个问题 预了解详细信息请执行 abrt cli list si
  • python--继承

    1 python继承的基本概念 在程序中 继承描述的是多个类之间的所属关系 如果一个类A里面的属性和方法可以复用 则可以通过继承的方式 传递到类B里 那么类A就是基类 也叫做父类 类B就是派生类 也叫做子类 继承 描述的类与类之间所属关系
  • vue生命周期和整个渲染流程

    vue的生命周期分为8个阶段 beforecreate created beforemount mounted beforeupdate updated beforedestroy destroyed beforeCreate 在实例初始化
  • Cobalt Strike 插件汇总

    https github com 001SPARTaN aggressor scripts https github com 360 A Team CobaltStrike Toolset https github com C0axx Ag
  • 背包问题浅析(most basic version)

    什么是背包问题 给你一个背包 能装的物品重量有限 再给你一些物品和它的价值 问你能装下的最大价值是多少 这就是背包问题 其核心思想是动态规划 怎么做 设置一个dp i j 数组 表示在0 i个物品中能装下的最大价值 j表示背包的重量 核心
  • 微信小程序云开发:npm命令提示: ‘npm‘ 不是内部或外部命令,也不是可运行的程序

    文章目录 一 报错 1 1 安装node 1 2 node环境变量配置 一 报错 今天在学习小程序时 因为云函数中需要用到request promise这个模块 我就去复制安装命令发现报错如下 npm命令提示 npm 不是内部或外部命令 也
  • POJ--2709:Painter (贪心)

    1 题目源地址 http poj org problem id 2709 2 解题思路 每个颜料盒可能有3 12种颜色 其中每种颜色50ml 任意三种颜色 假设每种颜色Xml 可以混合出Xml的灰色 现在给出所需颜色的种数N 给出N个值分别
  • 不同路径(动态规划、dfs /LeetCode)

    题目链接 题目描述 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同的路径 示例 1 输入 m
  • el-dialog 导致无法触发背后图层的鼠标事件的解决方法

    说明 如上图 el dialog 对话框出现时默认情况下是点击不了 点击测试123123 这个按钮的 因为 el dialog 出现时 属于最上层的图层 后面的图层会被它覆盖 导致触发不了后面图层的鼠标事件 上图是解决了这个问题之后可以点击
  • 使用UltralISO制作ubuntu启动盘

    1 从Ubuntu官网Ubuntu系统下载 Ubuntu下载系统的iso文件 用来制作的U盘需要是FAT32格式的 可以通过格式化U盘更改
  • 上传拍照的图片base64存储

    上传base64图片功能 这里只放了上传图片的实现类代码 业务逻辑 新增数据时 应该是先上传图片 然后把生产的uuid返回给前台 前台在新增数据时把图片id集合传给后台 拍照图片上传 param resourceChangePicReq 传
  • 网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02

    1 select实现IO复用的思路02 下面的都是伪代码 主要讲究思路 1 lfd socket 2 bind 3 listen 4 将lfd添加到select的读集合用于传入 借助内核帮我们监听事件 而不直接调用accept函数监听 为了
  • jmeter生成接口测试报告

    一 安装Ant配置 1 下载地址 https ant apache org bindownload cgi 2 安装Ant 下载解压 3 配置环境变量 新建变量ANT HOME 值为D ant apache ant 1 10 12 系统变量
  • 机器学习、深度学习、图像检索 的一些优秀博客

    机器学习 深度学习 图像检索 的一些优秀博客 1 http www cnblogs com ooon 2 http yongyuan name blog
  • 怎么向OpenHarmony的Git仓推送代码

    1 Git设置 git config global user name yourname 随意 git config global user email your email address DCO验证的邮箱 设置记住密码 git conf
  • React Hooks 在使用上有哪些限制?

    React Hooks 的限制主要有两条 不要在循环 条件或嵌套函数中调用 Hook 在 React 的函数组件中调用 Hook 那为什么会有这样的限制呢 就得从 Hooks 的设计说起 Hooks 的设计初衷是为了改进 React 组件的
  • 【docker-compose】从构建镜像到一键运行Java项目

    先来思考个问题 新机器跑一个常规springboot项目要几步 1 下载并配置java环境 mysql环境 redis环境 6步 2 初始化mysql数据库 导入sql文件 2步 3 下载jar包 启动 2步 大概分为零零碎碎的十多步 每块
  • EasyExcel使用教程-实现页面中批量导入导出数据-详解

    EasyExcel介绍 EasyExcel是阿里巴巴开源的一个excel处理框架 以使用简单 节省内存著称 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中 而是从磁盘上一行行读取数据