js-xlsx 導出Excel表格,樣式設置


  剛剛找到了一個前端導出列表比較不錯的插件js-xlsx ,能夠繼續單元格合並,速度也有了很大提升之后,領導又說,能設置樣式嗎?例如標題字體、居中等等。我查找了相關的資料,js-xlsx這個插件是支持樣式設置的,我安裝網上的方法一一嘗試了下,都沒有作用。最后,通過請教了一位大神,得到了想要的結果。

  1、js-xlsx 插件設置樣式可能需要一起其他三方放文件。他就是xlsx-style。引用其中的xlsx.core.min.js文件。除此之外,還另外加了一些其他的代碼。如下:

(function (win, doc, undefined) {
    var xlsxUtils = (function () { var t = { Binary: { fixdata: function (e) { for (var r = "", t = 0, n = 10240; t < e.byteLength / n; ++t)r += String.fromCharCode.apply(null, new Uint8Array(e.slice(t * n, t * n + n))); return r += String.fromCharCode.apply(null, new Uint8Array(e.slice(t * n))) }, s2ab: function (e) { for (var r = new ArrayBuffer(e.length), t = new Uint8Array(r), n = 0; n != e.length; ++n)t[n] = 255 & e.charCodeAt(n); return r } }, _wb: null, _rABS: !1, import: function (e, r) { this.wb = null; var n = new FileReader; n.onload = function (e) { var n = e.target.result; t._wb = t._rABS ? XLSX.read(btoa(t.Binary.fixdata(n)), { type: "base64" }) : XLSX.read(n, { type: "binary" }), "function" == typeof r && r(t._wb) }, t._rABS ? n.readAsArrayBuffer(e) : n.readAsBinaryString(e) }, getSheetByName: function (e) { return XLSX.utils.sheet_to_json(t._wb.Sheets[e]) }, getSheetByIndex: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; return t.getSheetByName(t._wb.SheetNames[e]) }, export: function (e, r) { var n = null; for (var o in e) { var a = t.format2Sheet(e[o]); n = t.format2WB(a, o, n) } return t.format2Blob(n, r) }, readDataHead: function (e) { var r = {}, t = Array.isArray(e) ? Object.keys(e[0]) : e, n = !0, o = !1, a = void 0; try { for (var i, f = t[Symbol.iterator](); !(n = (i = f.next()).done); n = !0) { var u = i.value; r[u] = u } } catch (e) { o = !0, a = e } finally { try { !n && f.return && f.return() } finally { if (o) throw a } } return r }, format2Sheet: function (e, r, n, o) { o = o || Object.keys(e[0]), r = r || 0, n = n || 0; var a = {}; return e.map(function (e, a) { return o.map(function (o, i) { return Object.assign({}, { v: e[o], position: (i + r > 25 ? t.getCharCol(i + r) : String.fromCharCode(65 + (i + r))) + (a + 1 + n) }) }) }).reduce(function (e, r) { return e.concat(r) }).forEach(function (e, r) { return a[e.position] = { v: e.v } }), a }, format2WB: function (e, r, t, n) { r = r || "mySheet"; var o = Object.keys(e); return t || (t = { Sheets: {}, SheetNames: [] }), t.SheetNames.push(r), t.Sheets[r] = Object.assign({}, e, { "!ref": n || o[0] + ":" + o[o.length - 1] }), t }, format2Blob: function (e, r) { return new Blob([t.Binary.s2ab(XLSX.write(e, { bookType: void 0 == r ? "xlsx" : r, bookSST: !1, type: "binary" }))], { type: "" }) }, getCharCol: function (e) { for (var r = "", t = 0; e > 0;)t = e % 26 + 1, r = String.fromCharCode(t + 64) + r, e = (e - t) / 26; return r } }; return t })();
    win.xlsxUtils = xlsxUtils;
}(window, document))

  可以看出這段代碼是經過壓縮過的,無法解讀。。。。將其復制到一個js文件中,引入該js文件即可。

  2、對下載函數的封裝。s2ab()、saveAs()還和以前的一樣,不需要修改,需要修改的是downloadExl()方法。 可訪問 https://www.cnblogs.com/toyNotes/p/8617483.html 閱讀

/**
 * 導出列表方法
 * @param {*} data  需要導出的數據  數組形式  [[表頭],[數據1],[數據2]...]
 * @param {*} fileName 下載的文件名稱
 * @param {*} titleName 表格標題
 * @param {*} time  表格時間范圍
 * @param {*} keyMap   排序標准
 * @param {*} district   地區名稱
 * @param {*} condition  篩選條件
 * @param {*} specialObj   特殊要求,全站搜索使用
 */
