easyExcel使用案例有代码

news2025/3/4 6:47:30

easyExcel 入门,完成web的excel文件创建和导出

easyExcel官网
在这里插入图片描述

EasyExcel 的主要特点如下:

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

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

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

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

入门使用

使用maven导入easyExcel坐标

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

定义实体类封装数据,一行对应一个对象 用@ExcelProperty注解完成与excel的映射

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CategoryExcelVo {
     // `value` 指定 Excel 表头名称,数据导入导出时匹配该表头
     // `index`(可选)从 0 开始,表示 Excel 第 n+1 列
     // 如果省略 `index`,则按字段声明顺序匹配列
	@ExcelProperty(value = "id" ,index = 0)
	private Long id;
	
	@ExcelProperty(value = "名称" ,index = 1)
	private String name;
}

excel对应的表
在这里插入图片描述

读入操作 read 读需要用到ExcelListener对象

1、 先创建这个对象

@Getter
public class ExcelListener<T> extends AnalysisEventListener<T> {
    /**
     * 每读取一行就执行一次
     * @param t    返回的数据
     * @param analysisContext
     */
    //读取后对象存储在data集合中
    List<T> data=new ArrayList<>();
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
          data.add(t);
    }

    /**
     *  都读取解析完毕后执行,   一般用于对资源的处理, 或对操作的补充
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("表格的解析完成了");
    }

2、 进行读测试

private static void readFile() {
        // 文件的路径
        String filePath="/Users/chen/01.xlsx";
        // easyExcel不能由spring 接管, 这里手动new对象
        ExcelListener<CategoryExcelVo> excelVoExcelListener = new ExcelListener<>();
        //读操作
        EasyExcel.read(filePath, CategoryExcelVo.class,excelVoExcelListener).sheet().doRead();
        //读取完毕后数据存放到了, 监听器的data里面,遍历取出来就可以
        List<CategoryExcelVo> data = excelVoExcelListener.getData();
        for (CategoryExcelVo item : data) {
            System.out.println(item);
        }
    }
写出操作 write 不需要用到ExcelListener对象
    private static void writeFile() {
        //要写到的磁盘路径
        String filePath="/Users/chen/categoryWrite.xlsx";
        //创建每一个对象,对应一行数据
        List<CategoryExcelVo> list = new ArrayList<>() ;
        list.add(new CategoryExcelVo(1L , "数码办公")) ;
        list.add(new CategoryExcelVo(11L , "华为手机")) ;
        //参数    1路径名    2 对应的类     3 excel中sheet的名字       4 集合
        EasyExcel.write(filePath,CategoryExcelVo.class).sheet("category").doWrite(list);
        System.out.println("finished write");
    }

在web中使用

后端

1、controller

@RestController
@RequestMapping("/admin/product/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;
    @GetMapping("/excelExport")
    //不需要返回值, 由response设置
    public void excelExport(HttpServletResponse response){
        categoryService.excelExport(response);
    }
}

2、service

@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;


    /**
     *  导出 excel文件,写操作
     * @param response
     */
    @Override
    public void excelExport(HttpServletResponse response) {
        try {
            // 设置mime类型
            response.setContentType("application/vnd.ms-excel");
            //设置浏览器编码方法
            response.setCharacterEncoding("utf-8");
            //对路径进行编码
            String fileName = URLEncoder.encode("分类数据", "UTF-8");

            //设置 HTTP 响应头,告诉浏览器该请求是一个文件下载(attachment),并指定下载的文件名为 fileName.xlsx。
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

            //准备数据
            //查询全部分类,不需要带树形结构
            List<Category>  categoryList=categoryMapper.selectAllCategory();
             //查出来的数据比实际用到的数据多
            //   查询出来的类和对应的vo类不匹配, 但是有部分属性相同,这时候可以用map()函数
            List<CategoryExcelVo> categoryExcelVoList = categoryList.stream().map(category -> {
                CategoryExcelVo categoryExcelVo = new CategoryExcelVo();
                //   BeanUtils.copyProperties();   可以把参数一的属性的值,拷贝到参数2中,    要求两个属性必须一致
                BeanUtils.copyProperties(category, categoryExcelVo);
                return categoryExcelVo;
            }).collect(Collectors.toList());
            //写出数据
            EasyExcel.write(response.getOutputStream(), CategoryExcelVo.class).sheet("category").doWrite(categoryExcelVoList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、mapper

@Mapper
public interface CategoryMapper {
    //查询所有分类
    List<Category> selectAllCategory();

}
    <select id="selectAllCategory" resultType="com.chen.model.entity.product.Category">
        select <include refid="columns"/> from category
        where  is_deleted=0
        order by  order_num
    </select>

前端

1、 api

import request from '@/utils/request'
// 抽取出来方便后面使用
const apiUrl = '/admin/product/category'

/**
 * 导出excel文件
 * @returns {AxiosPromise}
 */
export const exportExcel = () => {
    return request({
        url: `${apiUrl}/excelExport`,
        method: 'get',
        responseType:'blob' //用于处理二进制数据
    })
}

2、 vue

<template>
  <div class="tools-div">
    <el-button type="success" size="small"  @click="exportExcelFile">导出</el-button>
    <el-button type="primary" size="small">导入</el-button>
  </div>
</template>
```js 
<script setup>
import {exportExcel} from '@/api/category'
//点击导出后,开始执行方法 本方法是给按钮绑定的
const exportExcelFile = async () => {
  // exportExcel() 是一个异步函数,返回一个 Promise。
  //.then((resp => { })) 监听 Promise 的成功状态,但回调函数中没有任何操作。
  exportExcel().then((resp => {
    //创建blob对象
    let blob = new Blob([resp]);
    //创建a标签
    const link = document.createElement("a");
    //赋值数据
    link.href=window.URL.createObjectURL(blob);
    //设置名称
    link.download="分类数据.xlsx"
    //模拟点击
    link.click()
  }))
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能&#xff0c;但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能&#xff0c;不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性&#xff0c;查…

视觉图像坐标转换

1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面&#xff08;即传感器&#xff09;。这个过程可以用小孔成像模型来近似描述&#xff0c;尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型&#xff1a; 假设有一个理想的小孔&#xff0c;…

脚本无法获取响应主体(原因:CORS Missing Allow Credentials)

背景&#xff1a; 前端的端口号8080&#xff0c;后端8000。需在前端向后端传一个参数&#xff0c;让后端访问数据库去检测此参数是否出现过。涉及跨域请求&#xff0c;一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码&#xff0c;出现了这个bug&#xff0…

leetcode第39题组合总和

原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以…

SQLark 数据迁移|断点续迁已上线(Oracle-达梦)

数据迁移是 SQLark 最受企业和个人用户欢迎的功能之一&#xff0c;截止目前已帮助政府、金融、能源、通信等 50 家单位完成从 Oracle、MySQL 到达梦的全量迁移&#xff0c;自动化迁移成功率达 96% 以上。 在 Oracle 到达梦数据库迁移过程中&#xff0c;SQLark V3.3 新增 断点续…

Element Plus中el-tree点击的节点字体变色加粗

el-tree标签设置 <el-tree class"tree":data"treeData":default-expand-all"true":highlight-current"true"node-click"onTreeNodeClick"><!-- 自定义节点内容&#xff0c;点击的节点字体变色加粗 --><!-- 动…

vmware安装firepower ftd和fmc

在vmware虚拟机中安装cisco firepower下一代防火墙firepower threat defence&#xff08;ftd&#xff09;和管理中心firepower management center&#xff08;fmc&#xff09;。 由于没有cisco官网下载账号&#xff0c;无法下载其中镜像。使用eveng模拟器中的ftd和fmc虚拟镜像…

计算机毕业设计SpringBoot+Vue.js医院资源管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

[含文档+PPT+源码等]精品基于Python实现的微信小程序的乡村医疗咨询系统

基于Python实现的微信小程序的乡村医疗咨询系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、社会背景 医疗资源分布不均&#xff1a;在我国&#xff0c;城乡医疗资源分布不均是一个长期存在的问题。乡村地区由于地理位置偏远、经济条件有限&#xff0c;往往…

Python实现GO鹅优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 传统BP神经网络的局限性&#xff1a;BP&#xff08;Back Propagation&#xff09;神经网络作为一种…

7.1.2 计算机网络的分类

文章目录 分布范围交换方式 分布范围 计算机网络按照分布范围可分为局域网、广域网、城域网。局域网的范围在10m~1km&#xff0c;例如校园网&#xff0c;网速高&#xff0c;主要用于共享网络资源&#xff0c;拓扑结构简单&#xff0c;约束少。广域网的范围在100km&#xff0c;例…

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的&#xff0c;如果想让一般的数据也可以得到状态的保存&#xff0c;可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…

[Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)

[Windows] 极限投屏_正式版 链接&#xff1a;https://pan.xunlei.com/s/VOKJf8Z1u5z-cHcTsRpSd89tA1?pwdu5ub# 新增功能(Future)&#xff1a; 支持安卓14(Supports Android 14)提高投屏成功率(Improve the success rate of mirror)加快投屏速度(Accelerate screen mirrorin…

C++初阶—list类

第一章&#xff1a;list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

入门基础项目(SpringBoot+Vue)

文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…

虚拟机快照与linux的目录结构

虚拟机快照是对虚拟机某一时刻状态的完整捕获&#xff0c;包括内存、磁盘、配置及虚拟硬件状态等&#xff0c;保存为独立文件。 其作用主要有数据备份恢复、方便系统测试实验、用于灾难恢复以及数据对比分析。具有快速创建和恢复、占用空间小、可多个快照并存的特点。在管理维…

Unity小功能实现:鼠标点击移动物体

1、功能描述 当玩家点击鼠标时&#xff0c;场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。 2、实现步骤 创建Unity项目&#xff1a;首先&#xff0c;打开Unity并创建一个新的3D项目。 添加3D物体&#xff1a;在场景中创建一个3D物体&am…

算法题笔记(自用)——Python

目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量&#xff08;f-string&#xff09; 三. 字符串 使…