JS控制Excel導入導出

背景:

? ? ? ?本來是打算使用ActiveXObject來處理Excel,后面發(fā)現(xiàn)谷歌瀏覽器居然用不了這個對象;也怪我才疏學淺,百度了之后發(fā)現(xiàn)這玩意是IE的一個黑科技,其它瀏覽器居然用不了?!。所以采用xlsx.full.min.js插件來處理這類問題。(簡書.YZJGOOD原創(chuàng)文章,轉載請注明出處)

導入(需要xlsx.full.min.js)

html:

<!--by yzjgood 前臺按鈕-->

<div class="button_su" id="zhuangzai">

? ? ? ? <a href="#" class="button_su_inner">

? ? ? ? ? <span class="button_text_container">

? ? ? ? ? ? 裝載數(shù)據

? ? ? ? ? </span>

? ? ? ? </a>

?</div>

<input id="zhenzhuangzai" type="file" onchange="impexcel(this)" style="display: none;" />



JS:

// by yzjgood 通過JQuery獲取元素觸發(fā)函數(shù)

$(function(){

? ? $("#zhuangzai").click(function(){

? ? ? ? $("#zhenzhuangzai").trigger("click");

? ? ? });

? });



var wb;// 讀取完成的數(shù)據

? ? // 導入

? ? function impexcel(obj) {

? ? ? ? if (!obj.files) {

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? var f = obj.files[0];

//新建文件讀取

? ? ? ? var reader = new FileReader();

? ? ? ? reader.onload = function(e) {

? ? ? ? ? ? var data = e.target.result;

? ? ? ? ? ? //將文件讀取為二進制字符串

? ? ? ? ? ? wb = XLSX.read(data, {type : 'binary'});

? ? ? ? ? ?console.log(wb.SheetNames[0]);

? ? ? ? ????// wb.SheetNames[0]是獲取Sheets中第一個Sheet的名字

? ? ? ? ????// wb.Sheets[Sheet名]獲取第一個Sheet的數(shù)據

????????????//數(shù)組形式輸出數(shù)據

????????????var arr=XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);

????????????console.log(arr);

????????????for(var key in arr){

????????????????//輸出下角標

? ? ? ? ? ? ? ? //console.log(key);

????????????????//輸出每個元素(對象形式)

????????????????console.log(key,arr[key]);

????????????????//輸出每個元素的值(數(shù)組形式)

????????????????console.log(Object.values(arr[key]));

????????????????//將數(shù)組轉化為字符串以“,”分割(字符串形式)

????????????????var strsub=Object.values(arr[key]).toString();

????????????????console.log(strsub);

????????????}

????????????//字符串形式輸出(原模原樣的將數(shù)組對象轉為字符串)

? ? ? ? ????var str=JSON.stringify(arr);

????????????console.log(str);

? ? ? ? ????};

? ? ? ? ????reader.readAsBinaryString(f);

? ????? }





導出(需要xlsx.full.min.js):

“導出”這個功能查閱了了很多資料,經過測試以下方法真實可用,分享給廣大好友。

<!DOCTYPE html>

<html>

? ? <head>

? ? ? ? <meta charset="UTF-8">

? ? ? ? <title></title>


? ? </head>

<body>

? ? <button onclick="downloadExl(jsono)">導出 Excel</button>

? ? <script src="xlsx.full.min.js"></script>

? ? <!--調用FileSaver的saveAs函數(shù)也可以替代 a 標簽實現(xiàn)文件下載-->

? ? <!-- <script src = "./FileSaver.min.js"></script> -->

? ? <script>

? ? ? ? //如果使用 FileSaver.js 就不要同時使用以下函數(shù)

? ? ? ? function saveAs(obj, fileName) {

? ? ? ? ? ? //當然可以自定義簡單的下載文件實現(xiàn)方式

? ? ? ? ? ? var tmpa = document.createElement("a");

? ? ? ? ? ? tmpa.download = fileName || "下載";

? ? ? ? ? ? tmpa.href = URL.createObjectURL(obj);

? ? ? ? ? ? //綁定a標簽

? ? ? ? ? ? tmpa.click();

? ? ? ? ? ? //模擬點擊實現(xiàn)下載

? ? ? ? ? ? setTimeout(function () {

? ? ? ? ? ? //延時釋放

? ? ? ? ? ? ? ? URL.revokeObjectURL(obj);

? ? ? ? ? ? ? ? //用URL.revokeObjectURL()來釋放這個object URL

? ? ? ? ? ? }, 100);

? ? ? ? }

? ? ? ? var jsono = [

? ? ? ? ? ? { //測試數(shù)據1

? ? ? ? ? ? ? ? "姓名" : "Condor Hero",

? ? ? ? ? ? ? ? "年齡" : 18 ,

? ? ? ? ? ? ? ? "體重" : "60kg"

? ? ? ? ? ? },

? ? ? ? ? ? { //測試數(shù)據2

? ? ? ? ? ? ? ? "姓名" : "標標",

? ? ? ? ? ? ? ? "年齡" : 34 ,

? ? ? ? ? ? ? ? "體重" : "70kg"

? ? ? ? ? ? },

? ? ? ? ? ? { //測試數(shù)據3

? ? ? ? ? ? ? ? "姓名" : "老馮",

? ? ? ? ? ? ? ? "年齡" : 54 ,

? ? ? ? ? ? ? ? "體重" : "80kg",

? ? ? ? ? ? ? ? "性別" : "女"

? ? ? ? ? ? }

? ? ? ? ];

? ? ? ? const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };//這里的數(shù)據是用來定義導出的格式類型

? ? ? ? function downloadExl(data, type) {

? ? ? ? ? ? const wb = { SheetNames: ['Sheet1'], Sheets: {}, Props: {} };

? ? ? ? ? ? wb.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(data);

? ? ? ? ? ? //通過json_to_sheet轉成單頁(Sheet)數(shù)據

? ? ? ? ? ? saveAs(new Blob([s2ab(XLSX.write(wb, wopts))], { type: "application/octet-stream" }), "這里是下載的文件名" + '.' + (wopts.bookType=="biff2"?"xls":wopts.bookType));

? ? ? ? }

? ? ? ? function s2ab(s) {

? ? ? ? ? ? if (typeof ArrayBuffer !== 'undefined') {

? ? ? ? ? ? ? ? var buf = new ArrayBuffer(s.length);

? ? ? ? ? ? ? ? var view = new Uint8Array(buf);

? ? ? ? ? ? ? ? for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;

? ? ? ? ? ? ? ? return buf;

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? var buf = new Array(s.length);

? ? ? ? ? ? ? ? for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;

? ? ? ? ? ? ? ? return buf;

? ? ? ? ? ? }

? ? ? ? }

? ? </script>

</body>

</html>

? 好的,這次的分享就到這里,謝謝!

(簡書.YZJGOOD原創(chuàng)文章,轉載請注明出處)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容