ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1434|回复: 8

[分享] vba与js宏生成条形码和二维码的可执行文件exe

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-8 23:53 | 显示全部楼层 |阅读模式
本帖最后由 仙女配凡人 于 2023-5-9 20:53 编辑

    Excel vba 或者 WPS JavaScript 要批量生成二维码或者条形码,一般通过网络请求的方式从网站上获取,对于不能联网的电脑非常麻烦。

    另类的解决办法:利用bwip-js包,通过node.js环境搭建本地服务器 ,将其打包成exe可执行文件,就可以通过本地获取二维码、条形码图片,实测扫码枪、盘点机可以正确识别。支持win7 64位及以上系统,32位系统没测试过不清楚。

    bwip-js支持:Code11、Code128、Code39、Code93、EAN-13、QR Code(二维码)、ISBN、ISMN、PDF417 、Datamatrix等105种类型
    bwip-js文档地址:https://www.npmjs.com/package/bwip-js

    案例文件及jsbar.exe下载链接:https://share.weiyun.com/BdtDs8zw 密码:ij7bk5

使用方法


运行jsbar.exe,就会在本地搭建服务器,主机地址为:http://localhost:3031/
然后加上必要的参数即可返回需要的图片,例如生成 ISBN 码
http://localhost:3031/?bcid=isbn&text=978-1-56581-231-4+52250&includetext&guardwhitespace

参数
必须/可选
数据类型
说明
bcid
必须
string|number
指定生成一维码或二维码的类型
text
必须
string|number
指定要编码的值
textsize
可选
integer
文本的字体大小(以磅为单位)
textgaps
可选
integer
文本间距
textxalign
可选
string
文本水平对齐位置center、left、right
textyalign
可选
string
文本垂直对齐位置center、below、above
includetext
可选
显示text参数的值,如果省略该参数则不显示
scaleX
可选
integer
x轴缩放比例,必须大于0,默认值为2
scaleY
可选
integer
y轴缩放比例,必须大于0,默认值为scaleX参数的值
scale
可选
integer
x, y轴等比缩放,必须大于0
rotate
可选
string
旋转方向,N正常默认值;R顺时针90;L逆时针90;I水平翻转
height
可选
number
指定高度,以英寸为单位
width
可选
number
指定宽度,以英寸为单位
其他参数请参考bwip-js文档

在WPS宏编辑器、VBA编辑器中,用 Shapes.AddPicture 方法即可向工作表插入需要的条形码、二维码图片
例如在WPS宏编辑器中,制作code128条形码的标签,并导出为PDF文件:
  1. function CommandButton1_Click() {
  2.   let wb = ThisWorkbook,
  3.     sht1 = wb.Sheets(1),
  4.     sht2 = wb.Sheets(2),
  5.     data = sht1.Range('A2').CurrentRegion.Value2,
  6.     today = dateFormat('yyyy-mm-dd'),
  7.     path = ThisWorkbook.Path + '\\',
  8.     fileName = path + `lable${dateFormat('yyyymdHMS')}.pdf`,
  9.     pid = Shell(path + 'jsbar.exe', jsHide); //启动jsbar.exe

  10.   //删除原条形码
  11.   for (let i of sht2.Shapes) i.Delete();

  12.   //处理标签样式
  13.   sht2.Range('A1:H20').Value2 = '';
  14.   sht2.Range('A1:H20').Copy(sht2.Range('I1'));
  15.   sht2.Columns('A:H').Delete();
  16.   let rng = sht2.Range('A1:H20');

  17.   //数组迭代
  18.   data.forEach((i, o) => {
  19.     if (o == 0) return; //索引为0则结束函数执行

  20.     let j = 20 * o + 1,
  21.     top = 270 * o + 15,
  22.     link = `http://localhost:3031/?bcid=code128&text=${i[0]}&textsize=12&height=9`;

  23.     rng.Copy(sht2.Range('A' + j));
  24.     sht2.Range(`B${j + 5}`).Value2 = i[0];
  25.     sht2.Range(`A${j + 9}`).Value2 = `${today}, ${i[4]}, ${i[5]}`;
  26.     sht2.Range(`A${j + 14}`).Value2 = `${i[1]}, ${i[2]}, ${i[3]}`;
  27.     sht2.Shapes.AddPicture(link, true, true, 65, top, 300, 50);
  28.   })

  29.   sht2.Rows('1:20').Delete();
  30.   sht1.Visible = false;       //隐藏Sheet1工作表
  31.   wb.SaveAs(fileName, 103);   //当前工作簿另存为PDF
  32.   sht1.Visible = true;
  33.   sht1.Select();

  34.   Shell(`cmd /c taskkill /pid ${pid} -f`, jsHide); //结束进程
  35.   Shell('cmd /c start ' + fileName, jsHide);       //打开PDF
  36. }

  37. //日期格式化
  38. function dateFormat(fmt, date) {
  39.   fmt = fmt || 'yyyy-mm-dd HH:MM:SS';
  40.   date = date || new Date;
  41.   const opt = {
  42.     'y+': date.getFullYear().toString(),
  43.     'm+': (date.getMonth() + 1).toString(),
  44.     'd+': date.getDate().toString(),
  45.     'H+': date.getHours().toString(),
  46.     'M+': date.getMinutes().toString(),
  47.     'S+': date.getSeconds().toString()
  48.   };
  49.   for (let k in opt) {
  50.     let ret = new RegExp('(' + k + ')').exec(fmt);
  51.     if (ret) {
  52.       fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
  53.     }
  54.   };
  55.   return fmt
  56. }
