使用electron-vue+go寫一個處理excel表格小軟件(3)

問題

  1. 實測發現用tcp讓go進程傳數組給node進程處理,傳輸速度太慢了,go解析80M的文件只需要1分鐘,而傳輸數據用了3分鐘,這實在太蠢了,所以打算用go直接處理數組生成文件。
  2. 需要增加新功能批量生成快遞單打印模板,大概像小灰狼軟件的功能,根據一個信息彙總表,批量生成透明的文字模板圖片
    在這裏插入圖片描述
    在這裏插入圖片描述
    軟件界面大概這樣子:
    在這裏插入圖片描述

思路

  1. 使用go語言重寫一遍之前node處理數組生成文件的邏輯
  2. 寫一個快遞單頁面,使用node-xlsx解析快遞單信息彙總表,將信息定位到固定的快遞單模板頁面上,然後用html2canvas模塊將指定的dom畫成處理成canvas然後生成透明圖片

go重寫node部分的excel處理流程

研究go語法,重寫代碼,處理數組的時候使用切片的append()比較多,具體業務邏輯跟node差不多,重寫完成之後,省去了tcp大量數據傳輸的時間還有很多node進程和go進程溝通成本,拆分80Mexcel文件的時間由之前的5分鐘減少到了2分鐘

html2canvas的使用

/**
 * 將頁面指定節點內容轉爲圖片
 * 1.拿到想要轉換爲圖片的內容節點DOM;
 * 2.轉換,拿到轉換後的canvas
 * 3.轉換爲圖片
 */
generatePicture () {
  const imageDom = this.$refs.imageDom
  const opt = {
    width: imageDom.offsetWidth,
    height: imageDom.offsetHeight,
    scale: 1,
    backgroundColor: null // 透明背景
  }
  return html2canvas(imageDom, opt).then(canvas => {
    // 轉成圖片,生成圖片地址
    const base64Data = canvas.toDataURL().replace(/^data:image\/\w+;base64,/, '')
    const dataBuffer = Buffer.from(base64Data, 'base64')
    // 生成文件夾
    const folderName = '快遞單模板圖'
    const caseNum = this.textObj.caseNum.replace(/2.+?初/, '')
    const addressee = this.textObj.addressee
    let filename = `${caseNum}${addressee}.png`
    let path = `${this.folderPath}/${folderName}/${filename}`
    if (!fs.existsSync(`${this.folderPath}/${folderName}`)) {
      fs.mkdirSync(`${this.folderPath}/${folderName}`)
    }
    let index = 1
    while (fs.existsSync(path)) {
      filename = `${caseNum}${addressee + index++}.png`
      path = `${this.folderPath}/${folderName}/${filename}`
    }
    fs.writeFileSync(path, dataBuffer)
    this.log.text = `成功生成${++this.fileNum}張圖片`
  })
}

遇到的坑

生成的圖片一直是二倍圖,一直找不到是什麼原因,因爲寬高也傳進去了,後面研究源碼發現html2canvas()傳的第二個參數是一個配置對象,如果裏面不傳scale爲1,那麼默認的scale會計算出來是2,那麼生成的圖片會變成二倍圖,所以想要1倍圖的話不要忘記傳配置參數scale: 1

源碼鏈接

electron部分
go部分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章