Java应用EasyExcel工具类

一、前言

关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象。好处嘛,我认为流程上更加清晰即易懂、可读性更好,坏处的话,则是操作上没有原生的方式那么灵活。

二、导入

  • StudentVo为实体类, 注意实体中的各个属性要和excel按顺序一 一对应,建议都用String类型,真正插入时,才去做转换
  • ImportExcelListener 类为真正处理数据的类
  • CommonService 只是一个Spring的service bean,用来执行curd操作
 private CommonService commonService;
    public void importExcel(MultipartFile file) throws IOException {
    // HEAD_ROW_NUMBER为Excel中的头部行数, 这里的关于ImportExcelListener的构造方法中HEAD_ROW_NUMBER参数可以根据需要决定传或者不传
        EasyExcel.read(file.getInputStream(), StudentVo.class, new ImportExcelListener<StudentVo>(HEAD_ROW_NUMBER, commonService)).sheet().headRowNumber(HEAD_ROW_NUMBER).doRead();
    }

ImportExcelListener 类如下,这里根据实际需要,可以不用泛型。

public class ImportExcelListener<T> extends AnalysisEventListener<T> {
        /**
         * 每隔BATCH_COUNT条存储数据库 然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 500;
        private int headRowNum;
        private CommonService commonService;
        private List<T> list = new ArrayList<>();

        public ImportExcelListener(int headRowNumber, CommonService commonService) {
            this.headRowNum = headRowNumber;
            this.commonService = commonService;
        }

        /**
         * 这个每一条数据解析都会来调用
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
            // 这里也可以将data转为对应实体, 然后做一些参数校验
            Integer rowNum = context.readRowHolder().getRowIndex();
           log.info("当前解析的数据为第{}行", rowNum);

            list.add(data);
            // 批量保存, 防止一次性数据过多, 内存溢出
            if (list.size() >= BATCH_COUNT) {
                // 保存
                commonService.save(list);
                list.clear();
            }
        }

        // 在解析之后, 也要记得再判断是否为空, 不为空要保存一下
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            if (CollectionUtils.isEmpty(list)) {
                return;
            }
            commonService.save(list);
            list.clear();
        }
    }

如果对导入的数据没啥特别处要求且数据量也不多,也可以直接采用如下这种方式:

List<Object> data = null;
        try {
            data = EasyExcelFactory.read(file.getInputStream()).sheet().doReadSync();
        } catch (IOException e) {
            log.error("读取失败", e);
            throw new BusinessException("读取失败");
        }
        // 保存操作
        // ...

三、导出

  • 无需映射实体对象, 实际运用中查出来数据后, 需要自己去遍历组装成List<List<?>>的二维类型,表示第几行第几列。
public void test() throws FileNotFoundException {
        File file = new File("E:\\work-grandview\\测试.xlsx");
        // 创建writerBuilder对象,自动调整列宽
        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .autoCloseStream(Boolean.TRUE)
                .build();

        //  List<List<?>>类型, 二维数据, 表示第几行第几列, 设置表头内容
        List<List<String>> titleList = new ArrayList<>();
        titleList.add(Arrays.asList("名称", "key", "value"));
        int sheetNum = 0;
        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNum,"导出数据").build();
        excelWriter.write(titleList, writeSheet);

        // 生成导出内容;
        List<List<Object>> content = new ArrayList<>();
        // 10行3列
        for (int i = 0; i < 10; i++) {
            List<Object> dataList = new ArrayList<>();
            for (int j = 0; j < 3; j++) {
                dataList.add(j);
            }
            content.add(dataList);
        }

        // 写入文件
        excelWriter.write(content, writeSheet);
        // 关闭文件流
        excelWriter.finish();
    }

  • 通过EasyExcel提供的注解,将实体映射到对应列中:
@Data
 public class VO {
        @ExcelProperty(value = "姓名", index = 0)
        int name;
        @ExcelProperty(value = "key", index = 1)
        int key;
        @ExcelProperty(value = "value", index = 2)
        int value;
    }

@Test
    public void test() throws FileNotFoundException {
        File file = new File("E:\\work-grandview\\测试.xlsx");
        // 创建writerBuilder对象,自动调整列宽
        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .autoCloseStream(Boolean.TRUE)
                .build();

        // 生成导出内容;
        List<VO> content = new ArrayList<>();
        // 10行3列
        for (int i = 0; i < 10; i++) {
            VO vo = new VO();
            vo.setKey(i);
            vo.setName(i);
            vo.setValue(i);
           content.add(vo);
        }
		// 创建sheet, 设置0号表, 实际运用中可能得创建多张, 可以遍历数据, 每满足n条就创建i号sheet表
        WriteSheet writeSheet = EasyExcel.writerSheet(0,"导出数据").build();
        // 设置表头
        writeSheet.setClazz(content.get(0).getClass());
        // 写入文件
        excelWriter.write(content, writeSheet);
        excelWriter.finish();

    }

一开始创建后,莫名奇妙多了个this0 列 , 后 来 想 了 想 , 原 来 我 的 实 体 类 是 T e s t 类 的 内 部 类 来 着 , 而 ‘ c o n t e n t . g e t ( 0 ) . g e t C l a s s ( ) ‘ 拿 到 的 是 一 个 代 理 类 T e s t 0列,在设置表头时,同时被处理为属性值了。在将VO类写到外部后解决。

到此这篇关于Java应用EasyExcel工具类的文章就介绍到这了,更多相关Java EasyExcel工具类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

    一.读Excel 1.Excel表格示例 2.对象示例 @Data public class DemoData { private String string; private Date date; private Double doubleData; } 3.监听器(重点部分) // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 public class DemoDataListener e

  • 深入浅析Java常用的格式化Json工具类

    扩展:Java常用工具类汇总 前置条件 导入以下 jar 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> <dependency> <groupId>org.apache.commons</g

  • 教你如何使用Java多线程编程LockSupport工具类

    LockSupport类 用于创建锁和其他同步类的基本线程阻塞原语,此类与使用它的每个线程关联一个许可.如果获得许可,将立即返回对park的调用,并在此过程中消耗掉它:否则may会被阻止.调用unpark可使许可证可用(如果尚不可用).(不过与信号量不同,许可证不会累积.最多只能有一个.) 方法park和unpark提供了有效的阻塞和解阻塞线程的方法,这些线程不会遇到导致已弃用的方法Thread.suspend和Thread.resume无法用于以下问题:由于许可,在调用park的一个线程与试图

  • 浅谈java如何生成分享海报工具类

    # 前言 例如:生成分享海报,比如注册扫二维码登录.分享商品海报等!本博文是基于springboot工程得! 一.使用步骤 1.导入pom依赖和上传图片到工程 代码如下(示例):在自己得通用工具类模块中导入坐标!(这需要根据自己得工程来) <!--谷歌图片压缩--> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> &l

  • Java服务器主机信息监控工具类的示例代码

    对接前端后效果展示如图: 1.CPU相关信息实体类 /** * CPU相关信息 * * @author csp */ public class Cpu { /** * 核心数 */ private int cpuNum; /** * CPU总的使用率 */ private double total; /** * CPU系统使用率 */ private double sys; /** * CPU用户使用率 */ private double used; /** * CPU当前等待率 */ priv

  • Java基础之颜色工具类(超详细注释)

    颜色工具类(超详细注释) 设置属性值自动格式化rgb值和十六进制颜色值. import java.util.HashMap; import java.util.Map; public class Color{ private final String[] hex_letters = {"0", "1", "2", "3", "4", "5", "6", "7

  • Java8优雅的字符串拼接工具类StringJoiner实例代码

    StringJoiner是Java8新出的用于处理字符串拼接的工具类,可以让你的代码看起来更优雅,不拉跨. 假设现在遍历一个字符串集合,需求是每个元素按照 "." 分开. String a = "w", b = "d", c = "n", d = "m", e = "d"; List<String> list = new ArrayList<>(); list.a

  • Java使用easyExcel导出excel数据案例

    easyExcel简介: Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc. easyExcel是阿里巴巴开源的一个excel处理框架,以使用简单.节省内存著称. easyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理 easyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据

  • java中封装JDBC工具类的实例分析

    对于能够重复使用的代码,我们最好的方法是对它们进行封装,然后在下次使用的使用就可以直接调用了.本篇所要提到的是JDBC工具类,相信大家在学习java时都接触过.那么对于封装它的方法,本篇先对工具类进行简单的说明,列出有关的封装步骤,然后带来相关的实例. 1.说明 在java开发过程中,代码中时常用到一些Scanner.Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类. 2.步骤 封装JDBC工具类 加入获取数据库连接对象的方法 加入释放连接的方法 3

  • Java JDBC自定义封装工具类的步骤和完整代码

    封装JDBC工具类的作用可以优化代码,提高开发效率 步骤 ① 创建配置文件(config.properties),用于存放注册驱动和连接数据库时所需要的参数值 ② 自定义一个类(JDBCUtils.java) ③ 实现构造私有方法 private JDBCUtils(){} ④ 声明所需要的配置变量 private static String driverClass; private static String url; private static String username; priva

  • Java常用工具类库——Hutool的使用简介

    前言 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以"甜甜的". Hutool 中的工具方法来自于每个用户的精雕细琢,它涵盖了 Java 开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当: Hutool 是项目中"util"包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专

随机推荐