ExayExcel 阿里出品的ExayExcel

2023-10-28

1.首先引入依赖

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>1.1.2-beta5</version>
		</dependency>

2.创建ExcelModelListener

public class ExcelModelListener<T extends BaseRowModel> extends AnalysisEventListener<T> {
    private final List<T> rows = new ArrayList<>();

    @Override
    public void invoke(T object, AnalysisContext context) {
        rows.add(object);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println(rows.size());
    }

    public List<T> getRows() {
        return rows;
    }
}

3. 创建个util工具类,写一些公共方法

public class EsayExcelUtils {

    /**
     * 从Excel中读取文件,读取的文件是一个DTO类,该类必须继承BaseRowModel
     * 具体实例参考 : OperationLog.java
     * 参考:https://github.com/alibaba/easyexcel
     */
    public static <T extends BaseRowModel> List<T> readExcel(final InputStream inputStream, final Class<? extends BaseRowModel> clazz) {
        if (null == inputStream) {
            throw new NullPointerException("the inputStream is null!");
        }
        ExcelModelListener<T> listener = new ExcelModelListener<>();
        // 这里因为EasyExcel-1.1.1版本的bug,所以需要选用下面这个标记已经过期的版本
        ExcelReader reader = new ExcelReader(inputStream,  valueOf(inputStream), null, listener);
        reader.read(new Sheet(1, 1, clazz));

        return listener.getRows();
    }


    public static void writeExcel(final File file, List<? extends BaseRowModel> list,ExcelTypeEnum fileType) {
        try (OutputStream out = new FileOutputStream(file)) {
            ExcelWriter writer = new ExcelWriter(out, fileType);
            //写第一个sheet,  有模型映射关系
            Class<? extends BaseRowModel> t = list.get(0).getClass();
            Sheet sheet = new Sheet(1, 0, t);
            writer.write(list, sheet);
            writer.finish();
        } catch (IOException e) {
            System.out.println(file.getName()+e);
        }
    }