复制代码


动图效果
录制_2023_05_08_23_14_52_453.gif




jsbar.exe源码,在node.js环境下,用pkg模块打包成exe可执行文件
  1. //bwip-js呈现条形码图像的简单HTTP服务器
  2. const http = require('http');
  3. const server = http.createServer();
  4. const bwipjs = require('bwip-js');

  5. //这显示如何加载bwip js发行版提供的Inconsolata字体
  6. //bwipjs.loadFont('Inconsolata', 100, require('fs').readFileSync('./fonts/Inconsolata.otf', 'binary'));

  7. server.on('request', (req, res) => {
  8.   // If the url does not begin /?bcid= then 404.  Otherwise, we end up
  9.   // returning 400 on requests like favicon.ico.
  10.   if (req.url.indexOf('/?bcid=') != 0) {
  11.     res.writeHead(404, { 'Content-Type': 'text/plain' });
  12.     res.end('BWIPJS: Unknown request format.', 'utf8');
  13.   } else {
  14.     bwipjs.request(req, res); // Executes asynchronously
  15.   }
  16. });

  17. server.listen(3031, () => {
  18.   let a = '\n条形码与二维码服务已启动:http://localhost:3031/'
  19.   let b = '\n示例:http://localhost:3031/?bcid=isbn&text=978-1-56581-231-4+52250&includetext&guardwhitespace'
  20.   console.log(a + b)
  21. })
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-9 08:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
高手有没有关于WPS加载项的研究?最近正在学习这个

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-10 15:47 | 显示全部楼层
LIUZHU 发表于 2023-5-9 08:30
高手有没有关于WPS加载项的研究?最近正在学习这个

没有做过类似的需求,所以没有研究过

TA的精华主题

TA的得分主题

发表于 2023-8-12 16:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-2-25 19:25 | 显示全部楼层
很不错的想法,我没打包,直接用的你的jsbar.exe,条形码没问题,但是bcid=qrcode输出二维码的时候遇到一个问题,它不识别特殊字符“#”,我文本里面有#,后面的会被抛弃

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-26 07:40 来自手机 | 显示全部楼层
o不坏o 发表于 2024-2-25 19:25
很不错的想法,我没打包,直接用的你的jsbar.exe,条形码没问题,但是bcid=qrcode输出二维码的时候遇到一个 ...

URL编码问题,#字符没法直接用,要替换成%23,或者在jsa用encodeURI方法把条形码链接转码,
在nodejs把条形码链接用decodeURIComponent方法解码就可以了,当时没考虑到这些问题

TA的精华主题

TA的得分主题

发表于 2024-2-28 08:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-4-4 13:44 | 显示全部楼层
这个搭建之后,如何实现二维码的换行文本呢?  试了好久都不行

TA的精华主题

TA的得分主题

发表于 2024-4-4 13:48 | 显示全部楼层
lwwy1981 发表于 2024-4-4 13:44
这个搭建之后,如何实现二维码的换行文本呢?  试了好久都不行

测%0A试   查到了...!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 18:21 , Processed in 0.041937 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表