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)出

        共 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

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

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

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

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

        • 工具類

        • 測(cè)試類

        環(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";
        //第一個(gè)1代表sheet1, 第二個(gè)1代表從第幾行開(kāi)始讀取數(shù)據(jù),行號(hào)最小值為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

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

        無(wú)模型映射導(dǎo)出
        String filePath = "/home/chenmingjian/Downloads/測(cè)試.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、定義好模型對(duì)象

        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: 列的號(hào), 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/測(cè)試.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);

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

        1、定義好模型對(duì)象

        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: 列的號(hào), 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 文件絕對(duì)路徑
        ????* @return
        ????*/

        ???public?static?List readLessThan1000Row(String filePath){
        ??????return?readLessThan1000RowBySheet(filePath,null);
        ???}

        ???/**
        ????* 讀小于1000行數(shù)據(jù), 帶樣式
        ????* filePath 文件絕對(duì)路徑
        ????* initSheet :
        ????* sheetNo: sheet頁(yè)碼,默認(rèn)為1
        ????* headLineMun: 從第幾行開(kāi)始讀取數(shù)據(jù),默認(rèn)為0, 表示從第一行開(kāi)始讀取
        ????* 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 文件覺(jué)得路徑
        ????* @return
        ????*/

        ???public?static?List readMoreThan1000Row(String filePath){
        ??????return?readMoreThan1000RowBySheet(filePath,null);
        ???}

        ???/**
        ????* 讀大于1000行數(shù)據(jù), 帶樣式
        ????* @param?filePath 文件覺(jué)得路徑
        ????* @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 絕對(duì)路徑, 如:/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 絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
        ????* @param?data 數(shù)據(jù)源
        ????* @param?sheet excle頁(yè)面樣式
        ????* @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("找不到文件或文件路徑錯(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 絕對(duì)路徑, 如:/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 絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
        ????* @param?data 數(shù)據(jù)源
        ????* @param?sheet excle頁(yè)面樣式
        ????*/

        ???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("找不到文件或文件路徑錯(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 絕對(duì)路徑, 如:/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)部類開(kāi)始,可以提取出去******************************/

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

        ??????private?List?extends BaseRowModel> data;

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

        ???/**
        ????* 解析監(jiān)聽(tīng)器,
        ????* 每解析一行會(huì)回調(diào)invoke()方法。
        ????* 整個(gè)excel解析結(jié)束會(huì)執(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ù)后會(huì)調(diào)用該方法
        ???????*/

        ??????@Override
        ??????public?void doAfterAllAnalysed(AnalysisContext context) {
        ?????????//解析結(jié)束銷毀不用的資源
        ??????}

        ???}

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

        }

        測(cè)試類

        /**
        ?* @description: 測(cè)試類
        ?* @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/測(cè)試.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/測(cè)試.xlsx";
        ????????Sheet sheet = new?Sheet(1, 1);
        ????????List<Object> objects = ExcelUtil.readLessThan1000RowBySheet(filePath,sheet);
        ????????objects.forEach(System.out::println);
        ????}

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

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


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

        ????@org.junit.Test
        ????public?void?writeBySimple(){
        ????????String?filePath = "/home/chenmingjian/Downloads/測(cè)試.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ù)的方法可參照測(cè)試方法readLessThan1000RowBySheet()
        ?????*/

        ????@org.junit.Test
        ????public?void?writeWithTemplate(){
        ????????String?filePath = "/home/chenmingjian/Downloads/測(cè)試.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, 帶用模型,帶多個(gè)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)部類,實(shí)際開(kāi)發(fā)中該對(duì)象要提取出去**********************/
        ????
        ????
        ????/**
        ?????* @description:
        ?????* @author: chenmingjian
        ?????* @date: 19-4-3 14:44
        ?????*/

        ????@EqualsAndHashCode(callSuper = true)
        ????@Data
        ????public?static?class?TableHeaderExcelProperty extends?BaseRowModel {

        ????????/**
        ?????????* value: 表頭名稱
        ?????????* index: 列的號(hào), 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í)際開(kāi)發(fā)中該對(duì)象要提取出去**********************/

        }

        來(lái)源:blog.csdn.net/qq_32258777/article/details/89031479


        推薦閱讀:

        世界的真實(shí)格局分析,地球人類社會(huì)底層運(yùn)行原理

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

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

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

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

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

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

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

        超詳細(xì)280頁(yè)Docker實(shí)戰(zhàn)文檔!開(kāi)放下載

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


        瀏覽 23
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            国产精品菊爆在线播放 | 久久天天草 | chinese勾搭少妇videos | 宝贝乖~张开腿我轻点高视频 | 全文辣肉h短篇春野小农民视频 | 国模自拍一区 | 久久久无码亚洲精品日韩京东 | 日本在线视频播放 | 我想看操逼 | 青青草视频在线观看免费 |