<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

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

    共 7975字,需瀏覽 16分鐘

     ·

    2021-11-08 13:59

    喝水不忘挖井人,github地址:

    https://github.com/alibaba/easyexcel

    文章目錄

    • 環(huán)境搭建

    • 讀取excel文件

      • 默認(rèn)讀取

      • 指定讀取

      • 默認(rèn)讀取

      • 指定讀取

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

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

    • 導(dǎo)出excle

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

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

      • 單個Sheet導(dǎo)出

      • 多個Sheet導(dǎo)出

    • 工具類

    • 測試類

    環(huán)境搭建

    • easyexcel 依賴(必須)

    • springboot (不是必須)

    • lombok (不是必須)
    <dependency>
    ???<groupId>com.alibabagroupId>

    ???<artifactId>easyexcelartifactId>
    ???<version>1.1.2-beat1version>
    ?dependency>
    ??
    ?<dependency>
    ???<groupId>org.projectlombokgroupId>
    ???<artifactId>lombokartifactId>
    ???<version>1.18.2version>
    ?dependency>

    讀取excel文件

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

    默認(rèn)讀取

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

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

    指定讀取

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

    獲取Sheet1表頭以下的信息

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

    獲取Sheet2的所有信息

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

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

    默認(rèn)讀取
    String?filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
    List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);
    指定讀取
    String?filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
    Sheet sheet = new?Sheet(1, 2);
    List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath,sheet);

    導(dǎo)出excle

    單個Sheet導(dǎo)出

    無模型映射導(dǎo)出
    String filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    List<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 < 4; i++){
    ??????TableHeaderExcelProperty tableHeaderExcelProperty = new?TableHeaderExcelProperty();
    ??????tableHeaderExcelProperty.setName("cmj"?+ i);
    ??????tableHeaderExcelProperty.setAge(22?+ i);
    ??????tableHeaderExcelProperty.setSchool("清華大學(xué)"?+ i);
    ??????data.add(tableHeaderExcelProperty);
    ??}

    ??ExcelUtil.writeWithTemplate(filePath,data);

    多個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 < 4; j++){
    ??????ArrayList list?= new?ArrayList<>();
    ??????for(int?i = 0; i < 4; 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);

    工具類

    /**
    ?* @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: 返回數(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("找不到文件或文件路徑錯誤, 文件:{}", 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("找不到文件或文件路徑錯誤, 文件:{}", 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<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<List> data, List head, Sheet sheet){
    ??????sheet = (sheet != null) ? sheet : initSheet;

    ??????if(head != null){
    ?????????List<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("找不到文件或文件路徑錯誤, 文件:{}", 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?extends BaseRowModel> 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?extends BaseRowModel> 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("找不到文件或文件路徑錯誤, 文件:{}", 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("找不到文件或文件路徑錯誤, 文件:{}", 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?extends BaseRowModel> data;

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

    ???/**
    ????* 解析監(jiān)聽器,
    ????* 每解析一行會回調(diào)invoke()方法。
    ????* 整個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é)束,可以提取出去***************************/

    }

    測試類

    /**
    ?* @description: 測試類
    ?* @author: chenmingjian
    ?* @date: 19-4-4 15:24
    ?*/

    @SpringBootTest
    @RunWith(SpringRunner.class)
    public?class?Test {

    ????/**
    ?????* 讀取少于1000行的excle
    ?????*/

    ????@org.junit.Test
    ????public?void?readLessThan1000Row(){
    ????????String?filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    ????????List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);
    ????????objects.forEach(System.out::println);
    ????}

    ????/**
    ?????* 讀取少于1000行的excle,可以指定sheet和從幾行讀起
    ?????*/

    ????@org.junit.Test
    ????public?void?readLessThan1000RowBySheet(){
    ????????String?filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    ????????Sheet sheet = new?Sheet(1, 1);
    ????????List<Object> objects = ExcelUtil.readLessThan1000RowBySheet(filePath,sheet);
    ????????objects.forEach(System.out::println);
    ????}

    ????/**
    ?????* 讀取大于1000行的excle
    ?????* 帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
    ?????*/

    ????@org.junit.Test
    ????public?void?readMoreThan1000Row(){
    ????????String?filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    ????????List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);
    ????????objects.forEach(System.out::println);
    ????}


    ????/**
    ?????* 生成excle
    ?????* 帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
    ?????*/

    ????@org.junit.Test
    ????public?void?writeBySimple(){
    ????????String?filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    ????????ListObject
    >> 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<String> head = Arrays.asList("表頭1", "表頭2", "表頭3");
    ????????ExcelUtil.writeBySimple(filePath,data,head);
    ????}


    ????/**
    ?????* 生成excle, 帶用模型
    ?????* 帶sheet參數(shù)的方法可參照測試方法readLessThan1000RowBySheet()
    ?????*/

    ????@org.junit.Test
    ????public?void?writeWithTemplate(){
    ????????String?filePath = "/home/chenmingjian/Downloads/測試.xlsx";
    ????????ArrayList data = new?ArrayList<>();
    ????????for(int i = 0; i < 4; 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, 帶用模型,帶多個sheet
    ?????*/

    ????@org.junit.Test
    ????public?void?writeWithMultipleSheel(){
    ????????ArrayList list1 = new?ArrayList<>();
    ????????for(int j = 1; j < 4; j++){
    ????????????ArrayList list = new?ArrayList<>();
    ????????????for(int i = 0; i < 4; 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)部類,實際開發(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)部類,實際開發(fā)中該對象要提取出去**********************/

    }

    來源:blog.csdn.net/qq_32258777/article/details/89031479


    推薦閱讀:

    世界的真實格局分析,地球人類社會底層運行原理

    不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

    企業(yè)IT技術(shù)架構(gòu)規(guī)劃方案

    論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

    企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

    【中臺實踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

    華為的數(shù)字化轉(zhuǎn)型方法論

    華為如何實施數(shù)字化轉(zhuǎn)型(附PPT)

    超詳細280頁Docker實戰(zhàn)文檔!開放下載

    華為大數(shù)據(jù)解決方案(PPT)


    瀏覽 23
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

        • <dd id="5sdj3"></dd>
          <dfn id="5sdj3"></dfn>
        • <th id="5sdj3"></th>
          <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

          • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
          • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
            久久久理论 | 爱操逼视频 | 久久久久久中文字幕 | 美女福利网站 | 国产伦精品 |