Javascript Excel表

Javascript Excel表,javascript,excel,html-parsing,Javascript,Excel,Html Parsing,我有一个HTML页面,上面有一些图表。我想做的是编写一个加载javascript函数,它将从excel工作表中读取值,将它们存储在变量中,并在html页面上使用这些值。我的问题是,是否有javascript API可以像解析excel表格单元格中的值那样处理excel表格???您可以尝试使用ActiveXObject从excel读取数据。有多种实用方法 查看此链接 我用javascript编写了一个xlsx解析器 /* 依赖于jQuery、下划线.js、Async.js(https://gith

我有一个HTML页面,上面有一些图表。我想做的是编写一个加载javascript函数,它将从excel工作表中读取值,将它们存储在变量中,并在html页面上使用这些值。我的问题是,是否有javascript API可以像解析excel表格单元格中的值那样处理excel表格???

您可以尝试使用ActiveXObject从excel读取数据。有多种实用方法

查看此链接


我用javascript编写了一个xlsx解析器

/*
依赖于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
这里有很多问题。1.你知道你不能在用户的本地机器上获取文件,所以他们必须上传到服务器上吗?2.这在很大程度上取决于这是xls还是xlsx…这是一个奇怪的想法!你为什么不把电子表格上传到服务器端,用你的服务器端语言支持的一个像样的库来阅读呢?你为什么不“另存为:xml”,然后解析数据来检索你想要的信息。嗯,好吧,它的xlsx……。是的,excel表也会在服务器上,在html页面的本地,它将在需要时更新是的,但activeX只能用于IE,对吗?我想去狩猎旅行
/*
    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);
            });
        }
    }
})();