EasyExcel入门使用

这篇具有很好参考价值的文章主要介绍了EasyExcel入门使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
EasyExcel入门使用,java,后端

EasyExcel 的主要特点如下:

1、高性能:EasyExcel 采用了异步导入导出的方式,并且底层使用 NIO 技术实现,使得其在导入导出大数据量时的性能非常高效。

2、易于使用:EasyExcel 提供了简单易用的 API,用户可以通过少量的代码即可实现复杂的 Excel 导入导出操作。

3、增强的功能“EasyExcel 支持多种格式的 Excel 文件导入导出,同时还提供了诸如合并单元格、数据校验、自定义样式等增强的功能。

4、可扩展性好:EasyExcel 具有良好的扩展性,用户可以通过自定义 Converter 对自定义类型进行转换,或者通过继承 EasyExcelListener 来自定义监听器实现更加灵活的需求。

EasyExcel官网

1.入门案例

1.在pom文件中加入依赖

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

2.定义一个实体类来封装每一行的数据

@Data
public class CategoryExcelVo {

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

	@ExcelProperty(value = "名称" ,index = 1)
	private String name;

	@ExcelProperty(value = "图片url" ,index = 2)
	private String imageUrl ;

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

	@ExcelProperty(value = "状态" ,index = 4)
	private Integer status;

	@ExcelProperty(value = "排序" ,index = 5)
	private Integer orderNum;
}

3.定义一个监听器,监听解析到的数据


public class ExcelListener<T> extends AnalysisEventListener<T> {


    private List<T> data = new ArrayList<>();


    /**
     * 读取excel内容 从第二行开始读取,把每行读取内容封装到t对象里
     * @param t
     * @param analysisContext
     */
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        data.add(t);
    }


    public List<T> getData(){
        return data;
    }

    // excel解析完毕以后需要执行的代码
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

4.编写测试方法


public class EasyExcelTest {
    public static void main(String[] args) {
//        read();
        write();
    }



    //读操作
    public static void read(){
        // 定义读取excel文件为止
        String fileName = "E://资料//资料//01.xlsx";
        // 调用方法
        // 创建一个监听器对象
        ExcelListener<CategoryExcelVo> excelListener = new ExcelListener();
        // 解析excel表格
        EasyExcel.read(fileName, CategoryExcelVo.class,excelListener).sheet().doRead();
        List<CategoryExcelVo> data = excelListener.getData();

        System.out.println(data);
    }


    //读操作
    public static void write(){
        List<CategoryExcelVo> list = new ArrayList<>() ;
        list.add(new CategoryExcelVo(1L , "数码办公" , "",0L, 1, 1)) ;
        list.add(new CategoryExcelVo(11L , "华为手机" , "",1L, 1, 2)) ;
        EasyExcel.write("E://资料//资料//01.xlsx" , CategoryExcelVo.class).sheet("分类数据1").doWrite(list);
    }
}

2.导出功能

当用户点击导出按钮的时候,此时将数据库中的所有的分类的数据导出到一个excel文件中。

CategoryController

@GetMapping(value = "/exportData")
public void exportData(HttpServletResponse response) {
    categoryService.exportData(response);
}

CategoryService

    void exportData(HttpServletResponse response);

CategoryServiceImpl

@Override
    public void exportData(HttpServletResponse response) {

        try {
            // 设置响应头信息和其他信息
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");

            //URLEncoder.encode可以防止中文乱码
            String fileName = URLEncoder.encode("分类数据","UTF-8");

            // 设置响应头信息
            response.setHeader("Content-disposition","attachment;filename="+fileName+".xlsx");

            // 调用mapper方法查询所有分类,返回list集合
            List<Category> categoryList = categoryMapper.findAll();

            List<CategoryExcelVo> categoryExcelVoList = new ArrayList<>();

            for(Category category : categoryList){
                CategoryExcelVo categoryExcelVo = new CategoryExcelVo();
                BeanUtils.copyProperties(category,categoryExcelVo,CategoryExcelVo.class);
                categoryExcelVoList.add(categoryExcelVo);
            }

            // 调用EasyExcel的write方法完成写操作
            EasyExcel.write(response.getOutputStream(), CategoryExcelVo.class).sheet("分类数据").doWrite(categoryExcelVoList);
        } catch (Exception e){
            e.printStackTrace();
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }

    }

