使用xlsx尾抑、xlsx-style自定義樣式導出excel

1.安裝依賴xlsx xlsx-style

npm install xlsx xlsx-style --save

2.在對應的vue文件中引入

import XLSX from 'xlsx'
import XLSXD from 'xlsx-style'
// 在引入xlsx-style時會報錯
// This relative modules was not found:  * ./cptable in ./~/xlsx-style/dist/cpexcel.js
// 兩種解決方法:
// 1.找到node_modules\xlsx-style\dist\cpexcel.js 中的 815行的 
 var cpt = require('./cpt' + 'able') 
 // 更改為 
 var cpt = cptable
// 2. 在vue.config.js中修改配置
module.exports = {
 configureWebpack: {
     externals: {
         './cptable': 'var cptable'
     }
 }
}

3.在對應的vue文件中開始導出

// 導出按鈕
<el-button @click="exportHandler">導出</el-button>
// 要導出的數(shù)據(jù)
data() {
  return {
    msgList: [
      { name: '張三', age: 16, sex: '男' },
      { name: '李四', age: 16, sex: '男' },
      { name: '王五', age: 16, sex: '男' }
    ]
  }
}
methods: {
    // 導出方法
  exportHandler() {
    let wb = XLSX.utils.book_new();
    let contentWs = XLSX.utils.json_to_sheet(this.msgList);
    XLSX.utils.book_append_sheet(wb, contentWs, "人員明細表");
    XLSX.writeFile(wb, "人員表.xlsx");
  },
}

基本數(shù)據(jù)導出效果圖


image.png
// 自定義表頭名稱
exportHandler() {
   let wb = XLSX.utils.book_new();
      // 自定義表頭數(shù)據(jù)
      let headers = {
        name: "姓名",
        age: "年齡",
        sex: "性別",
      };
      // 將表頭放入數(shù)據(jù)源前面
      this.msgList.unshift(headers);
      let contentWs = XLSX.utils.json_to_sheet(this.msgList, {
        header: ['name', 'age', 'sex'], // 可自定義表頭順序
        skipHeader: true, // 是否忽略表頭,默認為false
      });
      XLSX.utils.book_append_sheet(wb, contentWs, "人員明細表");
      XLSX.writeFile(wb, "人員表.xlsx");
}

自定義表頭名稱效果圖


image.png
// 自定義標題及合并單元格,設置單元格列寬
exportHandler() {
      let wb = XLSX.utils.book_new();
      let headers = {
        name: "姓名",
        age: "年齡",
        sex: "性別",
      };
      this.msgList.unshift(headers);
      let contentWs = XLSX.utils.json_to_sheet(this.msgList, {
        header: ["name", "age", "sex"],
        skipHeader: true,
        origin: "A2", // 設置插入位置
      });
      // 單獨設置某個單元格內容
      contentWs["A1"] = {
        t: "s",
        v: "人員名單",
      };
      // 設置單元格合并  !merges 為一個對象數(shù)組,每個對象設定了單元格合并的規(guī)則, 
      // {s:{ r: 0, c: 0}, e: { r: 0, c: 2}} 為一個規(guī)則, s: 起始位置, e: 結束位置, r: 行, c: 列
      contentWs["!merges"] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }];
      // 設置列寬
      contentWs["!cols"] = [{ wch: 50 }, { wch: 20 }, { wch: 40 }];
      XLSX.utils.book_append_sheet(wb, contentWs, "人員明細表");
      XLSX.writeFile(wb, "人員表.xlsx");
}
image.png
// 指定單元格設置鏈接,目前僅使用xlsx寫入文件時生效
contentWs["A1"] = {
        t: "s",
        v: "人員名單",
        // 設置鏈接,及提示
        l: {
          Target: "http://www.baidu.com",
          Tooltip: "點擊此鏈接跳轉到百度",
        }
}

設置單元格鏈接效果圖


