首页/文章列表/文章详情

excel/wps, 转code128字体宏, 部分字符串出现空格, 导致条码断裂无法扫描的解决方案

编程知识652025-05-22评论

原宏是网上抄的, 传播比较广的那个.

后来发现, 部分条码出现空格断裂, 导致PDA无法扫描, 经搜索在一个帖子里, 发现是因为: 宏计算条码时, 会出现校验位刚好是空格的情况, 而空格在code128字体里是不显示的, 所以最后的现象就是条码断裂, 无法扫描

解决思路, 如果校验位为空格, 那么修改起始位或者结束位, 来达到修改校验位的结果

修改之后的宏如下: 其中function encodeToCode128()函数由AI重写完成(原来的该函数已被注释), 经我测试没有发现问题

function toSetC(text) {return text.match(/\d{2}/g).map((ascii, index) =>{var codeC =Number(ascii);var charCode = codeC > 94 ? codeC + 100 : codeC + 32;returnString.fromCharCode(charCode)}).join('');}function checkSum128(data, startCode) {var sum =startCode;for(var i = 0; i < data.length; i++) {var code =data.charCodeAt(i);var value = code > 199 ? code - 100 : code - 32;sum+= (i + 1) *(value);}var checksum = (sum % 103) + 32;if (checksum > 126) checksum = checksum + 68;returnString.fromCharCode(checksum);}//function encodeToCode128(text, codeABC ="B") {//text = text.Text ?? text//var startCode = String.fromCharCode(codeABC.toUpperCase().charCodeAt() + 138);//var stop = String.fromCharCode(206);//text = codeABC == 'C' && toSetC(text) || text;//var check = checkSum128(text, startCode.charCodeAt(0) - 100);////text = text.replace("", String.fromCharCode(194));//return startCode + text + check + stop;//}function encodeToCode128(text, codeABC ="B") { text = text.Text ??text;var originalStartCode = codeABC.toUpperCase().charCodeAt() + 138; // e.g., 'B' → 204var startCode =originalStartCode;var stopCode = 206;var encodedText = codeABC == 'C' ? toSetC(text) : text; //计算默认校验位var check = checkSum128(encodedText, startCode - 100);var checksum = check.charCodeAt(0);//仅在校验位为空格(32)时尝试调整起始符和结束符if (checksum === 32) { //尝试不同的起始符(A/B/C)var startOptions =[203,// Start A204,// Start B205// Start C];for(var i = 0; i < startOptions.length; i++) { var newStartCode =startOptions[i];if (newStartCode === originalStartCode) continue;//跳过原始起始符(已经计算过)check= checkSum128(encodedText, newStartCode - 100); checksum = check.charCodeAt(0);if (checksum !== 32) { //找到非空格校验位,使用新的起始符 startCode =newStartCode;break; } } //如果所有起始符都导致空格校验位,尝试修改停止符(206→238)if (checksum === 32) { stopCode = 238; check = checkSum128(encodedText, startCode - 100); //重新计算校验位 } } return String.fromCharCode(startCode) + encodedText + check +String.fromCharCode(stopCode);}
View Code

 

 

神弓

穿过旷野的风

这个人很懒...

用户评论 (0)

发表评论

captcha