利用code128字体创建gs1条码

wils
wils

创作者俱乐部成员

需要在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条码。

当然,如果嫌麻烦,开头的链接有做好的一个模板,可以直接使用。

最后,希望更多的朋友来论坛交流共同进步,您在实际工作中遇到的问题,远比写几行代码宝贵的多。

海南省
浏览 255
收藏
4
分享
4 +1
+1
全部评论