問題
- 實測發現用tcp讓go進程傳數組給node進程處理,傳輸速度太慢了,go解析80M的文件只需要1分鐘,而傳輸數據用了3分鐘,這實在太蠢了,所以打算用go直接處理數組生成文件。
- 需要增加新功能批量生成快遞單打印模板,大概像小灰狼軟件的功能,根據一個信息彙總表,批量生成透明的文字模板圖片
軟件界面大概這樣子:
思路
- 使用go語言重寫一遍之前node處理數組生成文件的邏輯
- 寫一個快遞單頁面,使用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