我使用 js-xlsx 插件从 excel 文件中解析 JSON。我正在从多个 excel 文件中解析 JSON,并且我想使用相同的解析函数将结果加载到多个下拉列表中。我有两个上传文件输入和两个相应的下拉列表。我能够获得xlFileName
并且sheetNames
仅适用于第一个下拉列表。如果我想使用第二个文件上传输入上传不同的 excel 文件并想在第二个下拉列表中加载相应xlFileName
的sheetNames
excel 文件,我该如何使用相同的 JS 函数来实现这一点。提前致谢。(我已经尝试使用 switch case 来获取上传文件输入的 id,但不知道如何正确完成)
HTML:
<input type="file" style="display:none;" name="files" id="inputFile1" />
<span data-bind="text: fileNameXl1"></span>
<select id="dropdown3" required="required" class="form-control select2" data-bind="options:xlnames,value:selectedSheetname1,
selectedOptions: chosenFile,optionsCaption:'Please Select Sheet Name'">
</select>
<input type="file" style="display:none;" name="files" id="inputFile2" />
<span data-bind="text: fileNameXl1"></span>
<h4 class="header-title m-t-0 m-b-30">Select Sheet name(Macro):</h4>
<select id="dropdown4" required="required" class="form-control select2" data-bind="options:xlnames1,value:selectedSheetname2,
selectedOptions: chosenFile,optionsCaption:'Please Select Sheet Name'">
</select>
JS:
self.selectedSheetname1 = ko.observable("");
self.selectedSheetname2 = ko.observable();
self.selectedSheetname3 = ko.observable();
self.chosenFile = ko.observable();
self.xlnames = ko.observableArray([]);
self.xlnames1 = ko.observableArray([]);
self.fileNameXl1 = ko.observable();
self.handleFile = function(e) {
var files = e.target.files;
var f = files[0];
{
var reader = new FileReader();
xlFileName = f.name;
self.fileNameXl1(xlFileName);
console.log(xlFileName);
reader.onload = function(e) {
if(typeof console !== 'undefined') console.log("onload", new Date());
var data = e.target.result;
var wb;
var arr = fixdata(data);
wb = X.read(btoa(arr), {type: 'base64'});
process_wb(wb);
}
}
reader.readAsArrayBuffer(f);
};
self.fixdata = function(data) {
var o = "", l = 0, w = 10240;
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
return o;
};
self.process_wb = function(wb) {
var output = "";
output = JSON.stringify(to_json(wb), 2, 2);
var parse = JSON.parse(output);
sheetNames = Object.keys(parse);
console.log("this is output");
console.log(sheetNames);
self.xlnames(sheetNames);
if(typeof console !== 'undefined') console.log("output", new Date());
};
self.to_json = function(workbook) {
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = X.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(roa.length > 0){
result[sheetName] = roa;
}
});
return result;
};
self.loadSheetNamesB25 = function(e){
self.xlnames([]);
self.handleFile(e);
};
self.loadSheetNamesB41 = function(e){
self.xlnames1([]);
self.xlnames2([]);
self.handleFile(e);
};
if(xlf1.addEventListener) xlf1.addEventListener('change', self.loadSheetNamesB25, false);
if(xlf2.addEventListener) xlf2.addEventListener('change', self.loadSheetNamesB41, false);