CategoryMapper

  List<Category> findAll();

CategoryMapper

    <select id="findAll" resultMap="categoryMap">
        select <include refid="columns"/>
            from category
            where is_deleted=0
            order by id
    </select>

category.js

// 导出方法
export const ExportCategoryData = () => {
  return request({
    url: `${api_name}/exportData`,
    method: 'get',
    responseType: 'blob'  // // 这里指定响应类型为blob类型,二进制数据类型,用于表示大量的二进制数据
  })
}

category.vue

<div class="tools-div">
    <el-button type="success" size="small" @click="exportData">导出</el-button>
</div>

<script setup>
import { ExportCategoryData} from '@/api/category.js'

const exportData = () => {
  // 调用 ExportCategoryData() 方法获取导出数据
  ExportCategoryData().then(res => {
      // 创建 Blob 对象,用于包含二进制数据
      const blob = new Blob([res]);             
      // 创建 a 标签元素,并将 Blob 对象转换成 URL
      const link = document.createElement('a'); 
      link.href = window.URL.createObjectURL(blob);
      // 设置下载文件的名称
      link.download = '分类数据.xlsx';
      // 模拟点击下载链接
      link.click();
  })  
}
</script>

3.导入功能

用户选择要导入的excel文件,选择完毕以后将文件上传到服务端,服务端通过easyExcel解析文件的内容,然后将解析的结果存储到category表中。

CategoryController

    /**
     * 导入功能
     * @param file
     * @return
     */
    @PostMapping("/importData")
    public Result importData(MultipartFile file){
        categoryService.importData(file);
        return Result.build(null , ResultCodeEnum.SUCCESS) ;
    }

CategoryService

    void importData(MultipartFile file);

CategoryServiceImpl

   @Override
    public void importData(MultipartFile file) {

        try {

            //创建监听器对象,传递mapper对象
            ExcelListener<CategoryExcelVo> excelListener = new ExcelListener<>(categoryMapper);
            EasyExcel.read(file.getInputStream(),CategoryExcelVo.class,excelListener).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }

CategoryMapper

    void batchInsert(List<CategoryExcelVo> categoryList);

CategoryMapper


    <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
        insert into category (
        id,
        name,
        image_url,
        parent_id,
        status,
        order_num,
        create_time ,
        update_time ,
        is_deleted
        ) values
        <foreach collection="categoryList" item="item" separator="," >
            (
            #{item.id},
            #{item.name},
            #{item.imageUrl},
            #{item.parentId},
            #{item.status},
            #{item.orderNum},
            now(),
            now(),
            0
            )
        </foreach>
    </insert>

创建包listener,创建监听器类ExcelListener


/**
 * 监听器
 */
public class ExcelListener<T> implements ReadListener<T> {


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


    /**
     * 缓存的数据
     */
    private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);


    //构造传递
    private CategoryMapper categoryMapper;

    public ExcelListener(CategoryMapper categoryMapper){
        this.categoryMapper = categoryMapper;
    }


    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        cachedDataList.add(t);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // excel解析完毕以后需要执行的代码
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
    }

    private void saveData() {
        categoryMapper.batchInsert((List<CategoryExcelVo>)cachedDataList);
    }
}

Category.vue文章来源地址https://www.toymoban.com/news/detail-823335.html

<div class="tools-div">
    <el-button type="success" size="small" @click="exportData">导出</el-button>
    <el-button type="primary" size="small" @click="importData">导入</el-button>
</div>

<el-dialog v-model="dialogImportVisible" title="导入" width="30%">
    <el-form label-width="120px">
        <el-form-item label="分类文件">
            <el-upload
                       class="upload-demo"
                       action="http://localhost:8501/admin/product/category/importData"
                       :on-success="onUploadSuccess"
                       :headers="headers"
                       >
                <el-button type="primary">上传</el-button>
            </el-upload>
        </el-form-item>
    </el-form>
