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

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

目前我已经尝试使用下面的代码,但它只能在IE浏览器的IE浏览器Internet选项ActiveXObject的一些变化。 它不工作在浏览器的其余部分。

<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> 

请build议一些解决scheme,以便它可以在所有浏览器中运行。

在浏览器中通常不可能通过JavaScript读/写任何文件。 所以没有任何额外的插件,您将无法从浏览器读取/写入Excel文件。 Excel的ActiveX对象可以让你做到这一点,但只有IE支持ActiveX对象。

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

首先,你为什么要这样做? 你能给个用例吗? 也许有比你想要的更好的select。

UPDATE

您将不得不将excel文件传递给服务器,并在服务器端读取excel(例如在一个servlet中)。

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

在服务器端,您可能需要使用Apache Commonsfile upload 。

一旦你有了这个文件(或者一个stream),你就可以使用Apache POI HSSF / XSSF来parsing这个文件,然后把这个数据更新到一个数据库或者把它传回给一个JSP

xlsx电子表格是一个带有一堆xml文件的zip文件。 使用类似zip.js的东西,你可以提取XML文件并在浏览器中parsing它们。 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); }); } } })(); 

我一直这样做 – 我的原型旨在让利益相关者修改一个excel并让它填充html原型,通常没有服务器。

  1. 将excel保存为XML
  2. 通过AJAX加载XML并parsing出结构

1 )这里是一个方便的buttonmacros,我把我的Excel文件,允许无痛的保存为XML(和重新保存为XLS):

  Sub SaveAndExportXML() Dim fname As String Dim fnamexml As String fname = ThisWorkbook.FullName fnamexml = Replace(fname, ".xls", ".xml", 1, 1, vbTextCompare) If MsgBox("Will save the following (runtime XML and source XLS) files: " & vbNewLine & "XML: " & fnamexml & vbNewLine & "Src: " & fname & vbNewLine & vbNewLine & "Ok? If so, please click Yes here and on the next 3 prompts...", vbYesNo) = vbNo Then Exit Sub ActiveWorkbook.SaveAs Filename:=fnamexml, FileFormat:=xlXMLSpreadsheet, ReadOnlyRecommended:=False, CreateBackup:=False 're-save as xls: ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False End Sub 

2 )parsingJS比较复杂,前提很简单。 将会有像Worksheet,Table,Row,Cell和Data这样的XML对象。 还有一个名为ss的XML属性:Index我有时候觉得很方便。

您可以使用HTML5 File API在大多数现代浏览器中加载和打开文件客户端

一旦你加载了文件,你可以用一个支持某些excel输出格式的库(比如csv / xlsx)来parsing内容。

这里有几个选项…

  • CSV
  • XLSX / CSV / XML