easyExcel-读取Excel

news2024/9/17 8:23:40

1、简单读取,没有合并单元格
2、复杂读取,合并单元格-方法一

1、简单读取,没有合并单元格

1.1、引入pom文件

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.3</version>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

1.2、Excel读取
在这里插入图片描述

1.3、测试代码


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

@Data
public class userDTo {

    @ExcelProperty(value = "姓名")
    private String name;


    @ExcelProperty(value = "年龄")
    private String age;

    /**
     * 项目名称
     */
    @ExcelProperty(value = "工号")
    private String workNo;

    @ExcelProperty(value = "部门")
    private String dept;

}

    @Test
    void contextLoads() {

        File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");
        Class<userDTo> userDToClass = userDTo.class;
        EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {

            @Override
            public void invoke(userDTo userDTo, AnalysisContext analysisContext) {
                //一条一条数据进解析
                System.out.println("数据解析---->"+userDTo);
            }

            //所有的数据都解析完之后执行
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

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

// sheet 从0 开始(默认)
//headRowNumber 标题

1.4、结果
在这里插入图片描述

2、复杂读取,合并单元格 -数据嵌套

2.1、读取Excel格式

在这里插入图片描述

2.2、测试代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.easyexceltest.pojo.userDTo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;

@SpringBootTest
class EasyExcelTestApplicationTests {

    @Test
    void contextLoads() {

        File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");
        Class<userDTo> userDToClass = userDTo.class;
        EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {

            @Override
            public void invoke(userDTo userDTo, AnalysisContext analysisContext) {
                //一条一条数据进解析
                System.out.println("数据解析---->"+userDTo);
            }

            //所有的数据都解析完之后执行
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("数据解析结束");
            }
        }).sheet().headRowNumber(1).doRead();
    }

}

2.3、测试结果
在这里插入图片描述
发现使用刚刚的方法已经,合并之后并不能够正常读取数据。只能读合并之后 第一行 数据。

解决办法:

1、实体类:

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

import java.util.List;
import java.util.Map;

@Data
public class userDTo {

    @ExcelProperty(value = "姓名")
    private String name;


    @ExcelProperty(value = "年龄")
    private String age;

    /**
     * 项目名称
     */
    @ExcelProperty(value = "工号")
    private String workNo;

// 把 要从Excel 读取的字段都要写,即使部门要封装到list中
    @ExcelProperty(value = "部门")
    private String dept;

    // 忽略该字段
    @ExcelIgnore
    private List<Map<String,String>> deptMap;
    
    @ExcelIgnore
    private List<Dept> deptList;

}
@Data
public class Dept {
    private String dept;
}

2、测试代码:


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.easyexceltest.pojo.Dept;
import com.example.easyexceltest.pojo.userDTo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
@Slf4j
class EasyExcelTestApplicationTests {