</el-dialog>

<script setup>
import { useApp } from '@/pinia/modules/app'
    
// 文件上传相关变量以及方法定义
const dialogImportVisible = ref(false)
const headers = {
  token: useApp().authorization.token     // 从pinia中获取token,在进行文件上传的时候将token设置到请求头中
}
const importData = () => {
  dialogImportVisible.value = true
}

// 上传文件成功以后要执行方法
const onUploadSuccess = async (response, file) => {
  ElMessage.success('操作成功')
  dialogImportVisible.value = false
  const { data } = await FindCategoryByParentId(0)
  list.value = data ; 
}
</script>

到了这里,关于EasyExcel入门使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 使用 easyexcel 读取 excel 文件

    easyexcel 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 1. 引入依赖并给出示例 excel     2. 两种读取的方式         (1)确定表头:建立对象,和表头形成映射。(这里以此为例)         (2)不确定表头:每一行映射为 MapString, Object。 3. 先创建 excel 中表头对应

    2024年02月12日
    浏览(54)
  • Java——使用EasyExcel导出动态列的Excel

    多多点赞,会变好看! 多多留言,会变有钱! 有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: 静态列导出代码:

    2024年02月15日
    浏览(46)
  • java实现excel的导出之使用easyExcel

    在我们的项目需求中,经常会遇到导出的需求,其中excel的导出最为常见。生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc. EasyExcel是阿里巴巴

    2024年02月15日
    浏览(44)
  • Java 使用 EasyExcel 实现导入导出(新手篇教程)

    官网镇楼↓,觉得我写的不好的同学可以去官网看哦 EasyExcel 示例: 如上一个简易 Excel 表格,表头占了两行,且第三列开始才为有效数据,那么我们应该如何导入? 建造实体类 首先无论是导入还是导出,都需要先建对应的实体类  如图所示,因为我的示例 Excel 一共需要读

    2024年04月17日
    浏览(39)
  • 使用java解析和读取excel表格(EasyExcel的简单使用)

    ** ** Apache POI、JXL、Alibaba EasyExcel等。其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数据量不大的应用场景; EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下

    2024年01月16日
    浏览(41)
  • 记录java使用EasyExcel进行单元格内换行操作

    1、首先是在需要换行的地方将 n   或者 rn 替换为 String.valueOf((char)10)  ,有时候不替换好像也能用 2、第一步完成后可能导出的内容还是无法换行,需要双击单元格才会换行, 在导出的java实体类上加入注解 @ContentStyle( horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignmen

    2023年04月08日
    浏览(43)
  • 【操作系统】一文快速入门,很适合JAVA后端看

    作者简介: 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 操作系统可以看作一个计算机的管理系统,对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块:运算器、控制器、存储器、输入设备、输出设备。操作系统实际上就是对这个五块资源各自提

    2024年02月10日
    浏览(38)
  • EasyExcel入门小demo,简单理解EasyExcel

    一、什么是EasyExcel EasyExcel是阿里巴巴开源的一个excel处理框架, 以使用简单、节省内存著称 。该项目实现了列表数据的导入,分页列表导出,支持自定义格式,支持模版以及模板和列表的混合导出,小巧、简易、高性能。 二、使用 1.pom.xml  2.实体类(需要写入excel的类) 

    2023年04月22日
    浏览(25)
  • EasyExcel入门(最简单的读)

    官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) 因为暂时项目没有用到,所以不急,知道了这个技术。就想着学着用一下!   先看官方文档给的用法和解释!!!   自己准备一个Excel表格。 官方提供了4种写法 写法一: 点击PageReadListener查看源码:  默认

    2024年02月09日
    浏览(42)
  • EasyExcel入门介绍及工具类,网络下载excel

    前言:在这里分享自己第一次使用EasyExcel并且编写工具类,且在接口中支持excel文件下载的一系列流程,包含所有前后端(JS+JAVA)完整代码,可以根据自己需要自行提取,仅供参考。 一.引入EasyExcel依赖 二.自定义创建一个实体类,如下,这里使用了lombok 其中各个注解功能如

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包