使用js-xlsx把excel文件转为json数据

前段时间有项目需要把xlsx文件内容转为json数据,作为一位前端同学,在查阅了一些博客文章之后,决定用js-xlsx来实现,但是大佬们分享的代码实现不了我的需求,因此做了一些改动,给有需要的同学做一下参考,也方便自己以后查询。

示例xlsx文件内容


第1行内容为key值,2-N为数据

代码如下

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>
   <script src="http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js"></script>
</head>
<body>
<input type="file" onchange="importf(this)"/>
<pre id="demo"></pre>
<script>
   /*
    FileReader共有4种读取方法:
    1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
    2.readAsBinaryString(file):将文件读取为二进制字符串
    3.readAsDataURL(file):将文件读取为Data URL
    4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
    */
   var wb;//读取完成的数据
   var rABS = true; //是否将文件读取为二进制字符串
   // var replacer = null;
   function replacer(key, value) {
       // console.log(key + ':' + value);
       return value;
   }


   function importf(obj) {//导入
       if (!obj.files) {
           return;
       }
       var f = obj.files[0];
       var reader = new FileReader();
       reader.onload = function (e) {
           var data = e.target.result;
           // console.log(data);
           if (rABS) {
               wb = XLSX.read(btoa(fixdata(data)), {//手动转化
                   type: 'base64'
               });
           } else {
               wb = XLSX.read(data, {
                   type: 'binary'
               });
           }
           var xlsxData = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
           var list1 = getList1(wb);
           xlsxData = AddXlsxData(xlsxData, list1);
           //wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
           //wb.Sheets[Sheet名]获取第一个Sheet的数据
           document.getElementById("demo").innerHTML = JSON.stringify(xlsxData, replacer, '\t');
       };
       if (rABS) {
           reader.readAsArrayBuffer(f);
       } else {
           reader.readAsBinaryString(f);
       }
   }

   function fixdata(data) { //文件流转BinaryString
       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;
   }

   // 获取excel第一行的内容
   function getList1(wb) {
       var wbData = wb.Sheets[wb.SheetNames[0]]; // 读取的excel单元格内容
       var re = /^[A-Z]1$/; // 匹配excel第一行的内容
       var arr1 = [];
       for (var key in wbData) { // excel第一行内容赋值给数组
           if (wbData.hasOwnProperty(key)) {
               if (re.test(key)) {
                   arr1.push(wbData[key].h);
               }
           }
       }
       return arr1;
   }

   // 增加对应字段空白内容
   function AddXlsxData(xlsxData, list1) {
       var addData = null; // 空白字段替换值
       for (let i = 0; i < xlsxData.length; i++) { // 要被JSON的数组
           for (let j = 0; j < list1.length; j++) { // excel第一行内容
               if (!xlsxData[i][list1[j]]) {
                   xlsxData[i][list1[j]] = addData;
               }
           }
       }
       return xlsxData;
   }

</script>
</body>
</html>

网页显示效果


上半张图

然后把内容粘贴到编辑器里就可以生成json文件啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容