vue+exceljs+file-saver導(dǎo)出excel文件加水印

1 安裝依賴(lài)

npm install file-saver --save
npm install exceljs 

2 在plugins文件夾下創(chuàng)建creatWsSheet.js文件

image.png
/**
 *
 * 導(dǎo)出 excel(帶水颖) 公共方法
 * @param header v 為頭无蜂,k 為對(duì)應(yīng) data 數(shù)據(jù)的 name
 * 例:
    const header = [
      {
        k: 'region',
        v: '所屬區(qū)域',
      }
    ]
 * @param data 要導(dǎo)出的數(shù)據(jù)
    例:
    const data = [
      {
        region:'廣州'
      },
      {
        region:'深圳'
      }
    ]
 * @param filename 導(dǎo)出的 excel 文件名稱(chēng)
 * @param sheetName 指定第一個(gè)工作表的名稱(chēng)
 * @param staff 水印名稱(chēng)
 * @param params 導(dǎo)出多個(gè)工作表
 * 格式為:
 * [{header:[],data:[],sheetName:''}]
 * @returns
 */
 import { saveAs } from 'file-saver';
const ExcelJS = require('exceljs');
/* eslint-disable */
 export const createWsSheet = (
    header, 
    columns, 
    dataList, 
    staff,
    filename,
) => {
    if (!((header && dataList) && (header.length && dataList.length))) {
        // Message.error('導(dǎo)出失敗');
        return;
    }
    const EXCEL_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8";
    
    // 創(chuàng)建工作簿
    const workbook = new ExcelJS.Workbook();
    workbook.created = new Date()
    workbook.modified = new Date()
    // 獲取水印
    const base64 = setWatermark(staff);
    const imageId1 = workbook.addImage({ base64, extension: 'png' });
    // 創(chuàng)建帶有紅色標(biāo)簽顏色的工作表
    let worksheet = workbook.addWorksheet('Sheet1', {  //新建工作表
      views: [{ state: 'frozen', xSplit:0, ySplit: 2}], // 凍結(jié)視圖:xSplit:凍結(jié)多少列

  });
    worksheet.properties.defaultColWidth = 14
      worksheet.columns = columns
      worksheet.columns.forEach(function (column) {
        var dataMax = 0;
        column.eachCell({ includeEmpty: true }, function (cell) { 
          dataMax = cell.value?cell.value.toString().length:0;
          if(dataMax <= (column.header.length+2) ){
              if(column.width > dataMax){
                  //retain its default width
              } else {
                  column.width = column.header.length+3;
              }
          } else {
              column.width = dataMax+3;
             column.header.length = dataMax+3;
          }
          dataMax = 0;
        })
        
      });
    // 添加背景圖片
    worksheet.addBackgroundImage(imageId1);
    worksheet.getRow(1).values = [`${filename}(${staff})`];
    worksheet.mergeCells(1, 1, 1, columns.length) //第1行  第1列  合并到第1行的第n列

    // worksheet.getRow(1).height = 40
    worksheet.getRow(1).eachCell({ includeEmpty: true }, (cell, colNumber) => {
      worksheet.getRow(1).getCell(colNumber).fill = {
        type: 'pattern',
        pattern: 'solid',
        // fgColor: { argb: 'ffd3d3d3' },
        // bgColor: { argb: 'FF0000FF' },
        
      }
      worksheet.getRow(1).getCell(colNumber).font = {
        bold: true,
      }
      worksheet.getRow(1).getCell(colNumber).border = {
        top: { style: 'thin' },
        left: { style: 'thin' },
        bottom: { style: 'thin' },
        right: { style: 'thin' },
      }
    })
    // 添加數(shù)據(jù)
    worksheet.getRow(2).values = []
    worksheet.getRow(2).values = header
    
    // 表頭樣式

    worksheet.getRow(2).eachCell({ includeEmpty: true }, (cell, colNumber) => {
        worksheet.getRow(2).getCell(colNumber).fill = {
          type: 'pattern',
          pattern: 'solid',
          // fgColor: { argb: 'ffd3d3d3' },
          // bgColor: { argb: 'FF0000FF' },
          
        }
        worksheet.getRow(2).getCell(colNumber).font = {
          bold: true,
        }
        worksheet.getRow(2).getCell(colNumber).border = {
          top: { style: 'thin' },
          left: { style: 'thin' },
          bottom: { style: 'thin' },
          right: { style: 'thin' },
        }
       
      })
     
      worksheet.addRows(dataList)
      // 自定義樣式
      worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {
        // if (rowNumber > 2) {
        //   worksheet.getRow(rowNumber).height = 28.6
        // }
        worksheet.getRow(rowNumber).eachCell({ includeEmpty: true }, (cell, colNumber) => {
          // 文字居中
          worksheet.getRow(rowNumber).getCell(colNumber).alignment = {
            vertical: 'middle',
            horizontal: 'center',
            wrapText: true  // 設(shè)置自動(dòng)換行
          }
          //邊框樣式
          worksheet.getRow(rowNumber).getCell(colNumber).border = {
            top: { style: 'thin' },
            left: { style: 'thin' },
            bottom: { style: 'thin' },
            right: { style: 'thin' },
          }
          
        })
      })
      worksheet.columns.forEach((column) => {
         column.width = 20;
      });
      workbook.xlsx.writeBuffer().then((buffer) => {
        const blob = new Blob([buffer], { type: EXCEL_TYPE })
        saveAs(blob, `${filename}.xlsx`)
      })

    
    // Message.success('導(dǎo)出成功');
};
/**
 * 判斷該數(shù)據(jù)是否為空
 * @param data 要判斷的數(shù)據(jù)
 * @returns 布爾值:true/false
 */
