Javascript 如何在客户端读取excel文件内容?

Javascript 如何在客户端读取excel文件内容?,javascript,excel,jsp,Javascript,Excel,Jsp,从JSP页面,我需要浏览excel文件,在系统上选择文件后,我需要读取excel文件内容并填写表格 目前,我已经尝试了下面的代码,但它只在IE中工作,并对ActiveXObject的IE internet选项进行了一些更改。它在其他浏览器中不起作用 <script> function mytest2() { var Excel; Excel = new ActiveXObject("Excel.Application"); E

从JSP页面,我需要浏览excel文件,在系统上选择文件后,我需要读取excel文件内容并填写表格

目前,我已经尝试了下面的代码,但它只在IE中工作,并对ActiveXObject的IE internet选项进行了一些更改。它在其他浏览器中不起作用

<script>
    function mytest2() {
        var Excel;
        Excel = new ActiveXObject("Excel.Application"); 
        Excel.Visible = false;
        form1.my_textarea2.value = Excel.Workbooks.Open("C:/Documents and Settings/isadmin/Desktop/test.xlsx").ActiveSheet.Cells(1,1).Value;
        Excel.Quit();
    }
</script>

函数mytest2(){
var-Excel;
Excel=新的ActiveXObject(“Excel.Application”);
Excel.Visible=false;
form1.my_textarea2.value=Excel.Workbooks.Open(“C:/Documents and Settings/isadmin/Desktop/test.xlsx”).ActiveSheet.Cells(1,1).value;
Excel.Quit();
}

请建议一些解决方案,使其在所有浏览器中都能工作

通常不可能在浏览器中通过JavaScript读取/写入任何文件。因此,如果没有任何附加插件,您将无法从浏览器中读取/写入Excel文件。Excel的ActiveX对象允许您执行此操作,但只有IE支持ActiveX对象

可能有其他浏览器的插件,但我知道没有

首先,你为什么要这么做?你能给出一个用例吗?也许有比你正在尝试的更好的选择

更新

您必须将excel文件传递到服务器,并在服务器端读取excel(例如在servlet中)

您必须在JSP中的多部分表单中使用

在服务器端,您可能需要使用


一旦您拥有了文件(或其中的流),您就可以使用(比如)解析文件,然后将数据更新到数据库或将其传递回JSP。我一直都在这样做——我的原型旨在让利益相关者修改excel并填充html原型,通常不需要服务器

  • 将excel另存为XML
  • 通过AJAX加载XML并解析出结构
  • (1) 我在excel文件中放入了一个方便的按钮宏,可以轻松地保存为XML(并重新保存为xls):


    (2) 解析JS更复杂,但前提很简单。将有XML对象,如工作表、表、行、单元格和数据。还有一个称为ss:Index的XML属性,我有时觉得很方便。

    xlsx电子表格是一个zip文件,里面有一堆XML文件。使用类似的方法,您可以提取xml文件并在浏览器中解析它们。是这样吗。为方便起见,请在此复制:

    /*
        Relies on jQuery, underscore.js, Async.js (https://github.com/caolan/async), and zip.js (http://gildas-lormeau.github.com/zip.js).
        Tested only in Chrome on OS X.
    
        Call xlsxParser.parse(file) where file is an instance of File. For example (untested):
    
        document.ondrop = function(e) {
            var file = e.dataTransfer.files[0];
            excelParser.parse(file).then(function(data) {
                console.log(data);
            }, function(err) {
                console.log('error', err);
            });
        }
    */
    
    xlsxParser = (function() {
        function extractFiles(file) {
            var deferred = $.Deferred();
    
            zip.createReader(new zip.BlobReader(file), function(reader) {
                reader.getEntries(function(entries) {
                    async.reduce(entries, {}, function(memo, entry, done) {
                        var files = ['xl/worksheets/sheet1.xml', 'xl/sharedStrings.xml'];
                        if (files.indexOf(entry.filename) == -1) return done(null, memo);
    
                        entry.getData(new zip.TextWriter(), function(data) {
                            memo[entry.filename.split('/').pop()] = data;
                            done(null, memo);
                        });
                    }, function(err, files) {
                        if (err) deferred.reject(err);
                        else deferred.resolve(files);
                    });
                });
            }, function(error) { deferred.reject(error); });
    
            return deferred.promise();
        }
    
        function extractData(files) {
            var sheet = $(files['sheet1.xml']),
                strings = $(files['sharedStrings.xml']),
                data = [];
    
            var colToInt = function(col) {
                var letters = ["", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
                var col = $.trim(col).split('');
    
                var n = 0;
    
                for (var i = 0; i < col.length; i++) {
                    n *= 26;
                    n += letters.indexOf(col[i]);
                }
    
                return n;
            };
    
            var Cell = function(cell) {
                cell = cell.split(/([0-9]+)/);
                this.row = parseInt(cell[1]);
                this.column = colToInt(cell[0]);
            };
    
            var d = sheet.find('dimension').attr('ref').split(':');
            d = _.map(d, function(v) { return new Cell(v); });
    
            var cols = d[1].column - d[0].column + 1,
                rows = d[1].row - d[0].row + 1;
    
            _(rows).times(function() {
                var _row = [];
                _(cols).times(function() { _row.push(''); });
                data.push(_row);
            });
    
            sheet.find('sheetData row c').each(function(i, c) {
                var $cell = $(c),
                    cell = new Cell($cell.attr('r')),
                    type = $cell.attr('t'),
                    value = $cell.find('v').text();
    
                if (type == 's') value = strings.find('si t').eq(parseInt(value)).text();
    
                data[cell.row - d[0].row][cell.column - d[0].column] = value;
            });
    
            return data;
        }
    
        return {
            parse: function(file) {
                return extractFiles(file).pipe(function(files) {
                    return extractData(files);
                });
            }
        }
    })();
    
    /*
    依赖于jQuery、下划线.js、Async.js(https://github.com/caolan/async),和zip.js(http://gildas-lormeau.github.com/zip.js).
    仅在OS X上的Chrome中测试。
    调用xlsxParser.parse(file),其中file是file的实例。例如(未经测试):
    document.ondrop=函数(e){
    var file=e.dataTransfer.files[0];
    解析(文件)。然后(函数(数据){
    控制台日志(数据);
    },函数(err){
    console.log('error',err);
    });
    }
    */
    xlsxParser=(函数(){
    函数提取文件(文件){
    var deferred=$.deferred();
    createReader(新的zip.BlobReader(文件),函数(读取器){
    reader.getEntries(函数(条目){
    reduce(entries,{},函数(memo,entry,done){
    var files=['xl/worksheets/sheet1.xml','xl/sharedStrings.xml'];
    if(files.indexOf(entry.filename)=-1)返回done(null,memo);
    entry.getData(新的zip.TextWriter(),函数(数据){
    memo[entry.filename.split('/').pop()]=数据;
    完成(空,备忘录);
    });
    },函数(错误,文件){
    如果(错误)延迟。拒绝(错误);
    否则延迟。解析(文件);
    });
    });
    },函数(错误){deferred.reject(error);});
    延迟返回。承诺();
    }
    函数提取数据(文件){
    var sheet=$(文件['sheet1.xml']),
    字符串=$(文件['sharedStrings.xml']),
    数据=[];
    var colToInt=函数(col){
    变量字母=[,“A”,“B”,“C”,“D”,“E”,“F”,“G”,“H”,“I”,“J”,“K”,“L”,“M”,“N”,“O”,“P”,“Q”,“R”,“S”,“T”,“U”,“V”,“W”,“X”,“Y”,“Z”];
    变量列=$.trim(列).split('');
    var n=0;
    对于(变量i=0;i
    您可以使用

    加载文件后,可以使用支持某些excel输出格式(如csv/xlsx)的库解析内容

    这里有几个选择

      /*
          Relies on jQuery, underscore.js, Async.js (https://github.com/caolan/async), and zip.js (http://gildas-lormeau.github.com/zip.js).
          Tested only in Chrome on OS X.
      
          Call xlsxParser.parse(file) where file is an instance of File. For example (untested):
      
          document.ondrop = function(e) {
              var file = e.dataTransfer.files[0];
              excelParser.parse(file).then(function(data) {
                  console.log(data);
              }, function(err) {
                  console.log('error', err);
              });
          }
      */
      
      xlsxParser = (function() {
          function extractFiles(file) {
              var deferred = $.Deferred();
      
              zip.createReader(new zip.BlobReader(file), function(reader) {
                  reader.getEntries(function(entries) {
                      async.reduce(entries, {}, function(memo, entry, done) {
                          var files = ['xl/worksheets/sheet1.xml', 'xl/sharedStrings.xml'];
                          if (files.indexOf(entry.filename) == -1) return done(null, memo);
      
                          entry.getData(new zip.TextWriter(), function(data) {
                              memo[entry.filename.split('/').pop()] = data;
                              done(null, memo);
                          });
                      }, function(err, files) {
                          if (err) deferred.reject(err);
                          else deferred.resolve(files);
                      });
                  });
              }, function(error) { deferred.reject(error); });
      
              return deferred.promise();
          }
      
          function extractData(files) {
              var sheet = $(files['sheet1.xml']),
                  strings = $(files['sharedStrings.xml']),
                  data = [];
      
              var colToInt = function(col) {
                  var letters = ["", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
                  var col = $.trim(col).split('');
      
                  var n = 0;
      
                  for (var i = 0; i < col.length; i++) {
                      n *= 26;
                      n += letters.indexOf(col[i]);
                  }
      
                  return n;
              };
      
              var Cell = function(cell) {
                  cell = cell.split(/([0-9]+)/);
                  this.row = parseInt(cell[1]);
                  this.column = colToInt(cell[0]);
              };
      
              var d = sheet.find('dimension').attr('ref').split(':');
              d = _.map(d, function(v) { return new Cell(v); });
      
              var cols = d[1].column - d[0].column + 1,
                  rows = d[1].row - d[0].row + 1;
      
              _(rows).times(function() {
                  var _row = [];
                  _(cols).times(function() { _row.push(''); });
                  data.push(_row);
              });
      
              sheet.find('sheetData row c').each(function(i, c) {
                  var $cell = $(c),
                      cell = new Cell($cell.attr('r')),
                      type = $cell.attr('t'),
                      value = $cell.find('v').text();
      
                  if (type == 's') value = strings.find('si t').eq(parseInt(value)).text();
      
                  data[cell.row - d[0].row][cell.column - d[0].column] = value;
              });
      
              return data;
          }
      
          return {
              parse: function(file) {
                  return extractFiles(file).pipe(function(files) {
                      return extractData(files);
                  });
              }
          }
      })();