从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>
请建议一些解决方案,以便它适用于所有浏览器。
答案 0 :(得分:8)
xlsx电子表格是一个包含大量xml文件的zip文件。使用zip.js之类的东西,您可以提取xml文件并在浏览器中解析它们。 xlsx.js这样做。 Here's my simple example。为方便起见,在这里复制:
/*
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);
});
}
}
})();
答案 1 :(得分:1)
通常无法在浏览器中通过JavaScript读取/写入任何文件。因此,如果没有任何其他插件,您将无法从浏览器读取/写入Excel文件。 Excel的ActiveX对象允许您这样做,但只有IE支持ActiveX对象。
其他浏览器可能还有其他插件,但我不知道。
首先,你为什么要那样做?你能用一个用例吗?也许有比你正在尝试的更好的选择。
<强>更新强>
您必须将excel文件传递到服务器并在服务器端读取excel(例如在servlet中)。
您必须在多部分表单中使用JSP中的<input type='file'>
<form name="myForm" action="myServlet" enctype="multipart/form-data" method="post">
在服务器端,您可能想要使用Apache Commons File Upload。
获得文件(或其上的流)后,您可以使用Apache POI HSSF/XSSF解析文件,然后将数据更新到数据库或将其传递回JSP
答案 2 :(得分:1)
我一直这样做 - 我的原型旨在让利益相关者修改excel并让它填充html原型,通常没有服务器。
( 1 )这是一个方便的按钮宏,我放在我的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 )解析JS更复杂但前提很简单。将有工作表,表,行,单元格和数据等XML对象。还有一个名为ss的索引属性:索引我有时会觉得很方便。
答案 3 :(得分:1)
您可以使用most modern browsers
在HTML5 File API中加载和打开文件客户端加载文件后,您可以使用支持某些Excel输出格式(例如csv / xlsx)的库来解析内容。
以下是几个选项......
答案 4 :(得分:1)
这个适用于所有主流浏览器。
https://catamphetamine.github.io/read-excel-file/
import readXlsxFile from 'read-excel-file'
const input = document.getElementById('input')
input.addEventListener('change', () => {
readXlsxFile(input.files[0]).then((data) => {
// `data` is an array of rows
// each row being an array of cells.
})
})
data
在上面的示例中,schema
是原始字符串数据。
通过传递Android Studio
参数,可以使用严格模式将其解析为JSON。有关此示例,请参阅API文档。