1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        史上最全的Excel導(dǎo)入導(dǎo)出之easyexcel

        共 2220字,需瀏覽 5分鐘

         ·

        2021-10-13 23:44

        喝水不忘挖井人,感謝阿里巴巴項(xiàng)目組提供了easyexcel工具類,github地址:https://github.com/alibaba/easyexcel


        環(huán)境搭建

        • easyexcel 依賴(必須)
        • springboot (不是必須)

        • lombok (不是必須)

        ?
        ???com.alibaba
        ???easyexcel
        ???1.1.2-beat1
        ?

        ??
        ?
        ???org.projectlombok
        ???lombok
        ???1.18.2
        ?


        讀取excel文件

        小于1000行數(shù)據(jù)

        默認(rèn)讀取

        讀取Sheet1的全部數(shù)據(jù)

        ?String?filePath?=?"/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        ?List?objects?=?ExcelUtil.readLessThan1000Row(filePath);

        指定讀取

        下面是學(xué)生表.xlsx中Sheet1,Sheet2的數(shù)據(jù)


        獲取Sheet1表頭以下的信息

        String?filePath?=?"/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        //第一個(gè)1代表sheet1,?第二個(gè)1代表從第幾行開始讀取數(shù)據(jù),行號最小值為0
        Sheet?sheet?=?new?Sheet(1,?1);
        List?objects?=?ExcelUtil.readLessThan1000Row(filePath,sheet);

        獲取Sheet2的所有信息

        ?String?filePath?=?"/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        ?Sheet?sheet?=?new?Sheet(2,?0);
        ?List?objects?=?ExcelUtil.readLessThan1000Row(filePath,sheet);

        大于1000行數(shù)據(jù)

        默認(rèn)讀取

        String?filePath?=?"/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        List?objects?=?ExcelUtil.readMoreThan1000Row(filePath);

        指定讀取

        String?filePath?=?"/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        Sheet?sheet?=?new?Sheet(1,?2);
        List?objects?=?ExcelUtil.readMoreThan1000Row(filePath,sheet);

        導(dǎo)出excle

        單個(gè)Sheet導(dǎo)出

        無模型映射導(dǎo)出

        String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        List>?data?=?new?ArrayList<>();
        data.add(Arrays.asList("111","222","333"));
        data.add(Arrays.asList("111","222","333"));
        data.add(Arrays.asList("111","222","333"));
        List?head?=?Arrays.asList("表頭1",?"表頭2",?"表頭3");
        ExcelUtil.writeBySimple(filePath,data,head);

        結(jié)果

        模型映射導(dǎo)出

        1、定義好模型對象

        package?com.springboot.utils.excel.test;

        import?com.alibaba.excel.annotation.ExcelProperty;
        import?com.alibaba.excel.metadata.BaseRowModel;
        import?lombok.Data;
        import?lombok.EqualsAndHashCode;

        /**
        ?*?@description:
        ?*?@author:?chenmingjian
        ?*?@date:?19-4-3?14:44
        ?*/
        @EqualsAndHashCode(callSuper?=?true)
        @Data
        public?class?TableHeaderExcelProperty?extends?BaseRowModel?{

        ????/**
        ?????*?value:?表頭名稱
        ?????*?index:?列的號,?0表示第一列
        ?????*/
        ????@ExcelProperty(value?=?"姓名",?index?=?0)
        ????private?String?name;

        ????@ExcelProperty(value?=?"年齡",index?=?1)
        ????private?int?age;

        ????@ExcelProperty(value?=?"學(xué)校",index?=?2)
        ????private?String?school;
        }


        2、調(diào)用方法

        String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ArrayList?data?=?new?ArrayList<>();
        ??for(int?i?=?0;?i???????TableHeaderExcelProperty?tableHeaderExcelProperty?=?new?TableHeaderExcelProperty();
        ??????tableHeaderExcelProperty.setName("cmj"?+?i);
        ??????tableHeaderExcelProperty.setAge(22?+?i);
        ??????tableHeaderExcelProperty.setSchool("清華大學(xué)"?+?i);
        ??????data.add(tableHeaderExcelProperty);
        ??}

        ??ExcelUtil.writeWithTemplate(filePath,data);

        多個(gè)Sheet導(dǎo)出

        1、定義好模型對象

        package?com.springboot.utils.excel.test;

        import?com.alibaba.excel.annotation.ExcelProperty;
        import?com.alibaba.excel.metadata.BaseRowModel;
        import?lombok.Data;
        import?lombok.EqualsAndHashCode;

        /**
        ?*?@description:
        ?*?@author:?chenmingjian
        ?*?@date:?19-4-3?14:44
        ?*/
        @EqualsAndHashCode(callSuper?=?true)
        @Data
        public?class?TableHeaderExcelProperty?extends?BaseRowModel?{

        ????/**
        ?????*?value:?表頭名稱
        ?????*?index:?列的號,?0表示第一列
        ?????*/
        ????@ExcelProperty(value?=?"姓名",?index?=?0)
        ????private?String?name;

        ????@ExcelProperty(value?=?"年齡",index?=?1)
        ????private?int?age;

        ????@ExcelProperty(value?=?"學(xué)校",index?=?2)
        ????private?String?school;
        }


        2、調(diào)用方法

        ?ArrayList?list1?=?new?ArrayList<>();
        ?for(int?j?=?1;?j???????ArrayList?list?=?new?ArrayList<>();
        ??????for(int?i?=?0;?i???????????TableHeaderExcelProperty?tableHeaderExcelProperty?=?new?TableHeaderExcelProperty();
        ??????????tableHeaderExcelProperty.setName("cmj"?+?i);
        ??????????tableHeaderExcelProperty.setAge(22?+?i);
        ??????????tableHeaderExcelProperty.setSchool("清華大學(xué)"?+?i);
        ??????????list.add(tableHeaderExcelProperty);
        ??????}

        ??????Sheet?sheet?=?new?Sheet(j,?0);
        ??????sheet.setSheetName("sheet"?+?j);

        ??????ExcelUtil.MultipleSheelPropety?multipleSheelPropety?=?new?ExcelUtil.MultipleSheelPropety();
        ??????multipleSheelPropety.setData(list);
        ??????multipleSheelPropety.setSheet(sheet);

        ??????list1.add(multipleSheelPropety);

        ??}

        ??ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

        工具類

        package?com.springboot.utils.excel;

        import?com.alibaba.excel.EasyExcelFactory;
        import?com.alibaba.excel.ExcelWriter;
        import?com.alibaba.excel.context.AnalysisContext;
        import?com.alibaba.excel.event.AnalysisEventListener;
        import?com.alibaba.excel.metadata.BaseRowModel;
        import?com.alibaba.excel.metadata.Sheet;
        import?lombok.Data;
        import?lombok.Getter;
        import?lombok.Setter;
        import?lombok.extern.slf4j.Slf4j;
        import?org.springframework.util.CollectionUtils;
        import?org.springframework.util.StringUtils;

        import?java.io.*;
        import?java.util.ArrayList;
        import?java.util.Collections;
        import?java.util.List;

        /**
        ?*?@description:
        ?*?@author:?chenmingjian
        ?*?@date:?19-3-18?16:16
        ?*/
        @Slf4j
        public?class?ExcelUtil?{

        ???private?static?Sheet?initSheet;

        ???static?{
        ??????initSheet?=?new?Sheet(1,?0);
        ??????initSheet.setSheetName("sheet");
        ??????//設(shè)置自適應(yīng)寬度
        ??????initSheet.setAutoWidth(Boolean.TRUE);
        ???}

        ???/**
        ????*?讀取少于1000行數(shù)據(jù)
        ????*?@param?filePath?文件絕對路徑
        ????*?@return
        ????*/
        ???public?static?List?readLessThan1000Row(String?filePath){
        ??????return?readLessThan1000RowBySheet(filePath,null);
        ???}

        ???/**
        ????*?讀小于1000行數(shù)據(jù),?帶樣式
        ????*?filePath?文件絕對路徑
        ????*?initSheet?:
        ????*??????sheetNo:?sheet頁碼,默認(rèn)為1
        ????*??????headLineMun:?從第幾行開始讀取數(shù)據(jù),默認(rèn)為0,?表示從第一行開始讀取
        ????*??????clazz:?返回?cái)?shù)據(jù)List?中Object的類名
        ????*/
        ???public?static?List?readLessThan1000RowBySheet(String?filePath,?Sheet?sheet){
        ??????if(!StringUtils.hasText(filePath)){
        ?????????return?null;
        ??????}

        ??????sheet?=?sheet?!=?null???sheet?:?initSheet;

        ??????InputStream?fileStream?=?null;
        ??????try?{
        ?????????fileStream?=?new?FileInputStream(filePath);
        ?????????return?EasyExcelFactory.read(fileStream,?sheet);
        ??????}?catch?(FileNotFoundException?e)?{
        ?????????log.info("找不到文件或文件路徑錯(cuò)誤,?文件:{}",?filePath);
        ??????}finally?{
        ?????????try?{
        ????????????if(fileStream?!=?null){
        ???????????????fileStream.close();
        ????????????}
        ?????????}?catch?(IOException?e)?{
        ????????????log.info("excel文件讀取失敗,?失敗原因:{}",?e);
        ?????????}
        ??????}
        ??????return?null;
        ???}

        ???/**
        ????*?讀大于1000行數(shù)據(jù)
        ????*?@param?filePath?文件覺得路徑
        ????*?@return
        ????*/
        ???public?static?List?readMoreThan1000Row(String?filePath){
        ??????return?readMoreThan1000RowBySheet(filePath,null);
        ???}

        ???/**
        ????*?讀大于1000行數(shù)據(jù),?帶樣式
        ????*?@param?filePath?文件覺得路徑
        ????*?@return
        ????*/
        ???public?static?List?readMoreThan1000RowBySheet(String?filePath,?Sheet?sheet){
        ??????if(!StringUtils.hasText(filePath)){
        ?????????return?null;
        ??????}

        ??????sheet?=?sheet?!=?null???sheet?:?initSheet;

        ??????InputStream?fileStream?=?null;
        ??????try?{
        ?????????fileStream?=?new?FileInputStream(filePath);
        ?????????ExcelListener?excelListener?=?new?ExcelListener();
        ?????????EasyExcelFactory.readBySax(fileStream,?sheet,?excelListener);
        ?????????return?excelListener.getDatas();
        ??????}?catch?(FileNotFoundException?e)?{
        ?????????log.error("找不到文件或文件路徑錯(cuò)誤,?文件:{}",?filePath);
        ??????}finally?{
        ?????????try?{
        ????????????if(fileStream?!=?null){
        ???????????????fileStream.close();
        ????????????}
        ?????????}?catch?(IOException?e)?{
        ????????????log.error("excel文件讀取失敗,?失敗原因:{}",?e);
        ?????????}
        ??????}
        ??????return?null;
        ???}

        ???/**
        ????*?生成excle
        ????*?@param?filePath??絕對路徑,?如:/home/chenmingjian/Downloads/aaa.xlsx
        ????*?@param?data?數(shù)據(jù)源
        ????*?@param?head?表頭
        ????*/
        ???public?static?void?writeBySimple(String?filePath,?List>?data,?List?head){
        ??????writeSimpleBySheet(filePath,data,head,null);
        ???}

        ???/**
        ????*?生成excle
        ????*?@param?filePath?絕對路徑,?如:/home/chenmingjian/Downloads/aaa.xlsx
        ????*?@param?data?數(shù)據(jù)源
        ????*?@param?sheet?excle頁面樣式
        ????*?@param?head?表頭
        ????*/
        ???public?static?void?writeSimpleBySheet(String?filePath,?List>?data,?List?head,?Sheet?sheet){
        ??????sheet?=?(sheet?!=?null)???sheet?:?initSheet;

        ??????if(head?!=?null){
        ?????????List>?list?=?new?ArrayList<>();
        ?????????head.forEach(h?->?list.add(Collections.singletonList(h)));
        ?????????sheet.setHead(list);
        ??????}

        ??????OutputStream?outputStream?=?null;
        ??????ExcelWriter?writer?=?null;
        ??????try?{
        ?????????outputStream?=?new?FileOutputStream(filePath);
        ?????????writer?=?EasyExcelFactory.getWriter(outputStream);
        ?????????writer.write1(data,sheet);
        ??????}?catch?(FileNotFoundException?e)?{
        ?????????log.error("找不到文件或文件路徑錯(cuò)誤,?文件:{}",?filePath);
        ??????}finally?{
        ?????????try?{
        ????????????if(writer?!=?null){
        ???????????????writer.finish();
        ????????????}

        ????????????if(outputStream?!=?null){
        ???????????????outputStream.close();
        ????????????}

        ?????????}?catch?(IOException?e)?{
        ????????????log.error("excel文件導(dǎo)出失敗,?失敗原因:{}",?e);
        ?????????}
        ??????}

        ???}

        ???/**
        ????*?生成excle
        ????*?@param?filePath?絕對路徑,?如:/home/chenmingjian/Downloads/aaa.xlsx
        ????*?@param?data?數(shù)據(jù)源
        ????*/
        ???public?static?void?writeWithTemplate(String?filePath,?List?data){
        ??????writeWithTemplateAndSheet(filePath,data,null);
        ???}

        ???/**
        ????*?生成excle
        ????*?@param?filePath?絕對路徑,?如:/home/chenmingjian/Downloads/aaa.xlsx
        ????*?@param?data?數(shù)據(jù)源
        ????*?@param?sheet?excle頁面樣式
        ????*/
        ???public?static?void?writeWithTemplateAndSheet(String?filePath,?List?data,?Sheet?sheet){
        ??????if(CollectionUtils.isEmpty(data)){
        ?????????return;
        ??????}

        ??????sheet?=?(sheet?!=?null)???sheet?:?initSheet;
        ??????sheet.setClazz(data.get(0).getClass());

        ??????OutputStream?outputStream?=?null;
        ??????ExcelWriter?writer?=?null;
        ??????try?{
        ?????????outputStream?=?new?FileOutputStream(filePath);
        ?????????writer?=?EasyExcelFactory.getWriter(outputStream);
        ?????????writer.write(data,sheet);
        ??????}?catch?(FileNotFoundException?e)?{
        ?????????log.error("找不到文件或文件路徑錯(cuò)誤,?文件:{}",?filePath);
        ??????}finally?{
        ?????????try?{
        ????????????if(writer?!=?null){
        ???????????????writer.finish();
        ????????????}

        ????????????if(outputStream?!=?null){
        ???????????????outputStream.close();
        ????????????}
        ?????????}?catch?(IOException?e)?{
        ????????????log.error("excel文件導(dǎo)出失敗,?失敗原因:{}",?e);
        ?????????}
        ??????}

        ???}

        ???/**
        ????*?生成多Sheet的excle
        ????*?@param?filePath?絕對路徑,?如:/home/chenmingjian/Downloads/aaa.xlsx
        ????*?@param?multipleSheelPropetys
        ????*/
        ???public?static?void?writeWithMultipleSheel(String?filePath,List?multipleSheelPropetys){
        ??????if(CollectionUtils.isEmpty(multipleSheelPropetys)){
        ?????????return;
        ??????}

        ??????OutputStream?outputStream?=?null;
        ??????ExcelWriter?writer?=?null;
        ??????try?{
        ?????????outputStream?=?new?FileOutputStream(filePath);
        ?????????writer?=?EasyExcelFactory.getWriter(outputStream);
        ?????????for?(MultipleSheelPropety?multipleSheelPropety?:?multipleSheelPropetys)?{
        ????????????Sheet?sheet?=?multipleSheelPropety.getSheet()?!=?null???multipleSheelPropety.getSheet()?:?initSheet;
        ????????????if(!CollectionUtils.isEmpty(multipleSheelPropety.getData())){
        ???????????????sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());
        ????????????}
        ????????????writer.write(multipleSheelPropety.getData(),?sheet);
        ?????????}

        ??????}?catch?(FileNotFoundException?e)?{
        ?????????log.error("找不到文件或文件路徑錯(cuò)誤,?文件:{}",?filePath);
        ??????}finally?{
        ?????????try?{
        ????????????if(writer?!=?null){
        ???????????????writer.finish();
        ????????????}

        ????????????if(outputStream?!=?null){
        ???????????????outputStream.close();
        ????????????}
        ?????????}?catch?(IOException?e)?{
        ????????????log.error("excel文件導(dǎo)出失敗,?失敗原因:{}",?e);
        ?????????}
        ??????}

        ???}


        ???/*********************匿名內(nèi)部類開始,可以提取出去******************************/

        ???@Data
        ???public?static?class?MultipleSheelPropety{

        ??????private?List?data;

        ??????private?Sheet?sheet;
        ???}

        ???/**
        ????*?解析監(jiān)聽器,
        ????*?每解析一行會回調(diào)invoke()方法。
        ????*?整個(gè)excel解析結(jié)束會執(zhí)行doAfterAllAnalysed()方法
        ????*
        ????*?@author:?chenmingjian
        ????*?@date:?19-4-3?14:11
        ????*/
        ???@Getter
        ???@Setter
        ???public?static?class?ExcelListener?extends?AnalysisEventListener?{

        ??????private?List?datas?=?new?ArrayList<>();

        ??????/**
        ???????*?逐行解析
        ???????*?object?:?當(dāng)前行的數(shù)據(jù)
        ???????*/
        ??????@Override
        ??????public?void?invoke(Object?object,?AnalysisContext?context)?{
        ?????????//當(dāng)前行
        ?????????//?context.getCurrentRowNum()
        ?????????if?(object?!=?null)?{
        ????????????datas.add(object);
        ?????????}
        ??????}


        ??????/**
        ???????*?解析完所有數(shù)據(jù)后會調(diào)用該方法
        ???????*/
        ??????@Override
        ??????public?void?doAfterAllAnalysed(AnalysisContext?context)?{
        ?????????//解析結(jié)束銷毀不用的資源
        ??????}

        ???}

        ???/************************匿名內(nèi)部類結(jié)束,可以提取出去***************************/

        }


        測試類

        package?com.springboot.utils.excel;

        import?com.alibaba.excel.annotation.ExcelProperty;
        import?com.alibaba.excel.metadata.BaseRowModel;
        import?com.alibaba.excel.metadata.Sheet;
        import?lombok.Data;
        import?lombok.EqualsAndHashCode;
        import?org.junit.runner.RunWith;
        import?org.springframework.boot.test.context.SpringBootTest;
        import?org.springframework.test.context.junit4.SpringRunner;

        import?java.util.ArrayList;
        import?java.util.Arrays;
        import?java.util.List;

        /**
        ?*?@description:?測試類
        ?*?@author:?chenmingjian
        ?*?@date:?19-4-4?15:24
        ?*/
        @SpringBootTest
        @RunWith(SpringRunner.class)
        public?class?Test?{

        ????/**
        ?????*?讀取少于1000行的excle
        ?????*/
        [email protected]
        ????public?void?readLessThan1000Row(){
        ????????String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ????????List?objects?=?ExcelUtil.readLessThan1000Row(filePath);
        ????????objects.forEach(System.out::println);
        ????}

        ????/**
        ?????*?讀取少于1000行的excle,可以指定sheet和從幾行讀起
        ?????*/
        [email protected]
        ????public?void?readLessThan1000RowBySheet(){
        ????????String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ????????Sheet?sheet?=?new?Sheet(1,?1);
        ????????List?objects?=?ExcelUtil.readLessThan1000RowBySheet(filePath,sheet);
        ????????objects.forEach(System.out::println);
        ????}

        ????/**
        ?????*?讀取大于1000行的excle
        ?????*?帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
        ?????*/
        [email protected]
        ????public?void?readMoreThan1000Row(){
        ????????String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ????????List?objects?=?ExcelUtil.readMoreThan1000Row(filePath);
        ????????objects.forEach(System.out::println);
        ????}


        ????/**
        ?????*?生成excle
        ?????*?帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
        ?????*/
        [email protected]
        ????public?void?writeBySimple(){
        ????????String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ????????List>?data?=?new?ArrayList<>();
        ????????data.add(Arrays.asList("111","222","333"));
        ????????data.add(Arrays.asList("111","222","333"));
        ????????data.add(Arrays.asList("111","222","333"));
        ????????List?head?=?Arrays.asList("表頭1",?"表頭2",?"表頭3");
        ????????ExcelUtil.writeBySimple(filePath,data,head);
        ????}


        ????/**
        ?????*?生成excle,?帶用模型
        ?????*?帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
        ?????*/
        [email protected]
        ????public?void?writeWithTemplate(){
        ????????String?filePath?=?"/home/chenmingjian/Downloads/測試.xlsx";
        ????????ArrayList?data?=?new?ArrayList<>();
        ????????for(int?i?=?0;?i?????????????TableHeaderExcelProperty?tableHeaderExcelProperty?=?new?TableHeaderExcelProperty();
        ????????????tableHeaderExcelProperty.setName("cmj"?+?i);
        ????????????tableHeaderExcelProperty.setAge(22?+?i);
        ????????????tableHeaderExcelProperty.setSchool("清華大學(xué)"?+?i);
        ????????????data.add(tableHeaderExcelProperty);
        ????????}
        ????????ExcelUtil.writeWithTemplate(filePath,data);
        ????}


        ????/**
        ?????*?生成excle,?帶用模型,帶多個(gè)sheet
        ?????*/
        [email protected]
        ????public?void?writeWithMultipleSheel(){
        ????????ArrayList?list1?=?new?ArrayList<>();
        ????????for(int?j?=?1;?j?????????????ArrayList?list?=?new?ArrayList<>();
        ????????????for(int?i?=?0;?i?????????????????TableHeaderExcelProperty?tableHeaderExcelProperty?=?new?TableHeaderExcelProperty();
        ????????????????tableHeaderExcelProperty.setName("cmj"?+?i);
        ????????????????tableHeaderExcelProperty.setAge(22?+?i);
        ????????????????tableHeaderExcelProperty.setSchool("清華大學(xué)"?+?i);
        ????????????????list.add(tableHeaderExcelProperty);
        ????????????}

        ????????????Sheet?sheet?=?new?Sheet(j,?0);
        ????????????sheet.setSheetName("sheet"?+?j);

        ????????????ExcelUtil.MultipleSheelPropety?multipleSheelPropety?=?new?ExcelUtil.MultipleSheelPropety();
        ????????????multipleSheelPropety.setData(list);
        ????????????multipleSheelPropety.setSheet(sheet);

        ????????????list1.add(multipleSheelPropety);

        ????????}

        ????????ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

        ????}


        ????/*******************匿名內(nèi)部類,實(shí)際開發(fā)中該對象要提取出去**********************/
        ????
        ????
        ????/**
        ?????*?@description:
        ?????*?@author:?chenmingjian
        ?????*?@date:?19-4-3?14:44
        ?????*/
        ????@EqualsAndHashCode(callSuper?=?true)
        ????@Data
        ????public?static?class?TableHeaderExcelProperty?extends?BaseRowModel?{

        ????????/**
        ?????????*?value:?表頭名稱
        ?????????*?index:?列的號,?0表示第一列
        ?????????*/
        ????????@ExcelProperty(value?=?"姓名",?index?=?0)
        ????????private?String?name;

        ????????@ExcelProperty(value?=?"年齡",index?=?1)
        ????????private?int?age;

        ????????@ExcelProperty(value?=?"學(xué)校",index?=?2)
        ????????private?String?school;
        ????}

        ????/*******************匿名內(nèi)部類,實(shí)際開發(fā)中該對象要提取出去**********************/

        }



        ? 作者?|??沖奶粉的奶爸

        來源 |??csdn.net/qq_32258777/article/details/89031479


        加鋒哥微信:?java1239??
        圍觀鋒哥朋友圈,每天推送Java干貨!

        瀏覽 31
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            蜜桃av色偷偷av老熟女 | 舌头伸进去舔我的好爽高潮 | 肉性天堂| 国语少妇新婚之夜对白性视频 | 亚洲成人一区二区三区 | 国产对白国语对白 | 性无码一区二区三区在线观看 | 天天夜日日 | 日黄片小 | 西西人体444WWW无码男男 |