EasyExcel简单使用

EasyExcel简单使用

​ 之前一直用的Apache POI来做数据的导入导出,但听说阿里的EasyExcel也拥有POI的功能的同时,在处理大数据量的导入导出的时候性能上比POI更好,所以就来尝试使用一下

导入Maven依赖:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version> <!-- 请检查并使用最新稳定版本 -->
</dependency>
导出数据功能
导出模型类

​ 定义一个导出数据模型类,用于设置excel文件的格式,通过注解的方式可以定义excel中的格式
@ColumnWidth(20) 设置excel中列的宽度为20;

@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER) 设置文本内容是否居中;

@HeadFontStyle(bold = BooleanEnum.FALSE) 设置字体是否加粗;

@ExcelProperty(value = “电话”, index = 0) 设置了excel中的标题,value则是标题内容,index则是内容所在的列的位置

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@ColumnWidth(20)
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
@HeadFontStyle(bold = BooleanEnum.FALSE)
public class PmembersExportVO {

    @ColumnWidth(15)
    @ExcelProperty(value = "电话", index = 0)
    private String mobile;

    @ColumnWidth(15)
    @ExcelProperty(value = "姓名", index = 1)
    private String realname;

    @ColumnWidth(10)
    @ExcelProperty(value = "性别", index = 2)
    private String gender;

    @ColumnWidth(10)
    @ExcelProperty(value = "省份", index = 3)
    private String resideprovince;

    @ColumnWidth(10)
    @ExcelProperty(value = "城市", index = 4)
    private String residecity;

    @ColumnWidth(10)
    @ExcelProperty(value = "区/县", index = 5)
    private String residedist;

    @ColumnWidth(20)
    @ExcelProperty(value = "地址", index = 6)
    private String address;

    @ColumnWidth(12)
    @ExcelProperty(value = "公历生日", index = 7)
    private String birth;

    @ColumnWidth(12)
    @ExcelProperty(value = "农历生日", index = 8)
    private String yinlibirth;

    @ColumnWidth(12)
    @ExcelProperty(value = "是否闰月", index = 9)
    private String isLeapMonth;

}
controller代码
    @ApiOperation("导出居士信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "weiqingview_backend_token", value = "token", required = true, dataType = "String", paramType = "header"),
            @ApiImplicitParam(name = "uniacid", value = "Unicid", required = true, dataType = "Integer", paramType = "query")
    })
    @GetMapping("/export")
    public void export(@RequestParam Map<String, Object> params, HttpServletResponse response) {
        mcMembersService.exportExcel(params, response);
    }
service代码

​ 通过查询数据库中的数据,并封装到List集合中,调用EasyExcel的write方法即可将集合中的数据写入生成excel文件供下载