image.png
// 給單元格自定義樣式
exportHandler() {
  let wb = XLSX.utils.book_new();
      let headers = {
        name: "姓名",
        age: "年齡",
        sex: "性別",
      };
      this.msgList.unshift(headers);
      let contentWs = XLSX.utils.json_to_sheet(this.msgList, {
        header: ["name", "age", "sex"],
        skipHeader: true,
        origin: "A2",
      });
      // 單獨設置某個單元格內容
      contentWs["A1"] = {
        t: "s",
        v: "人員名單",
        l: {
          Target: "http://www.baidu.com",
          Tooltip: "點擊此鏈接跳轉到百度",
        },
        // 自定義樣式
        s: {
          font: {
            name: "宋體",
            sz: 40,
            bold: true,
            color: { rgb: "FFFFAA00" },
          },
          alignment: {
            horizontal: "center",
            vertical: "center",
          },
          fill: { bgcolor: { rgb: "ffff00" } },
        },
      };
      // 設置單元格自動換行,目前僅對非合并單元格生效
      contentWs["A3"].s = {
          alignment: {
              wrapText: true, // 設置單元格換行
              indent: 1 // 設置單元格縮進
      }
      contentWs["!merges"] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }];
      contentWs["!cols"] = [{ wch: 50 }, { wch: 20 }, { wch: 40 }];
      XLSX.utils.book_append_sheet(wb, contentWs, "人員明細表");
      // 使用xlsx-style寫入文件方式,使得自定義樣式生效
      const tmpDown = new Blob([
        this.s2ab(
          XLSXD.write(wb, {
            bookType: "xlsx",
            bookSST: true,
            type: "binary",
            cellStyles: true,
          })
        ),
      ]);
      this.downExcel(tmpDown, "人員表.xlsx");
},
// 自定義下載文件方法
downExcel(obj, fileName) {
      const a_node = document.createElement("a");
      a_node.download = fileName;
      if ("msSaveOrOpenBlob" in navigator) {
        window.navigator.msSaveOrOpenBlob(obj, fileName);
      } else {
        a_node.href = URL.createObjectURL(obj);
      }
      a_node.click();
      // 
      setTimeout(() => {
        URL.revokeObjectURL(obj);
      }, 2000);
},
// 文件流轉換
s2ab(s) {
      if (typeof ArrayBuffer !== "undefined") {
        const buf = new ArrayBuffer(s.length);
        const view = new Uint8Array(buf);
        for (let i = 0; i != s.length; ++i) {
          view[i] = s.charCodeAt(i) & 0xff;
        }
        return buf;
      } else {
        const buf = new Array(s.length);
        for (let i = 0; i != s.length; ++i) {
          buf[i] = s.charCodeAt(i) & 0xff;
        }
        return buf;
      }
    },

自定義單元格樣式效果圖

image.png

以上展示excel的基本導出及部分自定義樣式.
單元格對象
image.png

單元格數(shù)據(jù)類型, t 的可選值
Z)5N6$WN9PTW5KBODAR2)CR.png

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載揭绑,如需轉載請通過簡信或評論聯(lián)系作者馏鹤。
  • 序言:七十年代末米绕,一起剝皮案震驚了整個濱河市垢村,隨后出現(xiàn)的幾起案子割疾,更是在濱河造成了極大的恐慌,老刑警劉巖嘉栓,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏榕,死亡現(xiàn)場離奇詭異,居然都是意外死亡侵佃,警方通過查閱死者的電腦和手機麻昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馋辈,“玉大人抚芦,你說我怎么就攤上這事÷趺” “怎么了叉抡?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長答毫。 經常有香客問我褥民,道長,這世上最難降的妖魔是什么洗搂? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任消返,我火速辦了婚禮,結果婚禮上耘拇,老公的妹妹穿的比我還像新娘撵颊。我一直安慰自己,他們只是感情好驼鞭,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布秦驯。 她就那樣靜靜地躺著,像睡著了一般挣棕。 火紅的嫁衣襯著肌膚如雪译隘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天洛心,我揣著相機與錄音固耘,去河邊找鬼。 笑死词身,一個胖子當著我的面吹牛厅目,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼损敷,長吁一口氣:“原來是場噩夢啊……” “哼葫笼!你這毒婦竟也來了?” 一聲冷哼從身側響起拗馒,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤路星,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诱桂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洋丐,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年挥等,在試婚紗的時候發(fā)現(xiàn)自己被綠了友绝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肝劲,死狀恐怖迁客,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情辞槐,我是刑警寧澤哲泊,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站催蝗,受9級特大地震影響,放射性物質發(fā)生泄漏育特。R本人自食惡果不足惜丙号,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缰冤。 院中可真熱鬧犬缨,春花似錦、人聲如沸棉浸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迷郑。三九已至枝恋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗡害,已是汗流浹背焚碌。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霸妹,地道東北人十电。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹃骂。 傳聞我的和親對象是個殘疾皇子台盯,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容