var downloadExl = function(data, fileName,titleName,time = '無',keyMap,district,condition,specialObj = []) {
  const self = this;
    data.unshift({});//空出標題等行
    data.unshift({});
    data.unshift({});
    data.unshift({});
    data = xlsxUtils.format2Sheet(data, 0, 0, keyMap);//偏移3行按keyMap順序轉換
    var wb = xlsxUtils.format2WB(data, undefined, undefined);
    const range = keyMap.length - 1;
    const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };
    var dataInfo = wb.Sheets[wb.SheetNames[0]];

    dataInfo["A1"].v = district + '廣播電視安全播出監管中心'; //設置表格標題
    dataInfo["A2"] = {v: titleName}; //設置表格標題
    dataInfo["A3"] = {v: '日期:' + time}; //設置表格日期
    dataInfo["A4"] = {v: condition}; //設置篩選條件
    dataInfo["!merges"] = [{//合並第一行數據[B1,C1,D1,E1]
          s: {//s為開始
              c: 0,//開始列
              r: 0,//開始取值范圍
          },
          e: {//e結束
              c: range,//結束列
              r: 0//結束范圍
          }
        },{//合並第一行數據[B2,C2,D2,E2]
          s: {//s為開始
              c: 0,//開始列
              r: 1,//開始取值范圍
          },
          e: {//e結束
              c: range,//結束列
              r: 1//結束范圍
          }
      },{//合並第一行數據[B3,C3,D3,E3]
        s: {//s為開始
            c: 0,//開始列
            r: 2,//開始取值范圍
        },
        e: {//e結束
            c: range,//結束列
            r: 2//結束范圍
        }
      },{//合並第一行數據[B3,C3,D3,E3]
        s: {//s為開始
            c: 0,//開始列
            r: 3,//開始取值范圍
        },
        e: {//e結束
            c: range,//結束列
            r: 3//結束范圍
        }
      }
    ];

    if(specialObj){
      let rowNum = 5;
      _.each(specialObj,(data,index)=>{
        if(data.num){
          dataInfo['A' + rowNum].v = data.name + '列表';
          dataInfo['A' + rowNum].s = {  //設置副標題樣式
            font: {
              name: '宋體',
              sz: 14,
              color: {rgb: "#FFFF0000"},
              bold: false,
              italic: false,
              underline: false
            },
            alignment: {
              horizontal: "center" ,
              vertical: "center"
            }
          };
          dataInfo["!merges"].push(
            {
              s: {//s為開始
                c: 0,//開始列
                r: rowNum - 1,//開始取值范圍
            },
            e: {//e結束
                c: range,//結束列
                r: rowNum - 1//結束范圍
            }
          }
          )
          _.each(dataInfo,(data,key)=>{
            if(key.replace(/[^0-9]/ig,"") == (rowNum +1)){

              dataInfo[key].s = {
                font: {
                  name: '宋體',
                  sz: 11,
                  color: {rgb: "#FFFF0000"},
                  bold: true,
                  italic: false,
                  underline: false
                },
                alignment: {
                  horizontal: "center" ,
                  vertical: "center"
                }
              };
            }
          })
          rowNum += data.num + 1;
        }
      })
    }

  dataInfo["A1"].s = {  //設置主標題樣式
      font: {
        name: '宋體',
        sz: 18,
        color: {rgb: "#FFFF0000"},
        bold: true,
        italic: false,
        underline: false
      },
      alignment: {
        horizontal: "center" ,
        vertical: "center"
      }
    };
  dataInfo["A2"].s = {  //設置副標題樣式
      font: {
        name: '宋體',
        sz: 16,
        color: {rgb: "#FFFF0000"},
        bold: false,
        italic: false,
        underline: false
      },
      alignment: {
        horizontal: "center" ,
        vertical: "center"
      }
    };
  dataInfo["A3"].s = {  //設置日期樣式
      font: {
        name: '宋體',
        sz: 11,
        color: {rgb: "#FFFF0000"},
        bold: false,
        italic: false,
        underline: false
      }
    };
  dataInfo["A4"].s = { 
      font: {
        name: '宋體',
        sz: 11,
        color: {rgb: "#FFFF0000"},
        bold: false,
        italic: false,
        underline: false
      }
    };
    if(specialObj.length == 0){
      _.each(dataInfo,(data,key)=>{          //設置表頭樣式      由於表頭是第四行,所以判斷其表格單元格編號是否是 4
        if(key.replace(/[^0-9]/ig,"") == 5){

          dataInfo[key].s = {
            font: {
              name: '宋體',
              sz: 11,
              color: {rgb: "#FFFF0000"},
              bold: true,
              italic: false,
              underline: false
            },
            alignment: {
              horizontal: "center" ,
              vertical: "center"
            }
          };

        }else if(key.replace(/[^0-9]/ig,"") != 1 && key.replace(/[^0-9]/ig,"") != 2 && key.replace(/[^0-9]/ig,"") != 3){
          dataInfo[key].s = {
            font: {
              name: '宋體',
              // sz: 11,
              color: {rgb: "#FFFF0000"},
              // bold: false,
              // italic: false,
              // underline: false
            }
            // alignment: {
            //   horizontal: "center" ,
            //   vertical: "center"
            // }
          };
        }
      })
    }

     self.saveAs(xlsxUtils.format2Blob(wb), fileName +".xlsx");
    };

  這個是我封裝的方法,里面有一些適應不同的導出列表的格式要求。個人覺得還有很大的改進空間,對這個插件的理解有限,歡迎各路大神指點。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM