zoukankan      html  css  js  c++  java
  • js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)

    第一种导出table布局的表格

      1 <html>
      2 
      3     <head>
      4         <meta charset="utf-8">
      5         <script type="text/javascript" language="javascript">
      6             var idTmr;
      7 
      8             function getExplorer() {
      9                 var explorer = window.navigator.userAgent;
     10                 //ie 
     11                 if(explorer.indexOf(".NET") >= 0) {
     12                     return 'ie';
     13                 }
     14                 //firefox 
     15                 else if(explorer.indexOf("Firefox") >= 0) {
     16                     return 'Firefox';
     17                 }
     18                 //Chrome
     19                 else if(explorer.indexOf("Chrome") >= 0) {
     20                     return 'Chrome';
     21                 }
     22                 //Opera
     23                 else if(explorer.indexOf("Opera") >= 0) {
     24                     return 'Opera';
     25                 }
     26                 //Safari
     27                 else if(explorer.indexOf("Safari") >= 0) {
     28                     return 'Safari';
     29                 }
     30             }
     31 
     32             function method1(tableid, name, filename) { //整个表格拷贝到EXCEL中
     33                 if(getExplorer() == 'ie') {
     34                     var curTbl = document.getElementById(tableid);
     35                     var oXL = new ActiveXObject("Excel.Application");
     36 
     37                     //创建AX对象excel 
     38                     var oWB = oXL.Workbooks.Add();
     39                     //获取workbook对象 
     40                     var xlsheet = oWB.Worksheets(1);
     41                     //激活当前sheet 
     42                     var sel = document.body.createTextRange();
     43                     sel.moveToElementText(curTbl);
     44                     //把表格中的内容移到TextRange中 
     45                     sel.select();
     46                     //全选TextRange中内容 
     47                     sel.execCommand("Copy");
     48                     //复制TextRange中内容  
     49                     xlsheet.Paste();
     50                     //粘贴到活动的EXCEL中       
     51                     oXL.Visible = true;
     52                     //设置excel可见属性
     53 
     54                     try {
     55                         var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
     56                     } catch(e) {
     57                         print("Nested catch caught " + e);
     58                     } finally {
     59                         oWB.SaveAs(fname);
     60 
     61                         oWB.Close(savechanges = false);
     62                         //xls.visible = false;
     63                         oXL.Quit();
     64                         oXL = null;
     65                         //结束excel进程,退出完成
     66                         //window.setInterval("Cleanup();",1);
     67                         idTmr = window.setInterval("Cleanup();", 1);
     68 
     69                     }
     70 
     71                 } else {
     72                     tableToExcel(tableid, name, filename)
     73                 }
     74             }
     75 
     76             function Cleanup() {
     77                 window.clearInterval(idTmr);
     78                 CollectGarbage();
     79             }
     80             var tableToExcel = (function() {
     81                 var uri = 'data:application/vnd.ms-excel;base64,',
     82                     template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>',
     83                     base64 = function(s) {
     84                         return window.btoa(unescape(encodeURIComponent(s)))
     85                     },
     86                     format = function(s, c) {
     87                         return s.replace(/{(w+)}/g,
     88                             function(m, p) {
     89                                 return c[p];
     90                             })
     91                     }
     92                 return function(table, name, filename) {
     93                     if(!table.nodeType) table = document.getElementById(table)
     94                     var ctx = {
     95                             worksheet: name || 'Worksheet',
     96                             table: table.innerHTML
     97                         }
     98                         //window.location.href = uri + base64(format(template, ctx))
     99                         //<a href="/images/logo.png" download="w3clogo">    //参考a链接的下载,更改下载文件名
    100                         //<img border="0" src="/images/logo.png" alt="w3cschool.cc" >
    101                         //</a>
    102                     document.getElementById("dlink").href = uri + base64(format(template, ctx));
    103                     document.getElementById("dlink").download = filename; //这里是关键所在,当点击之后,设置a标签的属性,这样就可以更改标签的标题了
    104                     document.getElementById("dlink").click();
    105                 }
    106             })()
    107         </script>
    108         <style>
    109             .bk {
    110                 background-color: red;
    111                 color: blue;
    112                 text-align: center;
    113             }
    114         </style>
    115     </head>
    116 
    117     <body>
    118         <table id="targetTable">
    119             <tr align="center" id='th'>
    120                 <td>标识</td>
    121                 <td>内容</td>
    122                 <td>创建时间</td>
    123             </tr>
    124             <tr id="tr1" class="bk">
    125                 <a>
    126                     <td>1</td>
    127                     <td>excel01</td>
    128                     <td>2015-07-22</td>
    129                 </a>
    130             </tr>
    131             <tr align="center" style="background-color: red;color:yellow;">
    132                 <td>2</td>
    133                 <td>excel02</td>
    134                 <td>2015-07-22</td>
    135             </tr>
    136             <tr align="center" id="tr3">
    137                 <a>
    138                     <td>1</td>
    139                     <td>excel01</td>
    140                     <td>2015-07-22</td>
    141                 </a>
    142             </tr>
    143         </table>
    144         </br>
    145         <span>span</span>
    146         <a id="dlink" style="display:none;"></a><!--隐藏链接,设置下载文件名  利用download属性-->
    147         <input id="Button1" type="button" value="导出EXCEL" onclick="javascript:method1('targetTable', 'name', 'myfile.xls')" />
    148         <script>
    149             //导出execl时只有标签上的样式才会影响到导出的execl的样式,通过类渲染的最终样式没用
    150             document.getElementById('tr3').style.backgroundColor = "yellow";
    151             var th = document.getElementById('th');
    152             var a = document.getElementById('tr1');
    153             var color = window.getComputedStyle(a).getPropertyValue("background-color"); //获取最终样式,经过class渲染之后的样式
    154             //alert(window.getComputedStyle(a).getPropertyValue("color"));
    155             th.style.backgroundColor = color;
    156         </script>
    157     </body>
    158 
    159 </html>
    View Code

    在template的head标签中加了<meta charset="UTF-8">(template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8">......),防止中文乱码。

    其中利用了a标签的download属性来更改导出的execl名字,而且导出execl时只有标签上的样式才会影响到导出的execl的样式,通过类渲染的最终样式没用

    第二种导出div布局的表格

      1 <!DOCTYPE html>
      2 
      3 <html>
      4 
      5     <head>
      6         <meta name="viewport" content="width=device-width" />
      7         <meta charset="utf-8">
      8         <title>项目统计</title>
      9         <link href="css/bootstrap.min.css" rel="stylesheet" />
     10         <link href="css/bootstrap-datepicker3.min.css" rel="stylesheet" />
     11         <link rel="stylesheet" type="text/css" href="css/layout.css" />
     12         <link rel="stylesheet" type="text/css" href="css/style.css" />
     13         <script src="js/jquery.min.js"></script>
     14         <script src="js/layer.js"></script>
     15         <script src="js/bootstrap-datepicker.min.js"></script>
     16         <script src="js/bootstrap-datepicker.zh-cn.min.js"></script>
     17         <script type="text/javascript" language="javascript">
     18             var idTmr;
     19 
     20             function getExplorer() {
     21                 var explorer = window.navigator.userAgent;
     22                 //ie 
     23                 if(explorer.indexOf("MSIE") >= 0) {
     24                     return 'ie';
     25                 }
     26                 //firefox 
     27                 else if(explorer.indexOf("Firefox") >= 0) {
     28                     return 'Firefox';
     29                 }
     30                 //Chrome
     31                 else if(explorer.indexOf("Chrome") >= 0) {
     32                     return 'Chrome';
     33                 }
     34                 //Opera
     35                 else if(explorer.indexOf("Opera") >= 0) {
     36                     return 'Opera';
     37                 }
     38                 //Safari
     39                 else if(explorer.indexOf("Safari") >= 0) {
     40                     return 'Safari';
     41                 }
     42             }
     43 
     44             function method1(tableid,name, filename) { //整个表格拷贝到EXCEL中
     45                 //隐藏a链接是为了设置下载名字
     46                 if($('#dlink').length <= 0) //id为dlink的a不存在则创建一个隐藏的a
     47                 {
     48                     $('body').prepend("<a id='dlink' style='display:none;'>");
     49                 }
     50                 //判断table是不是div布局的table
     51                 if($("#" + tableid).prop("tagName") == "DIV") {
     52                     var table = $("#" + tableid).html(); //是div布局的table则重新建一个table,获取html标签替换
     53                     var tableClass=$("#" + tableid).attr('class');    //获取原来div的class
     54                     tableid = "divTableID222"; //为了第二次导出execl的时候,不与table的id重复
     55                     if($('#' + tableid).length <= 0) //id为tableid的div不存在则创建一个隐藏的div
     56                     {    
     57                         $('body').prepend("</a><div id='" + tableid + "' style='display: none;'></div>");
     58                     }
     59                     $('#' + tableid).html(table); //把需要导出的内容加到这个隐藏的div中
     60                     $("#" + tableid).attr('class',tableClass);    //把原来div的样式复制给隐藏div的样式
     61                     $("#" + tableid+" div[name='exportFilter']").remove();    //删除不要导出的列
     62                     //下面是替换标签
     63                     $('#' + tableid + ' .tr-th').replaceWith(function() {
     64                         return $("<tr />", {
     65                             html: $(this).html(), class:$(this).attr('class'),
     66                             //设置execl样式,必须是style属性上的,通过class渲染的不行
     67                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),    
     68                             align:"center"
     69                         });
     70                     });
     71                     $('#' + tableid + ' .th').replaceWith(function() {
     72                         return $("<th />", {
     73                             html: $(this).html(), class:$(this).attr('class'),
     74                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),
     75                             align:"center"
     76                         });
     77                     });
     78                     $('#' + tableid + ' .tr').replaceWith(function() {
     79                         return $("<tr />", {
     80                             html: $(this).html(), class:$(this).attr('class'),
     81                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),
     82                             align:"center"
     83                         });
     84                     });
     85                     $('#' + tableid + ' .td').replaceWith(function() {
     86                         return $("<td />", {
     87                             html: $(this).html(), class:$(this).attr('class'),
     88                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color")
     89                             +";color:"+window.getComputedStyle(this).getPropertyValue("color"),
     90                             align:"center"
     91                         });
     92                     });
     93                 }
     94                 if(getExplorer() == 'ie') {
     95                     var curTbl = document.getElementById(tableid);
     96                     var oXL = new ActiveXObject("Excel.Application");
     97 
     98                     //创建AX对象excel 
     99                     var oWB = oXL.Workbooks.Add();
    100                     //获取workbook对象 
    101                     var xlsheet = oWB.Worksheets(1);
    102                     //激活当前sheet 
    103                     var sel = document.body.createTextRange();
    104                     sel.moveToElementText(curTbl);
    105                     //把表格中的内容移到TextRange中 
    106                     sel.select();
    107                     //全选TextRange中内容 
    108                     sel.execCommand("Copy");
    109                     //复制TextRange中内容  
    110                     xlsheet.Paste();
    111                     //粘贴到活动的EXCEL中       
    112                     oXL.Visible = true;
    113                     //设置excel可见属性
    114 
    115                     try {
    116                         var fname = oXL.Application.GetSaveAsFilename(filename||'我的execl', "Excel Spreadsheets (*.xls), *.xls");
    117                     } catch(e) {
    118                         print("Nested catch caught " + e);
    119                     } finally {
    120                         oWB.SaveAs(fname);
    121 
    122                         oWB.Close(savechanges = false);
    123                         //xls.visible = false;
    124                         oXL.Quit();
    125                         oXL = null;
    126                         //结束excel进程,退出完成
    127                         //window.setInterval("Cleanup();",1);
    128                         idTmr = window.setInterval("Cleanup();", 1);
    129 
    130                     }
    131 
    132                 } else {
    133                     tableToExcel(tableid,name, filename)
    134                 }
    135             }
    136 
    137             function Cleanup() {
    138                 window.clearInterval(idTmr);
    139                 CollectGarbage();
    140             }
    141             var tableToExcel = (function() {
    142                 var uri = 'data:application/vnd.ms-excel;base64,',
    143                     template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>',
    144                     base64 = function(s) {
    145                         return window.btoa(unescape(encodeURIComponent(s)))
    146                     },
    147                     format = function(s, c) {
    148                         return s.replace(/{(w+)}/g,
    149                             function(m, p) {
    150                                 return c[p];
    151                             })
    152                     }
    153                 return function(table, name, filename) {
    154                     if(!table.nodeType) table = document.getElementById(table)
    155                     var ctx = {
    156                         worksheet: name || 'Worksheet',
    157                         table: table.innerHTML
    158                     }
    159                     //window.location.href = uri + base64(format(template, ctx))
    160                         //<a href="/images/logo.png" download="w3clogo">    //参考a链接的下载,更改下载文件名,可以添加扩展名w3clogo.jpg
    161                         //<img border="0" src="/images/logo.png" alt="w3cschool.cc" >
    162                         //</a>
    163                     document.getElementById("dlink").href = uri + base64(format(template, ctx));
    164                     document.getElementById("dlink").download = filename||'我的execl'; //这里是关键所在,当点击之后,设置a标签的属性,这样就可以更改标签的标题了
    165                     //没传参数,下载名字默认为‘我的execl’
    166                     document.getElementById("dlink").click();
    167                 }
    168             })()
    169         </script>
    170     </head>
    171 
    172     <body>
    173         <div class="info-center">
    174             <div class="manage-head">
    175                 <h6 class="padding-left manage-head-con">
    176                 项目统计
    177 
    178                     <a class="h5 custom-red fr margin-left" href="/ProjectEntering/Index">录入项目</a>
    179                 <a class="h5 custom-glay fr margin-left" href="/ProjectStatistics/Index?page=1&keyword=&AID=0&Project_state=&Excel=1'">导出Execl</a>
    180 
    181                 <select id="SelProject_state" class="h5 custom-glay fr margin-left" style="height: 32px; font-size: 10px; color: #565656; font-weight: normal; border: 1px solid #cecece; padding: 0 10px; margin-top: -5px;">
    182                     <option value="">状态</option>
    183                     <option value="">全部</option>
    184                     <option value="0">进行中</option>
    185                     <option value="1">完成</option>
    186                 </select>
    187                 
    188 <input id="Button1" type="button" value="导出EXCEL" onclick="javascript:method1('targetTable','name','导出execl')" />
    189                 <a class="h5 custom-glay fr margin-left" href="javascript:void();" id="akeyword" >搜索</a>
    190                 <input id="txtkeyword" value="" placeholder="请输入关键字" class="input w20 fr" style="vertical-align: top;" />
    191                 <div class="span5 col-md-5 fr" id="sandbox-container" >
    192                     <div class="input-daterange input-group" id="datepicker">
    193                         <span class="input-group-addon" style="height: 32px; margin-top: -10px; ">时间段</span>
    194                         <input id="txtstartTime" type="text" class="input-sm form-control" name="start" readonly>
    195                         <span class="input-group-addon"></span>
    196                         <input id="txtendTime" type="text" class="input-sm form-control" name="end" readonly>
    197                     </div>
    198                 </div>
    199             </h6>
    200             </div>
    201             <div id="targetTable" class="offcial-table input-table table-margin clearfix">
    202                 <div class="tr-th clearfix">
    203                     <div class="th w10">项目编号</div>
    204                     <div class="th w10">项目名称</div>
    205                     <div class="th w15">项目金额</div>
    206                     <div class="th w10">项目负责人</div>
    207                     <div class="th w10">创建时间</div>
    208                     <div class="th w10">实际总系数值</div>
    209                     <div class="th w10">预计总系数值</div>
    210                     <div class="th w10">项目状态</div>
    211                     <div class="th w15" name='exportFilter'>操作</div>
    212                 </div>
    213                 <div id="projectInfo58" class="tr clearfix tr-check">
    214                     <a href="/ProjectDetail/Index?PID=58">
    215                         <div class="td w10">987</div>
    216                         <div class="td w10">test2017</div>
    217                         <div class="td w15">¥0</div>
    218                         <div class="td w10">Katherine </div>
    219                         <div class="td w10">2017/1/13 15:02:16</div>
    220                         <div class="td w10">28</div>
    221                         <div class="td w10" style="color: blue;">20</div>
    222                         <div class="td w10">
    223                             <span class="text-blue">
    224                                             进行中
    225                                         </span>
    226                         </div>
    227                         <div class="td w15" name='exportFilter'>
    228                             <a href="/ProjectDetail/Index?PID=58">查看</a>
    229                             /
    230                             <a href="/ProjectEntering/Index?PID=58">修改</a>
    231                             /
    232                             <a name="aDeleteProject" data-id="58" href="javascript:viod();">删除</a>
    233                         </div>
    234                     </a>
    235                 </div>
    236                 <div id="projectInfo56" class="tr clearfix tr-check">
    237                     <a href="/ProjectDetail/Index?PID=56">
    238                         <div class="td w10">123456789</div>
    239                         <div class="td w10">test20170113</div>
    240                         <div class="td w15">¥0</div>
    241                         <div class="td w10">Katherine </div>
    242                         <div class="td w10">2017/1/13 14:00:28</div>
    243                         <div class="td w10">10</div>
    244                         <div class="td w10">9.5</div>
    245                         <div class="td w10" >
    246                             <span class="text-blue">
    247                                             进行中
    248                                         </span>
    249                         </div>
    250                         <div class="td w15" name='exportFilter'>
    251                             <a href="/ProjectDetail/Index?PID=56">查看</a>
    252                             /
    253                             <a href="/ProjectEntering/Index?PID=56">修改</a>
    254                             /
    255                             <a name="aDeleteProject" data-id="56" href="javascript:viod();">删除</a>
    256                         </div>
    257                     </a>
    258                 </div>
    259                 <div id="projectInfo53" class="tr clearfix ">
    260                     <a href="/ProjectDetail/Index?PID=53">
    261                         <div class="td w10">63</div>
    262                         <div class="td w10">63</div>
    263                         <div class="td w15">¥63</div>
    264                         <div class="td w10">admin</div>
    265                         <div class="td w10">2017/1/12 17:59:59</div>
    266                         <div class="td w10">96</div>
    267                         <div class="td w10">111</div>
    268                         <div class="td w10">
    269                             <span class="text-blue">
    270                                             进行中
    271                                         </span>
    272                         </div>
    273                         <div class="td w15" name='exportFilter'>
    274                             <a href="/ProjectDetail/Index?PID=53">查看</a>
    275                             /
    276                             <a href="/ProjectEntering/Index?PID=53">修改</a>
    277                             /
    278                             <a name="aDeleteProject" data-id="53" href="javascript:viod();">删除</a>
    279                         </div>
    280                     </a>
    281                 </div>
    282                 <div id="projectInfo52" class="tr clearfix tr-check">
    283                     <a href="/ProjectDetail/Index?PID=52">
    284                         <div class="td w10">123-456</div>
    285                         <div class="td w10">test0112</div>
    286                         <div class="td w15">¥0</div>
    287                         <div class="td w10">Katherine </div>
    288                         <div class="td w10">2017/1/12 13:46:19</div>
    289                         <div class="td w10">56</div>
    290                         <div class="td w10">20</div>
    291                         <div class="td w10">
    292                             <span class="text-blue">
    293                                             进行中
    294                                         </span>
    295                         </div>
    296                         <div class="td w15" name='exportFilter'>
    297                             <a href="/ProjectDetail/Index?PID=52">查看</a>
    298                             /
    299                             <a href="/ProjectEntering/Index?PID=52">修改</a>
    300                             /
    301                             <a name="aDeleteProject" data-id="52" href="javascript:viod();">删除</a>
    302                         </div>
    303                     </a>
    304                 </div>
    305                 <div id="projectInfo50" class="tr clearfix ">
    306                     <a href="/ProjectDetail/Index?PID=50">
    307                         <div class="td w10">16-12257-1</div>
    308                         <div class="td w10">CapitaLand-Chengdu</div>
    309                         <div class="td w15">¥0</div>
    310                         <div class="td w10">Frank Xu</div>
    311                         <div class="td w10">2017/1/12 11:26:14</div>
    312                         <div class="td w10">0</div>
    313                         <div class="td w10">100.2</div>
    314                         <div class="td w10">
    315                             <span class="text-blue">
    316                                             进行中
    317                                         </span>
    318                         </div>
    319                         <div class="td w15" name='exportFilter'>
    320                             <a href="/ProjectDetail/Index?PID=50">查看</a>
    321                             /
    322                             <a href="/ProjectEntering/Index?PID=50">修改</a>
    323                             /
    324                             <a name="aDeleteProject" data-id="50" href="javascript:viod();">删除</a>
    325                         </div>
    326                     </a>
    327                 </div>
    328                 <div id="projectInfo22" class="tr clearfix ">
    329                     <a href="/ProjectDetail/Index?PID=22">
    330                         <div class="td w10">test</div>
    331                         <div class="td w10">test</div>
    332                         <div class="td w15">¥2</div>
    333                         <div class="td w10">admin</div>
    334                         <div class="td w10">2017/1/10 16:12:29</div>
    335                         <div class="td w10">4.4</div>
    336                         <div class="td w10">10.5</div>
    337                         <div class="td w10">
    338                             <span class="text-green">完成</span>
    339                         </div>
    340                         <div class="td w15" name='exportFilter'>
    341                             <a href="/ProjectDetail/Index?PID=22">查看</a>
    342                         </div>
    343                     </a>
    344                 </div>
    345 
    346             </div>
    347             <!-------------分页开始-------------->
    348             <div class="show-page padding-big-right ">
    349 
    350                 <div class="page">
    351                     <ul class="offcial-page margin-top margin-big-right">
    352                         <li><em class="margin-small-left margin-small-right">6</em>条数据</li>
    353                         <li>每页显示<em class="margin-small-left margin-small-right">15</em></li>
    354                         <li>
    355                             <a class="next disable" href="javascript:void();" id="aPre">上一页</a>
    356                         </li>
    357                         <li>
    358                             <a class="next disable">1</a>
    359                         </li>
    360                         <li>
    361                             <a class="next disable" href="javascript:void();" id="aNext">下一页</a>
    362                         </li>
    363                         <li><span class="fl"><em class="margin-small-left margin-small-right">1</em></span></li>
    364                     </ul>
    365                 </div>
    366             </div>
    367             <!-------------分页结束-------------->
    368         </div>
    369         
    370 
    371     </body>
    372 
    373 </html>
    View Code

    这种方式实际是把div处理了一下,重新创建了一个隐藏的div,把div布局的内容转换成table布局的内容放到隐藏的div中,中间用了jq的标签替换。(有更好的方法欢迎讨论)

    $('#' + tableid + ' .tr-th').replaceWith(function() {
                            return $("<tr />", {
                                html: $(this).html(), class:$(this).attr('class'),
                                //设置execl样式,必须是style属性上的,通过class渲染的不行
                                style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),    
                                align:"center"
                            });
                        });
    jq替换标签

    里面用到基于bootstrap的时间控件 资源下载

  • 相关阅读:
    Ansible工作架构和原理
    基于WSAAsyncSelect模型的两台计算机之间的通信
    基于Select模型通信程序的编写,编译和执行
    Windows API窗口绘图程序设计
    常用自动化运维工具
    简单的程序发布流程
    TCPIP协议编程:基于UDP协议的局域网聊天工具的研发
    Python 遗传算法实现字符串
    python3 井字棋 GUI
    Docker 容器的跨主机连接
  • 原文地址:https://www.cnblogs.com/tpfOfBlog/p/6285874.html
Copyright © 2011-2022 走看看