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

Jyo*_*oti 8 javascript excel jsp

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

目前我尝试使用下面的代码,但它只在IE中工作,对ActiveXObject的IE互联网选项进行了一些更改.它不适用于其他浏览器.

<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>
Run Code Online (Sandbox Code Playgroud)

请建议一些解决方案,以便它适用于所有浏览器.

Tre*_*xon 8

xlsx电子表格是一个zip文件,里面有一堆xml文件.使用zip.js之类的东西,您可以提取xml文件并在浏览器中解析它们.xlsx.js这样做.这是我的简单例子.为方便起见,在这里复制:

/*
    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);
            });
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)


Niv*_*vas 1

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

其他浏览器可能有其他插件,但我不知道。

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

更新

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

您必须<input type='file'>在多部分表单内的 JSP 中使用 a
<form name="myForm" action="myServlet" enctype="multipart/form-data" method="post">

在服务器端,您可能需要使用Apache Commons File Upload

获得文件(或其上的流)后,您可以使用Apache POI HSSF/XSSF等解析文件,然后将数据更新到数据库或将其传回 JSP