    @Test
    void contextLoads() {

        File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");
        Class<userDTo> userDToClass = userDTo.class;
        List<userDTo> deptsInfo = new ArrayList<>();
        EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {

            @Override
            public void invoke(userDTo userDTo, AnalysisContext analysisContext) {
                //一条一条数据进解析
                System.out.println("数据解析---->"+userDTo);
                deptsInfo.add(userDTo);
            }

            //所有的数据都解析完之后执行
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("数据解析结束");
                importCustomer(deptsInfo);
            }
        }).sheet().headRowNumber(1).doRead();
    }


    public void importCustomer(List<userDTo> list) {
        // 待保存到数据库的数据
        List<userDTo> data = new ArrayList<>();
        userDTo customer = new userDTo();
        List<Map<String, String>> contactsList = new ArrayList<>();

        for (userDTo obj : list) {
            // 判断用户名是否为空,
            if (StringUtils.isNotBlank(obj.getName())) {
                //信息列表是否有数据,如果有则要把数据保存起来
                if (contactsList.size() != 0) {
                    customer.setDeptMap(contactsList);
                    data.add(customer);
                }
                //重置对象
                customer = new userDTo();
                contactsList = new ArrayList<>();
                customer.setName(obj.getName());
                customer.setAge(obj.getAge());
                customer.setWorkNo(obj.getWorkNo());

                //一个list嵌套写一个map,如果有两个需要写两个map
                Map map = new HashMap();
                map.put("dept", obj.getDept());
                contactsList.add(map);
            } else {
                Map map = new HashMap();
                map.put("dept", obj.getDept());
                contactsList.add(map);
            }
        }

        // 保存最后一条数据
        if (contactsList.size() != 0) {
            customer.setDeptMap(contactsList);
            data.add(customer);
        }
        System.out.println(data.toString());

        System.out.println("----------------==");
        for (userDTo user : data) {
            List<Map<String, String>> issrInfo = user.getDeptMap();
            ArrayList<Dept> depts = new ArrayList<>();
            for (Map<String, String> map : issrInfo) {
//               map 转成 ArrIssExcelDto.class;
                Dept dept = JSONObject.parseObject(JSON.toJSONString(map), Dept.class);
                depts.add(dept);
            }
            System.out.println(">>>>>>>>>>>>>>>>>>>>将map数据封装到list中");
            System.out.println(depts);
            user.setDeptList(depts);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");
        }
       log.info("---读取data数据为:{}" , JSONObject.toJSONString(data));
    }

}

3、结果:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【单片机】详细解析完全重映射和部分重映射

1、重映射的作用 单片机中的每个引脚通常都有多个功能&#xff0c;不仅仅是作为普通的输入或输出&#xff0c;还可以与某些外设&#xff08;如定时器、串口、SPI、I2C等&#xff09;关联。默认情况下&#xff0c;这些外设功能通常固定绑定到特定的GPIO引脚。但是&#xff0c;在…

Matplotlib颜色透明度设置

matplotlib中的透明度设置都是通过alpha设置的,一般在能设置颜色的包括背景色、图表色、文字颜色都可以设置透明度 float类型,取值范围为[0.0,1.0],alpha取值越小越透明 import numpy as np import matplotlib.pyplot as pltx np.linspace(0, 2*np.pi, 100) y np.sin(x) y1…

Arch - 架构安全性_授权(Authorization)

文章目录 OverView授权&#xff08;Authorization&#xff09;RBAC&#xff1a; 概述RBAC&#xff1a;基于角色的访问控制RBAC&#xff1a;主要元素 OAuth2&#xff1a;面向第三方应用的认证授权协议业务场景OAuth2的工作流程OAuth2 四种不同的授权方式授权码模式&#xff08;A…

Android Studio 2024最新版Hello World

Android Studio 2024最新版Hello World 1. Android Studio 2024安装视频2. 创建项目Read Timed out 问题Android Studio Build Output 控制台中文乱码问题 3. 驱动管理 本文章介绍如何通过Android Studio 2024最新版创建项目&#xff0c; 并成功输出Hello World。 本次教程版本…

关于QT中使用网络编程QtNetwork的问题

在此处添加network模块 在链接器中添加附加库目录(QT对应的lib)在链接器-输入中添加对应的lib库(Qt5Network.lib) 这样,就可以使用对应的下面的库文件了,比如: #include <qnetworkaccessmanager.h>

参数高效微调(PEFT)综述

人工智能咨询培训老师叶梓 转载标明出处 大模型如BERT和GPT-3的参数数量庞大&#xff0c;动辄数十亿甚至数千亿级别&#xff0c;给进一步的微调和应用带来了巨大的挑战。针对这一问题&#xff0c;Vladislav Lialin、Vijeta Deshpande、Anna Rumshisky等研究者中提出了一系列参…

Leetcode面试经典150题-69.X的平方根

