网页中上传Excel文档并实时读取某一列的内容,显示出来的Js实现

时间:2024-02-21 16:08:21

很多项目中可能需要从外部实时读入文件,但不是上传,对于这种该怎么实现呢。

日前,笔者也遇到一个类似的问题。就是项目中有一个文本框和导入按钮,要求点击按钮时可以导入excel文件,然后能自动读取其中的线路号显示到文本中。毫无意外,便开始在网上搜索JS实现相关功能的帖子,也获得了很多有用的经验。可唯一的问题是,总会出现一些困然的小问题。也是为了给以后的小伙伴省下时间,笔者在这里给大家一个较好的实现。

不多说,先上代码:

<html>  
 <head>  
  <title> New Document </title>
    <meta charset="utf-8">  
  <meta name="Generator" content="EditPlus">  
  <meta name="Author" content="">  
  <meta name="Keywords" content="">  
  <meta name="Description" content="">  
  <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
  <script type="text/javascript">  
    var oWB = null;
    var oXL = null;
    function loadExcel() {
           $("#upfile").click();
           //得到文件路径的值  
           var filePath = $("#upfile").val();  
           //创建操作EXCEL应用程序的实例  
           try{
            this.oXL = new ActiveXObject("Excel.Application");
            try{
                //打开指定路径的excel文件  
                this.oWB = this.oXL.Workbooks.open(filePath);  
                //获取sheet数
                 var sheet = this.oWB.Worksheets.count;
                //返回所传excel表格的sheet数供选择               
                $("#sheet").css("display","block");
                for(var i = 1;i <= sheet;i++){
                    var option = \'<option value="\'+i+\'">-第\'+i+\'页-</option>\';
                    $("#sheet").append(option);    
                }
            }catch(e){
                alert("请设置浏览器启用将文件上传到浏览器时包含本地路径!");
            }
            }catch(e){
                alert("请设置浏览器允许初始化和执行未标记为可安全执行脚本的ActiveX控件!");
            }           
        }
    function readexcel(){
        var selsheet = $("#sheet").val();        
        var tempStr = [];  
               //操纵所选sheet页(从一开始,而非零)  
           oWB.worksheets(parseInt(selsheet)).select();  
           var oSheet = oWB.ActiveSheet;            
           //使用的行数和列数  
         var rows =  oSheet.usedrange.rows.count;
         var columns = oSheet.usedrange.Columns.count;
         //查找线路号所在列
         var j = 1;
         for(j;j <= columns; j++){
            if(oSheet.Cells(1, j).value == "线路"){
                break;
            }
         }
           try { 
            //首行首列为表头,默认不取值。
              for (var i = 2; i <= rows; i++) { 
                  if(oSheet.Cells(i, j).value){
                      tempStr.push(oSheet.Cells(i, j).value)
                        //tempStr += oSheet.Cells(i, 3).value + "," ;
                    }
              }
                
           } catch(e) {  
              $("#txtArea").val(tempStr);  
           }             
           $("#txtArea").val(tempStr);  
           //退出操作excel的实例对象  
           //oXL.Application.Quit();  
            //手动调用垃圾收集器  
           //CollectGarbage();  
    }    
  </script>  
 </head>  
  
 <body>
  <input type="text" id="txtArea" style="float:left;"/>  
  <input type="file" id="upfile" style="float:left; display:none;" />
  <select id="sheet" style="display:none; height:21px; float:left;" onchange="readexcel()">
    <option value="" selected>-请选择-</option>
  </select>  
  <input type="button" style="float:left; height:21px;" onclick="loadExcel();" value="read">  
<br>  
 </body>  
</html>  


 

运行结果图:

 

 

 

因为excel中可能有多个sheet页,因而笔者设计了一个自动加载页数并根据页数读入数据的功能,大家可以适当跟着改一下。

另外,请读者朋友们注意,此方法需要设置浏览器启用将文件上传到浏览器时包含本地路径,以及允许或提示初始化和执行未标记为可安全执行脚本的ActiveX控件。