Java操作Excel之POI、EasyExcel、Hutool

POI

Apache 公司发布的,可以使用java语言操作Microsoft Office文件的开源Api。

maven依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.17</version>
        </dependency>

简单示例

  • 创建Excel
        //创建Excel文档
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建sheet页
        HSSFSheet firstSheet = workbook.createSheet("sheet1");
        //创建第一行 通常第一行作为 数据表头
        HSSFRow row = firstSheet.createRow(0);
        //设置 第一行的列数据
        String [] titles = new String[]{"序号","姓名","性别"};
        for(int i=0; i<titles.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(titles[i]);
        }
        //插入1000条测试数据
        for(int i=1; i<=1000; i++){
            HSSFRow rowData = firstSheet.createRow(i);
            HSSFCell cell0 = rowData.createCell(0);
            cell0.setCellValue(i);
            HSSFCell cell1 = rowData.createCell(1);
            cell1.setCellValue("测试人员"+i);
            HSSFCell cell2 = rowData.createCell(2);
            cell2.setCellValue(i%2==0?"男":"女");
        }
        //创建文档 写入数据
        String excelPath = "E://test.xlsx";
        try {
            FileOutputStream stream = new FileOutputStream(excelPath);
            workbook.write(stream);
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
  • 读取Excel
        //读取文档的 地址
        String excelPath = "E://test.xlsx";
        InputStream inputStream = null;
        try {
            //创建读取 的工作簿
            inputStream = new FileInputStream(excelPath);
            POIFSFileSystem fs = new POIFSFileSystem(inputStream);
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            //获取要读取的sheet页
            HSSFSheet sheet0 = workbook.getSheetAt(0);
            //遍历sheet行 从第一行度取
            for(int rowNum = 1; rowNum <= sheet0.getLastRowNum() ; rowNum++){
                HSSFRow row = sheet0.getRow(rowNum);
                //打印第 rowNum 行的数据
                for(int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++){
                    System.out.print(row.getCell(cellNum)+"||");
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

EasyExcel

阿里 对POI底层重写,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出。在上层做了模型转换的封装,让使用者更加简单方便。

maven依赖

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

简单示例

  • 创建实体
@Data
public class People {
    @ExcelProperty("序号")
    private String number;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("性别")
    private String sex;
}
  • 创建Excel
        List<People> peoples = new ArrayList<>();
        for(int i=1;i<=1000;i++){
            People people = new People();
            people.setNumber(String.valueOf(i));
            people.setName("测试人员"+i);
            people.setSex(i%2==0?"男":"女");
            peoples.add(people);
        }
        String excelPath = "E://test.xlsx";
        /**
         * 1.创建Excel
         * 2.写入数据
         * 3.自动关闭流
         */
        EasyExcel.write(excelPath, People.class).sheet("sheet1").doWrite(peoples);
  • 读取Excel
    1.创建监听类
public class PeopleListener extends AnalysisEventListener<People> {
    @Override
    public void invoke(People people, AnalysisContext analysisContext) {
        System.out.println(people.getNumber()+"||"+people.getName()+"||"+people.getSex());
    }

    /**
     * 所有数据解析完成了 调用
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("数据全部读取完成!");
    }
}

2.读取Excel

        String excelPath = "E://test.xlsx";
        /**
         * 1.指定路径
         * 2.创建监听类 编写处理逻辑
         * 3.自动关闭流
         */
        EasyExcel.read(excelPath, People.class, new PeopleListener()).sheet(0).doRead();

更多Api详见 https://www.yuque.com/easyexcel/doc/easyexcel

Hutool

Hutool是一个小而全的java工具类库,有很多实用的工具类封装,Excel相关操作就是其中的工具类。

maven依赖

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.17</version>
        </dependency>

简单示例

  • 创建实体
@Data
public class People {
    private String number;
    private String name;
    private String sex;
}
  • 创建Excel
        List<People> peoples = new ArrayList<>();
        for(int i=1;i<=1000;i++){
            People people = new People();
            people.setNumber(String.valueOf(i));
            people.setName("测试人员"+i);
            people.setSex(i%2==0?"男":"女");
            peoples.add(people);
        }
        //获取 Excel 写入的操作类
        ExcelWriter excelWriter = ExcelUtil.getWriter();
        //设置表头 与 实体类的 属性绑定
        excelWriter.addHeaderAlias("number","序号");
        excelWriter.addHeaderAlias("name","姓名");
        excelWriter.addHeaderAlias("sex","性别");
        //写入全部内容
        excelWriter.write(peoples,true);
        //创建文档 写入数据
        String excelPath = "E://test.xlsx";
        try {
            FileOutputStream stream = new FileOutputStream(excelPath);
            excelWriter.flush(stream,true);
            excelWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
  • 读取Excel
        String excelPath = "E://test.xlsx";
        ExcelReader reader = ExcelUtil.getReader(excelPath);
        //读取为Map列表,默认第一行为表头,Map中的key为表头值,value为标题对应的单元格值
        List<Map<String, Object>> peoples = reader.readAll();
        for (Map<String, Object> people:peoples){
            System.out.println(people.get("序号")+"||"+people.get("姓名")+"||"+people.get("性别"));
        }

小结

  • 如果操作Excel复杂度高,建议使用POI,编程灵活。
  • 如果操作Excel数据量大,对性能有一定要求的情况,建议使用EasyExcel。
  • 如果操作Excel数据量小,而且追求编程效率,建议使用Hutool的ExcelUtil。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Java操作excel 本笔记是在学习狂神说java的B站视频记录的。 两个组件工具:POI和easyExcel ...
    Zeoytin阅读 1,099评论 2 0
  • EasyExcel 1.简介 传统Excel操作或者解析都是利用Apach POI进行操作,但是使用过这个框架的人...
    秃头猿猿阅读 64,294评论 11 72
  • Java导入导出Excel工具 easyexcel 做Java开发的同学,尤其是做管理后台的同学绝大多数都会接...
    朝雨忆轻尘阅读 1,990评论 2 9
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,458评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,543评论 0 11