public void export(Map<String, Object> params, HttpServletResponse response) {

        Integer uniacid = Integer.valueOf(params.get("uniacid").toString());

        List<McMembers> mcMembersList = this.list(new QueryWrapper<McMembers>().eq("isBeliever", 1).eq("uniacid", uniacid));

        List<PmembersExportVO> pmembersExportVOList = mcMembersList.stream().map(m -> {
            PmembersExportVO pmembersExportVO = new PmembersExportVO();
            pmembersExportVO.setAddress(m.getAddress());
            pmembersExportVO.setMobile(m.getMobile());
            pmembersExportVO.setGender(ObjectUtils.isEmpty(m.getGender()) ? "" : m.getGender().equals(0) ? "女" : "男");
            pmembersExportVO.setBirth(m.getBirth());
            pmembersExportVO.setYinlibirth(m.getYinlibirth());
            pmembersExportVO.setRealname(m.getRealname());
            pmembersExportVO.setResidedist(m.getResidedist());
            pmembersExportVO.setResidecity(m.getResidecity());
            pmembersExportVO.setResideprovince(m.getResideprovince());
            pmembersExportVO.setIsLeapMonth(ObjectUtils.isEmpty(m.getIsLeapMonth()) ? "否" : m.getIsLeapMonth() == 1 ? "是" : "否");

            return pmembersExportVO;
        }).collect(Collectors.toList());


//        // 导出Excel
//        EasyExcel.write("居士信息数据.xls", PmembersExportVO.class)
                .head(headersList) // 设置表头
//                .sheet("用户信息")
//                .doWrite(pmembersExportVOList);

        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = null;
        try {
            fileName = URLEncoder.encode("居士信息数据.xlsx", "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            EasyExcel.write(response.getOutputStream(), PmembersExportVO.class)
                    .sheet("用户信息")
                    .doWrite(pmembersExportVOList);
        } catch (UnsupportedEncodingException e) {
            log.error("导出居士信息报错 UnsupportedEncodingException:{}", e);
        } catch (IOException e) {
            log.error("导出居士信息报错 IOException:{}", e);
        }

    }

image-20240511105026375

导入数据功能:
导入数据模型类

​ 我这里用的跟导出数据类基本一致,所以也就改了个类名

​ 只要用@ExcelProperty指定对应列的信息就行,其他指定格式的注解其实可以忽略

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@ColumnWidth(20)
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
@HeadFontStyle(bold = BooleanEnum.FALSE)
public class ImportPmcMembersDTO {

    @ColumnWidth(15)
    @ExcelProperty(value = "电话", index = 0)
    private String mobile;

    @ColumnWidth(15)
    @ExcelProperty(value = "姓名", index = 1)
    private String realname;

    @ColumnWidth(10)
    @ExcelProperty(value = "性别", index = 2)
    private String gender;

    @ColumnWidth(10)
    @ExcelProperty(value = "省份", index = 3)
    private String resideprovince;

    @ColumnWidth(10)
    @ExcelProperty(value = "城市", index = 4)
    private String residecity;

    @ColumnWidth(10)
    @ExcelProperty(value = "区/县", index = 5)
    private String residedist;

    @ColumnWidth(20)
    @ExcelProperty(value = "地址", index = 6)
    private String address;

    @ColumnWidth(12)
    @ExcelProperty(value = "公历生日", index = 7)
    private String birth;

    @ColumnWidth(12)
    @ExcelProperty(value = "农历生日", index = 8)
    private String yinlibirth;


    @ColumnWidth(12)
    @ExcelProperty(value = "是否闰月", index = 9)
    private String isLeapMonth;

}
controller代码

​ 前端页面上传一个name是file的文件

    @ApiOperation("导入居士信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "weiqingview_backend_token", value = "token", required = true, dataType = "String", paramType = "header"),
            @ApiImplicitParam(name = "uniacid", value = "Unicid", required = true, dataType = "Integer", paramType = "query"),
            @ApiImplicitParam(name = "file", value = "file", required = true, dataType = "MultipartFile", paramType = "query")
    })
    @PostMapping("/uploadExcel")
    public R uploadExcel(@RequestParam("file") MultipartFile file, @RequestParam Map<String, Object> params) {
        return mcMembersService.importExcel(file, params);
    }
service代码

​ 下面是接收controller传来的文件后,通过调用EasyExcel的read方法,直接进行导入操作

    public R importExcel(MultipartFile file, Map<String, Object> params) {
        // 检查文件是否为空
        if (file.isEmpty()) {
            return R.error("没有检测到文件"); // 返回错误页面
        }

        try {

            // 执行导入操作
            EasyExcel.read(file.getInputStream(), ImportPmcMembersDTO.class, new ImportPmcMembersListener(this, params)).sheet().doRead();

            // 返回上传成功页面
            return R.ok("导入excel成功");

        } catch (IOException e) {
            e.printStackTrace();
            return R.error("导入excel失败");
        }
    }

​ 下面是service中基本的添加数据的操作方法,导入数据插库的时候也直接调用,就不写新的插库方法了

public R pAdd(AddPmcMembersDTO addPmcMembersDTO, Map<String, Object> params) {
        McMembers mcMembers = new McMembers();
        BeanUtils.copyProperties(addPmcMembersDTO, mcMembers);
        mcMembers.setIsBeliever((byte) 1);

        Integer uniacid = Integer.parseInt(params.get("uniacid").toString());
        mcMembers.setUniacid(uniacid);

        if (this.save(mcMembers)) {
            return R.ok("添加成功");
        }

        return R.error("添加失败");
    }
listener代码

​ 上传的话需要定义一个listener,并继承AnalysisEventListener,这里的T类型就是上面定义的模型类的类型。

​ 如果是在listener中进行插库操作,那需要把service注入进来,但是在listener中不能用@Autowired,所以重写一个带参的构造方法,把注入好的service直接传进来使用即可,我下面将注入好的mcMembersService传递了进来,执行插库操作。下面的AddPmcMembersDTO是我另外定义的一个模型类,是用于界面上添加数据用的,这里直接转换后调用进行插库操作了。

