找回密码
 立即注册
首页 业界区 业界 excel/wps, 转code128字体宏, 部分字符串出现空格, 导致 ...

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

铝缉惹 2025-6-3 00:12:23
原宏是网上抄的, 传播比较广的那个.
后来发现, 部分条码出现空格断裂, 导致PDA无法扫描, 经搜索在一个帖子里, 发现是因为: 宏计算条码时, 会出现校验位刚好是空格的情况, 而空格在code128字体里是不显示的, 所以最后的现象就是条码断裂, 无法扫描
解决思路, 如果校验位为空格, 那么修改起始位或者结束位, 来达到修改校验位的结果
修改之后的宏如下: 其中function encodeToCode128()函数由AI重写完成(原来的该函数已被注释), 经我测试没有发现问题
1.gif
2.gif
  1. function toSetC(text) {
  2. return text.match(/\d{2}/g).map((ascii, index) => {
  3. var codeC = Number(ascii);
  4. var charCode = codeC > 94 ? codeC + 100 : codeC + 32;
  5. return String.fromCharCode(charCode)
  6. }).join('');
  7. }
  8. function checkSum128(data, startCode) {
  9. var sum = startCode;
  10. for (var i = 0; i < data.length; i++) {
  11. var code = data.charCodeAt(i);
  12. var value = code > 199 ? code - 100 : code - 32;
  13. sum += (i + 1) * (value);
  14. }
  15. var checksum = (sum % 103) + 32;
  16. if (checksum > 126) checksum = checksum + 68 ;
  17. return String.fromCharCode(checksum);
  18. }
  19. //function encodeToCode128(text, codeABC = "B") {
  20. //text = text.Text ?? text
  21. //var startCode = String.fromCharCode(codeABC.toUpperCase().charCodeAt() + 138);
  22. //var stop = String.fromCharCode(206);
  23. //text = codeABC == 'C' && toSetC(text) || text;
  24. //var check = checkSum128(text, startCode.charCodeAt(0) - 100);
  25. ////text = text.replace(" ", String.fromCharCode(194));
  26. //return startCode + text + check + stop;
  27. //}
  28. function encodeToCode128(text, codeABC = "B") {
  29.     text = text.Text ?? text;
  30.     var originalStartCode = codeABC.toUpperCase().charCodeAt() + 138; // e.g., 'B' → 204
  31.     var startCode = originalStartCode;
  32.     var stopCode = 206;
  33.     var encodedText = codeABC == 'C' ? toSetC(text) : text;
  34.    
  35.     // 计算默认校验位
  36.     var check = checkSum128(encodedText, startCode - 100);
  37.     var checksum = check.charCodeAt(0);
  38.    
  39.     // 仅在校验位为空格(32)时尝试调整起始符和结束符
  40.     if (checksum === 32) {
  41.         // 尝试不同的起始符(A/B/C)
  42.         var startOptions = [
  43.             203, // Start A
  44.             204, // Start B
  45.             205  // Start C
  46.         ];
  47.         
  48.         for (var i = 0; i < startOptions.length; i++) {
  49.             var newStartCode = startOptions[i];
  50.             if (newStartCode === originalStartCode) continue; // 跳过原始起始符(已经计算过)
  51.             
  52.             check = checkSum128(encodedText, newStartCode - 100);
  53.             checksum = check.charCodeAt(0);
  54.             
  55.             if (checksum !== 32) {
  56.                 // 找到非空格校验位,使用新的起始符
  57.                 startCode = newStartCode;
  58.                 break;
  59.             }
  60.         }
  61.         
  62.         // 如果所有起始符都导致空格校验位,尝试修改停止符(206→238)
  63.         if (checksum === 32) {
  64.             stopCode = 238;
  65.             check = checkSum128(encodedText, startCode - 100); // 重新计算校验位
  66.         }
  67.     }
  68.    
  69.     return String.fromCharCode(startCode) + encodedText + check + String.fromCharCode(stopCode);
  70. }
复制代码
View Code 
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册