JS-XLS/X讀取和解析Excel表格文件(xls/xlsx)的JavaScript插件字?jǐn)?shù)8636 · 瀏覽 5546 · 評論 0
最近有一個要求,我的一個項目中解析Excel文件(與xls/xlsx擴(kuò)展)在瀏覽器(使用JavaScript當(dāng)然),。所以我在網(wǎng)上看了一下,發(fā)現(xiàn)了這2個有用的庫: 讓我們看看他們是如何工作的,。 兼容性支持讀取文件格式
支持寫文件格式
Demo: http://oss./js-xlsx Source: http:///xlsx JS-XLSJS-XLS的安裝是很簡單的,在瀏覽器中使用該腳本文件,,并使用腳本標(biāo)記加載它: <!-- https://github.com/SheetJS/js-xls/blob/master/xls.js --> <script src="/path/to/xls.js"></script> 對于Node.js,,只要通過NPM安裝: $ npm install xlsjs $ node > require('xlsjs').readFile('excel_file.xls'); 然后,我們可以簡單地使用他們提供的代碼在他們的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)制,,然后直接傳遞到庫,并進(jìn)一步分析使用此代碼: var cfb = XLS.CFB.read(data, {type: 'binary'}); var wb = XLS.parse_xlscfb(cfb); 最終,,WB(Workbook)對象是處理并轉(zhuǎn)換成需要的格式(JSON,,CSV和Excel公式)。這沒有HTML5拖放文件閱讀器的API,,可用于Node.js代碼相同,。 注:此模塊不支持xlsx,。為了克服這一限制,,我們可以通過同一作者稱為JS-XLSX用另一個包。 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> 對于Node.js,只要通過NPM安裝: $ npm install xlsx $ node > require('xlsx').readFile('excel_file.xlsx'); 我們可以再次使用項目中的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); } 為編寫這些項目,使我們的任務(wù)更容易寫作者的道具,。如果你有什么問題,,請隨時問他們的意見。 相關(guān)鏈接 |
|