const isNull = (data) => {
    return !!data;
}

/**
 * 繪畫(huà)水印
 * @param str 要做出水印的文字
 * @returns Base64
 */
const setWatermark = (str) => {
    let id = '1.23452384164.123412416';

    if (document.getElementById(id) !== null) {
        document.body.removeChild(document.getElementById(id));
    }
    // 創(chuàng)建一個(gè)畫(huà)布
    let can = document.createElement('canvas');
    // 設(shè)置畫(huà)布的長(zhǎng)寬
    can.width = 500;
    can.height = 220;
    let cans = can.getContext('2d');
    // 旋轉(zhuǎn)角度
    cans.rotate(-25 * Math.PI / 180);
    // 設(shè)置字體大小
    cans.font = "300 30px Microsoft JhengHei";
    // 設(shè)置填充繪畫(huà)的顏色、漸變或者模式
    cans.fillStyle = "rgba(130, 142, 162, 0.5)";
    // 設(shè)置文本內(nèi)容的當(dāng)前對(duì)齊方式
    cans.textAlign = 'center';
    // 設(shè)置在繪制文本時(shí)使用的當(dāng)前文本基線(xiàn)
    cans.textBaseline = 'Middle';
    cans.fillText(str, 80, 180);

    const dataURL = can.toDataURL('image/png');
    return dataURL;
}

3 引用

<template>
  <div>
     <div @click="exportExcel"  >導(dǎo)出EXCEL</div>
  </div>
</template>
 <script>
      import { createWsSheet } from '../../../plugins/creatWsSheet'
   export default {
      data() {
        return {
            itemsExcel: [],
          }
      },
 methods: {
      async getDbType() {
      this.applyDb = await getDict({ dicttype: "dbType"});
    },
      //導(dǎo)出報(bào)告
      exportExcel(){
        const header = ["平臺(tái)系統(tǒng)名稱(chēng)", "是否并網(wǎng)", "主機(jī)關(guān)聯(lián)數(shù)據(jù)", "數(shù)據(jù)庫(kù)關(guān)聯(lián)數(shù)據(jù)"]
            const columns = header.map((item) => {
                return {
                  header: item,
                  key: item,
                }
            })
            let itemsExcel = this.watermark == ''  ? this.itemsExcel : this.itemsExcel.slice(0,this.exportNum)  //測(cè)試版加水印罗侯,導(dǎo)出前exportNum條數(shù)據(jù)
            const datas =  itemsExcel.map((item) => {
                let res = {}
                res.平臺(tái)系統(tǒng)名稱(chēng) = item.name
                res.是否并網(wǎng) = item.isonline
                res.主機(jī)關(guān)聯(lián)數(shù)據(jù) = item.host
                res.數(shù)據(jù)庫(kù)關(guān)聯(lián)數(shù)據(jù) = item.db          
                return res
            })
            createWsSheet(header, columns, datas, this.watermark ,'平臺(tái)系統(tǒng)清單');
      },
    }

</script>

4 結(jié)果

image.png

參考資料:
1:https://www.cnblogs.com/0627st/p/17359010.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汤徽,一起剝皮案震驚了整個(gè)濱河市惊窖,隨后出現(xiàn)的幾起案子街氢,更是在濱河造成了極大的恐慌狈定,老刑警劉巖漫雷,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜富,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡降盹,警方通過(guò)查閱死者的電腦和手機(jī)与柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人价捧,你說(shuō)我怎么就攤上這事丑念。” “怎么了结蟋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵脯倚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嵌屎,道長(zhǎng)推正,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任宝惰,我火速辦了婚禮植榕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尼夺。我一直安慰自己尊残,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布淤堵。 她就那樣靜靜地躺著夜郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘勒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天屎即,我揣著相機(jī)與錄音庙睡,去河邊找鬼。 笑死技俐,一個(gè)胖子當(dāng)著我的面吹牛乘陪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雕擂,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啡邑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了井赌?” 一聲冷哼從身側(cè)響起谤逼,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仇穗,沒(méi)想到半個(gè)月后流部,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纹坐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年枝冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡果漾,死狀恐怖球切,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绒障,我是刑警寧澤吨凑,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站端盆,受9級(jí)特大地震影響怀骤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焕妙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一蒋伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焚鹊,春花似錦痕届、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至璧针,卻和暖如春嚷炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探橱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工申屹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隧膏。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓哗讥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胞枕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杆煞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348