    /**
     * 根据输入流,判断为xls还是xlsx,该方法原本存在于easyexcel 1.1.0 的ExcelTypeEnum中。
     */
    public static ExcelTypeEnum valueOf(InputStream inputStream) {
        try {
            FileMagic fileMagic = FileMagic.valueOf(inputStream);
            if (FileMagic.OLE2.equals(fileMagic)) {
                return ExcelTypeEnum.XLS;
            }
            if (FileMagic.OOXML.equals(fileMagic)) {
                return ExcelTypeEnum.XLSX;
            }
            throw new IllegalArgumentException("excelTypeEnum can not null");

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

4.新增实体类,记得要getset方法

public class ExcelBean extends BaseRowModel {

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

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

    @ExcelProperty(value = "E-mail",index = 2)
    private String email;

    public ExcelBean(String name, String age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

4.写个方法试一下

public static void main(String[] args) throws FileNotFoundException {
        //File file = new File("C:\\Users\\123\\Desktop\\新建XLSX工作表.xlsx");
        //InputStream fs = new FileInputStream(file);
        //读取
        //List<BaseRowModel> baseRowModels = EsayExcelUtils.readExcel(fs, ExcelBean.class);
        //写入
        List<ExcelBean> baseRowModels = new ArrayList<ExcelBean>();
        ExcelBean excelBean1 = new ExcelBean("老黑","82","lao_hei@163.com");
        ExcelBean excelBean2 = new ExcelBean("小黑","16","xiao_hei@163.com");
        baseRowModels.add(excelBean1);
        baseRowModels.add(excelBean2);
        EsayExcelUtils.writeExcel(new File("E:\\新建.xlsx"),baseRowModels, ExcelTypeEnum.XLSX);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ExayExcel 阿里出品的ExayExcel 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • Flutter 版本更新 和 dart SDK版本跟新

    The current Dart SDK version is 2 19 5 Because pivot chat requires SDK version gt 3 0 0 lt 4 0 0 version solving failed
  • 基于 RxJs 的前端数据层实践

    近来前端社区有越来越多的人开始关注前端数据层的设计 DaoCloud 也遇到了这方面的问题 我们调研了很多种解决方案 最终采用 RxJs 来设计一套数据层 这一想法并非我们的首创 社区里已有很多前辈 大牛分享过关于用 RxJs 设计数据层的
  • 通过C实现sqlite3操作,(增删改查),导入电子词典

    一 插入 include
  • Tesseract-OCR下载和安装

    Y26 Tesseract 一款由HP实验室开发由Google维护的开源OCR Optical Character Recognition 光学字符识别 引擎 与Microsoft Office Document Imaging MODI
  • uni-app从入门到上天视频教程 23讲 我终于卷完了

    大家好 我是锋哥 祝大家新年快乐 过年走亲访友 休息了几天 今天把uni app课程卷完了 23讲 免费基础课程 uni app技术介绍 uni app 是一个使用 Vue js 开发所有前端应用的框架 开发者编写一套代码 可发布到iOS
  • STM32之舵机转动————寄存器版

    以STM32F407VGT6单片机为例 控制舵机转动的角度0 180 include pwm h 函数名 tim3 ch4 pwm 函数功能 舵机配置 返回值 void 形参 void 函数说明 红色线 5V 棕色线 GND 橘色线 PB1
  • java.lang.manament API 简介

    java lang management 包提供管理接口用于监控以及管理 JVM 以及 Java 运行时的其他组件 我们开发的 JVM Agent 就是通过这个包提供的接口 收集到 JVM 中包括内存 GC 线程在内的信息 java lan
  • 《JAVA核心知识》学习笔记(JVM)-1

    JVM 1 基本概念 JVM 是可运行 Java 代码的假想计算机 包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 堆 和 一个存储方法域 JVM 是运行在操作系统之上的 它与硬件没有直接 的交互 Hotspot JVM 后台运行的
  • Android 实现ListView 文字+ 图片

    1 ListView item 布局
  • 用Go实现的简易TCP通信框架

    接触到GO之后 GO的网络支持非常令人喜欢 GO实现了在语法层面上可以保持同步语义 但是却又没有牺牲太多性能 底层一样使用了IO路径复用 比如在LINUX下用了EPOLL 在WINDOWS下用了IOCP 但是在开发服务端程序的时候 很多都是
  • 何为 递归 ?

    递归 递 归 的操作 将大问题化解成小问题的过程 为什么可以化解 是因为大问题的处理方式和小问题的处理方式是一样的 1 要调用自己本身 2 要有一个趋于终止的条件 下面以一个求阶乘的例子简单介绍一下 public class recursi
  • Python基础入门—while循环

    Python基础入门 while循环 while循环 while控制语句 例题1 例题2 例题3 例题4 while循环 语法格式 while 条件 执行语句1 执行语句2 适用条件 无限循环 死循环 while True print 条件
  • 1.10.0版本下tensorflow与matplotlib不兼容问题解决

    1 10 0版本tensorflow默认下载numpy 1 14 5 最新版matplotlib要求numpy版本高于1 15 解决办法 先建虚拟环境 下载1 15或更高版本numpy 再安装2 2或2 3版本的matplotlib 最后安
  • 依赖Linux内核源码编译模块报错arch_hweight.h:54:42: error: expected ‘:’ or ‘)’ before ‘POPCNT64

    问题描述 想要编译一个模块 单独加载到开发板上 一次需要依赖开发板的Linux内核源码进行编译这个模块 编译模块的Makefile如下 home beal wu norflash kernel是开发板使用的内核源码路径 执行make之后报错
  • Zookeeper闪退、报错JAVA_HOME is not set 解决方法

    打开服务端闪退 编辑打开zkServer cmd 在末尾添加 pause 查看报错原因 这里的报错原因是JAVA HOME is not set 没有设置JAVA HOME 这里我们可以看到zkService 启动的时候 加载zkEvn文件
  • mac浏览器没有网络,通讯软件(QQ、微信、飞书等)正常

    网上的方法 1 在网络dns里加 114 114 114 114 或者8 8 8 8 我自己试的是没有解决问题 2 关闭网络代理中的一些勾选 我电脑里本来就没有勾选 3 重置DNS 可能是mac版本不同 提示discoveryutil未找到
  • 企业数字化转型之道:3L8P转型模型

    作者 韩磊 摘要 数字化转型的本质是 在 数据 算法 定义的世界中 以数据服务的流动 化解复杂系统的不确定性 优化资源配置效率 企业数字化转型的本质则是以需求为中心 以数据为资产 以技术为手段 以人才为依托 快速构建能满足客户需求的 支持业
  • Java IO流

    1File类 java io File类 文件和文件目录路径的抽象表示形式 与平台无关 File 能新建 删除 重命名文件和目录 但 File不能访问文件内容本身 如果需要访问文件内容本身 则需要使用输入 输出流 想要在Java程序中表示一
  • 微信小程序之数据的同步渲染

    微信小程序之数据的同步渲染 结论 微信小程序通过setData方法实现数据的同步渲染 直接修改data无法实现同步渲染 setData工作原理 小程序分为逻辑层和渲染层 而每次逻辑层改变了 要借用Native运行 小程序的渲染层和逻辑层由两
  • ExayExcel 阿里出品的ExayExcel

    1 首先引入依赖