​ 当然也可以在listener中先将excel中的数据都封装到List集合中,再统一将List中的数据插库也行。

public class ImportPmcMembersListener extends AnalysisEventListener<ImportPmcMembersDTO> {

    private McMembersService mcMembersService;

    private Map<String, Object> params;
    
	//通过构造方法,得到注入好的mcMembersService
    public ImportPmcMembersListener(McMembersService mcMembersService, Map<String, Object> params) {
        this.mcMembersService = mcMembersService;
        this.params = params;
    }

    @Override
    public void invoke(ImportPmcMembersDTO data, AnalysisContext context) {
        // 处理读取到的每行数据,例如保存到数据库
        System.out.println("读取到一行数据: " + data.toString());
        // 这里可以添加保存到数据库的逻辑

        AddPmcMembersDTO addPmcMembersDTO = new AddPmcMembersDTO();
        addPmcMembersDTO.setMobile(data.getMobile());
        addPmcMembersDTO.setRealname(data.getRealname());
        addPmcMembersDTO.setGender((byte) (ObjectUtils.isEmpty(data.getGender()) ? 0 : data.getGender().equals("男") ? 1 : 2));

        addPmcMembersDTO.setAddress(data.getAddress());
        addPmcMembersDTO.setBirth(data.getBirth());
        addPmcMembersDTO.setYinlibirth(data.getYinlibirth());
        addPmcMembersDTO.setResidedist(data.getResidedist());
        addPmcMembersDTO.setResidecity(data.getResidecity());
        addPmcMembersDTO.setResideprovince(data.getResideprovince());
        addPmcMembersDTO.setIsLeapMonth((byte) (ObjectUtils.isEmpty(data.getIsLeapMonth()) ? 0 : data.getIsLeapMonth().equals("是") ? 1 : 0));

        // 进行插库操作
        mcMembersService.pAdd(addPmcMembersDTO, params);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 所有数据解析完毕后的回调
        System.out.println("所有数据解析完成");
    }

将一下excel数据进行导入操作

image-20240511112040930

用Api工具测试了下,上传成功

image-20240511112220656

查看数据库,数据也成功导入

image-20240511112302526

整体感觉挺好用的,对于不同的数据进行导入的话,其实可以再封装成通用的listener,这样不用每一个功能导入都去定义一个listener,这个等后面有空再折腾吧。

结束

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java后端初始化项目(项目模板)

介绍 emmmm&#xff0c;最近看了一些网络资料&#xff0c;也是心血来潮&#xff0c;想自己手工搭建一个java后端的初始化项目模板来简化一下开发&#xff0c;也就发一个模板的具体制作流程&#xff0c;&#xff08;一步一步搭建&#xff0c;从易到难&#xff09; ok&#xff…

pycharm报错Process finished with exit code -1073740791 (0xC0000409)

pycharm报错Process finished with exit code -1073740791 (0xC0000409) 各种垃圾文章&#xff08;包括chatgpt产生的垃圾文章&#xff09;&#xff0c;没有给出具体的解决办法。 解决办法就是把具体报错信息显示出来&#xff0c;然后再去查。 勾选 然后再运行就能把错误显示…

Xilinx 千兆以太网TEMAC IP核 AXI4-Lite接口信号

在AX4总线标准中&#xff0c;AXI4-Lite主要由向她址映射型通信。TEMAC的管理法口采用AXI4-Lite标准接口&#xff0c;TEMAC核的AX14-Lite接口信号如表1所示&#xff0c;根据AX14-Lite标准&#xff0c;接口角色分为主接口(Maser Interface)和从接口(Slave Interface)。主接口为通…

让SOLIDWORKS用户无忧的基于云的PLM

在市场需求和法规不断变化的时代&#xff0c;紧跟变化步伐对于更快速、更有效地交付创新的高质量产品至关重要。 现代产品开发流程会生成数量惊人的数据&#xff0c;从零件和装配体文件到仿真和CAD/CAM文件。此外&#xff0c;要实现有效的项目交流&#xff0c;需要无数的文件&…

HIVE调优MapJoin

HIVE调优MapJoin 目录 HIVE调优MapJoin 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09; 2.创建表格 3.查询建表 4.通过 explain 展示执行计划 5.Map JOIN 相关设置&#xff1a; 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09;…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …

最新巨量X-Bogus、_signature参数逆向分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. 扣代码补环境5. 数据解密 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路…

机器学习(四) ----------逻辑回归

目录 1 概述 2 极大似然估计 3 逻辑回归核心思想 3.1 对数似然损失&#xff08;Log-likelihood Loss&#xff09; 4 分类问题的评估方法 4.1 混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff1a; 4.2 准确率&#xff08;Accuracy&#xff09; 4.3 精确率&am…

Redis-配置文件详解

Redis配置文件详解 units单位 配置大小单位&#xff0c;开头定义基本度量单位&#xff0c;只支持bytes&#xff0c;大小写不敏感。 INCLUDES Redis只有一个配置文件&#xff0c;如果多个人进行开发维护&#xff0c;那么就需要多个这样的配置文件&#xff0c;这时候多个配置 文…

kali搭建Vulhub靶场

简单概述 Vulhub是一个面向大众的开源漏洞靶场&#xff0c;借助Docker简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单&#xff0c;让安全研究者更加专注于漏洞原理本身。 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用…

20.接口自动化-Git

1、Git和SVN–版本控制系统 远程服务出问题后&#xff0c;可以先提交commit到本地仓库&#xff0c;之后再提交push远程仓库 git有clone Git环境组成部分 常用Git代码仓库服务-远程仓库 GitHub-服务器在国外&#xff0c;慢 GitLab-开源&#xff0c;可以在自己服务器搭建&…

NASA数据集——2002-2011年全球18.7 至 89.0 千兆赫的亮度温度、海冰浓度和海冰积雪深度三级网格产品(AE_SI12)数据

AMSR-E/Aqua Daily L3 12.5 km Brightness Temperature, Sea Ice Concentration, & Snow Depth Polar Grids V003 三级网格产品&#xff08;AE_SI12&#xff09;包括 18.7 至 89.0 千兆赫的亮度温度、海冰浓度和海冰积雪深度。 简介 美国国家航空航天局地球观测系统 Aqu…

STM32睡眠模式

文章目录 前言PWR介绍电源框图上电复位和掉电复位可编程电压检测器低功耗模式模式选择电源控制寄存器 睡眠模式停止模式待机模式 前言 在单片机产品中&#xff0c;例如遥控这类产品&#xff0c;长时间处于待机状态下&#xff0c;所以对于这类产品在待机时就应该尽可能的减少不…

STM32入门_江协科技_5~6_OB记录的自学笔记_GPIO输出_LED流水灯_蜂鸣器

5. GPIO 输出 5.1. GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V&#xff08;端口输入5V的电压&#xff0c;之前引脚定义表格中带FT标识的&#xff09…

python视频转码脚本

今天有一个临时的需求&#xff0c;就是需要将一个wmv的初步转码成mp4的格式。找了一圈&#xff0c;免费的工具少&#xff0c;即使有免费的工具&#xff0c;在功能上也是有所限制&#xff0c;或者会给你塞广告或者附带安装其它流氓小游戏或者杀毒程序。 我并非不支持正版&#…

vue 点击平滑到指定位置并绑定页面滑动效果

1.html元素 写出对应的数据块&#xff08;注意添加ref) 用于获取元素位置 <template><div class"index-page" ><div class"top-head" ref"index"><img src"logo.png" style"height: 40px;margin-right: 2…

《解锁数字化劳动合同签约:构建高效的电子合同签约平台》

随着数字化转型的推进&#xff0c;传统的纸质劳动合同签约方式已经无法满足现代企业对于效率和便捷性的需求。电子劳动合同签约平台应运而生&#xff0c;为企业和员工提供了一种更加高效、便捷的合同签署方式。本文将介绍电子劳动合同签约平台的业务架构&#xff0c;探讨其如何…

地图涟漪效果

参考API echarts图表集 useEcharts.js import { onBeforeUnmount, onDeactivated } from "vue"; // import * as echarts from "echarts";/*** description 使用 Echarts (只是为了添加图表响应式)* param {Element} myChart Echarts实例 (必传)* param …

python代码学习案例-用turtle库绘制爱心图形效果

Python爱心代码&#xff0c;我们可以使用多种方法&#xff0c;包括使用turtle库来绘制图形&#xff0c;或者使用字符打印来在控制台中显示爱心。 首先&#xff0c;确保你已经安装了Python&#xff0c;并且你的环境支持turtle库&#xff08;它通常是Python标准库的一部分&#…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 01

Week 01 of Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Week 01 of Neural Networks and Deep Learning[0] Welcome to the Deep Learning Spec…