JS-XLS/X讀取和解析Excel表格文件(xls/xlsx)的JavaScript插件字?jǐn)?shù)8636 · 瀏覽 5546 · 評(píng)論 0
最近有一個(gè)要求,我的一個(gè)項(xiàng)目中解析Excel文件(與xls/xlsx擴(kuò)展)在瀏覽器(使用JavaScript當(dāng)然)。所以我在網(wǎng)上看了一下,發(fā)現(xiàn)了這2個(gè)有用的庫(kù): 讓我們看看他們是如何工作的。 兼容性支持讀取文件格式
支持寫(xiě)文件格式
Demo: http://oss./js-xlsx Source: http:///xlsx JS-XLSJS-XLS的安裝是很簡(jiǎn)單的,在瀏覽器中使用該腳本文件,并使用腳本標(biāo)記加載它: <!-- https://github.com/SheetJS/js-xls/blob/master/xls.js --> <script src="/path/to/xls.js"></script> 對(duì)于Node.js,只要通過(guò)NPM安裝: $ npm install xlsjs
$ node
> require('xlsjs').readFile('excel_file.xls');
然后,我們可以簡(jiǎn)單地使用他們提供的代碼在他們的index.html文件解析和轉(zhuǎn)換的xls文件JSON,CSV或公式為基礎(chǔ)的輸出。 function get_radio_value( radioName ) {
var radios = document.getElementsByName( radioName );
for( var i = 0; i < radios.length; i++ ) {
if( radios[i].checked ) {
return radios[i].value;
}
}
}
function to_json(workbook) {
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = XLS.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(roa.length > 0){
result[sheetName] = roa;
}
});
return result;
}
function to_csv(workbook) {
var result = [];
workbook.SheetNames.forEach(function(sheetName) {
var csv = XLS.utils.make_csv(workbook.Sheets[sheetName]);
if(csv.length > 0){
result.push("SHEET: " + sheetName);
result.push("");
result.push(csv);
}
});
return result.join("\n");
}
function to_formulae(workbook) {
var result = [];
workbook.SheetNames.forEach(function(sheetName) {
var formulae = XLS.utils.get_formulae(workbook.Sheets[sheetName]);
if(formulae.length > 0){
result.push("SHEET: " + sheetName);
result.push("");
result.push(formulae.join("\n"));
}
});
return result.join("\n");
}
var tarea = document.getElementById('b64data');
function b64it() {
var cfb = XLS.CFB.read(tarea.value, {type: 'base64'});
var wb = XLS.parse_xlscfb(cfb);
process_wb(wb);
}
function process_wb(wb) {
var output = "";
switch(get_radio_value("format")) {
case "json":
output = JSON.stringify(to_json(wb), 2, 2);
break;
case "form":
output = to_formulae(wb);
break;
default:
output = to_csv(wb);
}
if(out.innerText === undefined) out.textContent = output;
else out.innerText = output;
}
var drop = document.getElementById('drop');
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
var cfb = XLS.CFB.read(data, {type: 'binary'});
//var arr = String.fromCharCode.apply(null, new Uint8Array(data));
//var cfb = XLS.CFB.read(btoa(arr), {type: 'base64'});
var wb = XLS.parse_xlscfb(cfb);
process_wb(wb);
};
reader.readAsBinaryString(f);
//reader.readAsArrayBuffer(f);
}
}
function handleDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
}
if(drop.addEventListener) {
drop.addEventListener('dragenter', handleDragover, false);
drop.addEventListener('dragover', handleDragover, false);
drop.addEventListener('drop', handleDrop, false);
}
JS代碼很容易理解,它使用了HTML5拖放API允許我們上傳文件然后看他們?yōu)槎M(jìn)制字符串。二進(jìn)制,然后直接傳遞到庫(kù),并進(jìn)一步分析使用此代碼: var cfb = XLS.CFB.read(data, {type: 'binary'});
var wb = XLS.parse_xlscfb(cfb);
最終,WB(Workbook)對(duì)象是處理并轉(zhuǎn)換成需要的格式(JSON,CSV和Excel公式)。這沒(méi)有HTML5拖放文件閱讀器的API,可用于Node.js代碼相同。 注:此模塊不支持xlsx。為了克服這一限制,我們可以通過(guò)同一作者稱為JS-XLSX用另一個(gè)包。 JS-XLSX再次,安裝和使用與上一節(jié)幾乎相同。使用瀏覽器加載jszip.js和xlsx文件: <!-- https://github.com/SheetJS/js-xlsx/blob/master/jszip.js --> <script src="/path/to/jszip.js"></script> <!-- https://github.com/SheetJS/js-xlsx/blob/master/xlsx.js --> <script src="/path/to/xlsx.js"></script> 對(duì)于Node.js,只要通過(guò)NPM安裝: $ npm install xlsx
$ node
> require('xlsx').readFile('excel_file.xlsx');
我們可以再次使用項(xiàng)目中的index.html提供代碼轉(zhuǎn)換xlsx JSON,CSV或公式為基礎(chǔ)的輸出。 function get_radio_value( radioName ) {
var radios = document.getElementsByName( radioName );
for( var i = 0; i < radios.length; i++ ) {
if( radios[i].checked ) {
return radios[i].value;
}
}
}
function to_json(workbook) {
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(roa.length > 0){
result[sheetName] = roa;
}
});
return result;
}
function to_csv(workbook) {
var result = [];
workbook.SheetNames.forEach(function(sheetName) {
var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[sheetName]);
if(csv.length > 0){
result.push("SHEET: " + sheetName);
result.push("");
result.push(csv);
}
});
return result.join("\n");
}
function to_formulae(workbook) {
var result = [];
workbook.SheetNames.forEach(function(sheetName) {
var formulae = XLSX.utils.get_formulae(workbook.Sheets[sheetName]);
if(formulae.length > 0){
result.push("SHEET: " + sheetName);
result.push("");
result.push(formulae.join("\n"));
}
});
return result.join("\n");
}
var tarea = document.getElementById('b64data');
function b64it() {
var wb = XLSX.read(tarea.value, {type: 'base64'});
process_wb(wb);
}
function process_wb(wb) {
var output = "";
switch(get_radio_value("format")) {
case "json":
output = JSON.stringify(to_json(wb), 2, 2);
break;
case "form":
output = to_formulae(wb);
break;
default:
output = to_csv(wb);
}
if(out.innerText === undefined) out.textContent = output;
else out.innerText = output;
}
var drop = document.getElementById('drop');
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
//var wb = XLSX.read(data, {type: 'binary'});
var arr = String.fromCharCode.apply(null, new Uint8Array(data));
var wb = XLSX.read(btoa(arr), {type: 'base64'});
process_wb(wb);
};
//reader.readAsBinaryString(f);
reader.readAsArrayBuffer(f);
}
}
function handleDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
}
if(drop.addEventListener) {
drop.addEventListener('dragenter', handleDragover, false);
drop.addEventListener('dragover', handleDragover, false);
drop.addEventListener('drop', handleDrop, false);
}
為編寫(xiě)這些項(xiàng)目,使我們的任務(wù)更容易寫(xiě)作者的道具。如果你有什么問(wèn)題,請(qǐng)隨時(shí)問(wèn)他們的意見(jiàn)。 相關(guān)鏈接 |
|
|