相当简单的题目&#xff0c;但是出现的概率还挺高的 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int mySqrt(int x) {/**0的平方根是0 */if(x 0) {return 0;}/**1~3的平方根是1 */if(x < 3) {return 1;}/**其他情况我们采用二分查找&#xff…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…

Android Studio下载Gradle失败问题解决

问题说明 使用 Android Studio 构建程序报错如下 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.5.1-bin.zip. Reason: java.net.SocketTimeoutException: Connect timed out问题解决 下载对应版本的压缩包 gradle-7.5.1…

香橙派转换模型以及在开发板上部署

新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程&#xff0c;防止后面忘记。 使用的开发板&#xff1a;Orange Pi 5 Plus&#xff08;rk3588&#xff09; 官方的一些资料在&#xff08;主要参考用户手册&#xff09;&#xff1a;Orange Pi - Orangepihttp:/…

价格适中超微小间距P1.8全彩LED显示屏广泛应用于COB会议一体机

随着科技的不断进步与市场需求的日益多样化&#xff0c;价格适中且具备超微小间距P1.8技术的全彩LED显示屏&#xff0c;在COB&#xff08;Chip On Board&#xff09;会议一体机领域的应用正逐步深化&#xff0c;引领着现代会议展示的新风尚。这种显示屏不仅以其细腻的画质和卓越…

单片机DMA原理及应用详解(下篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获&#xff01; 关于DMA的原理&#xff0c;可以看上一篇文章&#xff1a; 单片机DMA原理及应用详解&#xff08;上篇&#xff09;&#xff08;附工程源码&#xff09;-CSDN博客 目录 一、STM32单片…

黑龙江IBM Storwize v3700存储故障维修

中国黑龙江省佳木斯IBM Storwize v3700存储控制器故障维修案例&#xff1a; 报修单位&#xff1a;黑龙江佳木斯某某医院 存储型号&#xff1a;联想或IBM v3700 存储故障&#xff1a;无法正常访问存储磁盘&#xff0c;无法进存储web管理界面&#xff0c;可以进存储服务助手界…

《C++ 中的左值与右值》

在 C 的世界里&#xff0c;左值和右值是两个重要的概念&#xff0c;理解它们对于掌握 C 语言的精髓至关重要。 首先&#xff0c;我们来认识左值。左值&#xff0c;即 “locator value”&#xff0c;可以理解为有明确存储位置且可以被取地址的表达式。简单来说&#xff0c;一个可…

Linux之MySQL主从复制

概述 MySQL的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据复制解决方案&#xff0c;将主数据库的DDL&#xff08;数据定义语言&#xff09;和DML&#xff08;数据操纵语言&#xff09;操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这…

自动驾驶ADAS算法--使用MATLBA和UE4生成测试视频

原文参考&#xff1a;金书世界 环境搭建参考&#xff1a;用MATLAB2020b和虚拟引擎&#xff08;Unreal Engine&#xff09;联合仿真输出AVM全景测试视频----Matlab环境搭建 matlab参考&#xff1a; https://ww2.mathworks.cn/help/driving/ug/simulate-a-simple-driving-sce…

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一&#xff1a;CS…

CAS概念、性质、优缺点 | 乐观锁、悲观锁是什么?

前言&#xff1a; 今天在深入了解HashMap时&#xff0c;看到这句话&#xff1a;“concurrentHashMap&#xff0c;在 JDK 1.7 中采用 分段锁的方式&#xff1b;JDK 1.8 中直接采用了CAS&#xff08;无锁算法&#xff09; synchronized。” 哦~~这个CAS好像之前接触过&#xff0c…

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

2024年测评7款最佳AI论文修改润色平台

在2024年&#xff0c;AI论文修改润色平台的测评和推荐成为学术界和研究者们关注的热点。本文将详细评测并推荐7款最佳AI论文修改润色平台&#xff0c;包括千笔-AIPassPaper&#xff0c;并结合我搜索到的资料进行分析。 一、千笔-AIPassPaper 千笔-AIPassPaper是一款集论文大纲…