使用electron-vue+go写一个处理excel表格小软件(3)

3 篇文章 0 订阅
2 篇文章 0 订阅

问题

  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部分

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值