Java操作Excel之POI劫扒、EasyExcel檬洞、Hutool

POI

Apache 公司發(fā)布的,可以使用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>

簡(jiǎn)單示例

  • 創(chuàng)建Excel
        //創(chuàng)建Excel文檔
        HSSFWorkbook workbook = new HSSFWorkbook();
        //創(chuàng)建sheet頁
        HSSFSheet firstSheet = workbook.createSheet("sheet1");
        //創(chuàng)建第一行 通常第一行作為 數(shù)據(jù)表頭
        HSSFRow row = firstSheet.createRow(0);
        //設(shè)置 第一行的列數(shù)據(jù)
        String [] titles = new String[]{"序號(hào)","姓名","性別"};
        for(int i=0; i<titles.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(titles[i]);
        }
        //插入1000條測(cè)試數(shù)據(jù)
        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("測(cè)試人員"+i);
            HSSFCell cell2 = rowData.createCell(2);
            cell2.setCellValue(i%2==0?"男":"女");
        }
        //創(chuàng)建文檔 寫入數(shù)據(jù)
        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 {
            //創(chuàng)建讀取 的工作簿
            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 行的數(shù)據(jù)
                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

阿里 對(duì)POI底層重寫添怔,能夠原本一個(gè)3M的excel用POI sax依然需要100M左右內(nèi)存降低到幾M,并且再大的excel不會(huì)出現(xiàn)內(nèi)存溢出贤旷。在上層做了模型轉(zhuǎn)換的封裝广料,讓使用者更加簡(jiǎn)單方便。

maven依賴

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

簡(jiǎn)單示例

  • 創(chuàng)建實(shí)體
@Data
public class People {
    @ExcelProperty("序號(hào)")
    private String number;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("性別")
    private String sex;
}
  • 創(chuàng)建Excel
        List<People> peoples = new ArrayList<>();
        for(int i=1;i<=1000;i++){
            People people = new People();
            people.setNumber(String.valueOf(i));
            people.setName("測(cè)試人員"+i);
            people.setSex(i%2==0?"男":"女");
            peoples.add(people);
        }
        String excelPath = "E://test.xlsx";
        /**
         * 1.創(chuàng)建Excel
         * 2.寫入數(shù)據(jù)
         * 3.自動(dòng)關(guān)閉流
         */
        EasyExcel.write(excelPath, People.class).sheet("sheet1").doWrite(peoples);
  • 讀取Excel
    1.創(chuàng)建監(jiān)聽類
public class PeopleListener extends AnalysisEventListener<People> {
    @Override
    public void invoke(People people, AnalysisContext analysisContext) {
        System.out.println(people.getNumber()+"||"+people.getName()+"||"+people.getSex());
    }

    /**
     * 所有數(shù)據(jù)解析完成了 調(diào)用
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("數(shù)據(jù)全部讀取完成幼驶!");
    }
}

2.讀取Excel

        String excelPath = "E://test.xlsx";
        /**
         * 1.指定路徑
         * 2.創(chuàng)建監(jiān)聽類 編寫處理邏輯
         * 3.自動(dòng)關(guān)閉流
         */
        EasyExcel.read(excelPath, People.class, new PeopleListener()).sheet(0).doRead();

更多Api詳見 https://www.yuque.com/easyexcel/doc/easyexcel

Hutool

Hutool是一個(gè)小而全的java工具類庫艾杏,有很多實(shí)用的工具類封裝,Excel相關(guān)操作就是其中的工具類盅藻。

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>

簡(jiǎn)單示例

  • 創(chuàng)建實(shí)體
@Data
public class People {
    private String number;
    private String name;
    private String sex;
}
  • 創(chuàng)建Excel
        List<People> peoples = new ArrayList<>();
        for(int i=1;i<=1000;i++){
            People people = new People();
            people.setNumber(String.valueOf(i));
            people.setName("測(cè)試人員"+i);
            people.setSex(i%2==0?"男":"女");
            peoples.add(people);
        }
        //獲取 Excel 寫入的操作類
        ExcelWriter excelWriter = ExcelUtil.getWriter();
        //設(shè)置表頭 與 實(shí)體類的 屬性綁定
        excelWriter.addHeaderAlias("number","序號(hào)");
        excelWriter.addHeaderAlias("name","姓名");
        excelWriter.addHeaderAlias("sex","性別");
        //寫入全部?jī)?nèi)容
        excelWriter.write(peoples,true);
        //創(chuàng)建文檔 寫入數(shù)據(jù)
        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列表购桑,默認(rèn)第一行為表頭,Map中的key為表頭值氏淑,value為標(biāo)題對(duì)應(yīng)的單元格值
        List<Map<String, Object>> peoples = reader.readAll();
        for (Map<String, Object> people:peoples){
            System.out.println(people.get("序號(hào)")+"||"+people.get("姓名")+"||"+people.get("性別"));
        }

小結(jié)

  • 如果操作Excel復(fù)雜度高勃蜘,建議使用POI,編程靈活假残。
  • 如果操作Excel數(shù)據(jù)量大缭贡,對(duì)性能有一定要求的情況,建議使用EasyExcel。
  • 如果操作Excel數(shù)據(jù)量小阳惹,而且追求編程效率谍失,建議使用Hutool的ExcelUtil。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莹汤,一起剝皮案震驚了整個(gè)濱河市快鱼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌体啰,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗽仪,死亡現(xiàn)場(chǎng)離奇詭異荒勇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闻坚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門沽翔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窿凤,你說我怎么就攤上這事仅偎。” “怎么了雳殊?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵橘沥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我夯秃,道長(zhǎng)座咆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任仓洼,我火速辦了婚禮介陶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘色建。我一直安慰自己哺呜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布箕戳。 她就那樣靜靜地躺著某残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陵吸。 梳的紋絲不亂的頭發(fā)上驾锰,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音走越,去河邊找鬼椭豫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赏酥。 我是一名探鬼主播喳整,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼裸扶!你這毒婦竟也來了框都?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤呵晨,失蹤者是張志新(化名)和其女友劉穎魏保,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸屠,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谓罗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了季二。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩咱。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胯舷,靈堂內(nèi)的尸體忽然破棺而出刻蚯,到底是詐尸還是另有隱情,我是刑警寧澤桑嘶,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布炊汹,位于F島的核電站,受9級(jí)特大地震影響逃顶,放射性物質(zhì)發(fā)生泄漏兵扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一口蝠、第九天 我趴在偏房一處隱蔽的房頂上張望器钟。 院中可真熱鬧,春花似錦妙蔗、人聲如沸傲霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昙啄。三九已至,卻和暖如春寸五,著一層夾襖步出監(jiān)牢的瞬間梳凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工梳杏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留韧拒,地道東北人淹接。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叛溢,于是被迫代替她去往敵國(guó)和親塑悼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Java操作excel 本筆記是在學(xué)習(xí)狂神說java的B站視頻記錄的楷掉。 兩個(gè)組件工具:POI和easyExcel ...
    Zeoytin閱讀 1,110評(píng)論 2 0
  • EasyExcel 1.簡(jiǎn)介 傳統(tǒng)Excel操作或者解析都是利用Apach POI進(jìn)行操作厢蒜,但是使用過這個(gè)框架的人...
    禿頭猿猿閱讀 64,415評(píng)論 11 72
  • Java導(dǎo)入導(dǎo)出Excel工具 easyexcel 做Java開發(fā)的同學(xué),尤其是做管理后臺(tái)的同學(xué)絕大多數(shù)都會(huì)接...
    朝雨憶輕塵閱讀 1,995評(píng)論 2 9
  • 久違的晴天烹植,家長(zhǎng)會(huì)斑鸦。 家長(zhǎng)大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了草雕。班主任說已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)巷屿。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,496評(píng)論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友促绵。感恩相遇攒庵!感恩不離不棄嘴纺。 中午開了第一次的黨會(huì)败晴,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評(píng)論 0 11