利用code128字体创建gs1条码
创作者俱乐部成员
需要在wps表格批量生成gs1条码的朋友,可以直接用这里的模板
https://bbs.wps.cn/topic/79674
只是那篇帖子写的过于简略,很多可操作的地方没有说明,在这里补充一下
首先,我们的目的是使用code128.ttf字体,在表格里动态的生成数据所对应的gs1条码。
其中code128是将我们的数据当成ASCII字符,进行求和校验,再加上开始结束部分,解决的是数据到扫码器这一步的编码。
而gs1是基于code128的,对我们数据格式的规范,比如批号、地址、包装号、包装数量等,解决的是数据的格式问题。
所以,我们不能简单的将单元格里的数据设置为code128字体了事,这样做扫码器是不认的。
为了偷懒,我们当然不愿自己写上面两步编码的过程,所以去npm上找到了这个库
https://www.npmjs.com/package/gs1-128-encoder
这里啰嗦一下在wps表格的JS宏里使用库的一般方法:
新建文件夹,进入后在这里右键打开powershell等终端
npm i gs1-128-encoder安装所需要的库
这个库使用require加载,所以可以用browserify打包(用import加载的库用esbuild打包)
browserify -r gs1-128-encoder -s gs1 -o o.js打包成独立的o.js文件
在JS宏编辑器里导入o.js,忽略弹出的提示
这里还要稍作改造,因为JS宏默认禁止全局表达式,为了方便用户,需要把导入的这段代码,完整的放到类的静态块里,并修改模块的全局对象为globalThis
这样,就可以在一般的函数里正常使用gs1模块了。其实开头的链接里有做好的模板
查看gs1-128-encoder的手册可以看到,他不仅提供了gs1编码,也可单独用于code128编码,https://www.npmjs.com/package/gs1-128-encoder
gs1.encodeToCodeArray方法将gs1格式的数据变成code128码
gs1.code128.encodeToCodeArray方法将没格式的数据变成code128码
到这里并没有结束,因为code128码并不对应着code128.ttf字体里的字符。。。
通过观察ttf里字符的位置,可以发现对应关系是code128码大于94则需要加100,否则加32。(需要注意,还有另一种idautomation的字体,需要对空格另外计算)
所以,需要我们自己写的代码就一句:
| 🔔 | function encodeToGS1_128(s) { return String.fromCharCode.apply(null, gs1.encodeToCodeArray(s.Text ?? s).map(x => x > 94 ? x + 100 : x + 32)) } |
这是个在单元格里使用的自定义公式,用它处理的数据可以设置为code128字体,这样显示出来的条码扫码器就认了。
其实,上面的步骤并不完善,所有步骤都可以变化,以满足你自己的需要,比如,自定义公式那里,gs1后面加上.code128,就可以用来生成非gs1的code128条码。
当然,如果嫌麻烦,开头的链接有做好的一个模板,可以直接使用。
最后,希望更多的朋友来论坛交流共同进步,您在实际工作中遇到的问题,远比写几行代码宝贵的多。