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

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

后来发现, 部分条码出现空格断裂, 导致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;
return String.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 ;
return String.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' → 204
    var 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 A
            204, // Start B
            205  // 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

相关推荐
fanchenxinok6 小时前
LIN矩阵Excel ⇄ LDF互转工具:打通设计数据与协议描述的关键桥梁
矩阵·excel·lin·ldf·excel和ldf互转
拆房老料7 小时前
多人协同编辑Excel时,筛选相互干扰怎么办?Onlyoffice中国版给出了与WPS一样的答案
编辑器·excel·开源软件·wps
Data-Miner7 小时前
Excel-Agent:你的专属 AI 数据分析助手
人工智能·数据分析·excel
河北之花8 小时前
演示软件界面及快捷键、幻灯片操作、输出为PDF
pdf·wps
xcLeigh8 小时前
告别 Excel 繁琐操作!Metabase让数据可视化触手可及
mysql·docker·信息可视化·excel·数据可视化·metabase·cpolar
葡萄城技术团队9 小时前
Excel 2025 年度回顾:文化、匠心与 Copilot 开启的计算新纪元
excel·copilot
tlwlmy9 小时前
python excel图片批量拼接导出
前端·python·excel
开开心心就好2 天前
绿色版PDF多功能工具,支持编辑转换
人工智能·windows·pdf·ocr·excel·语音识别·harmonyos
优选资源分享2 天前
资条生成器 V1.3 - 财务 HR 专属 Excel 工具
excel·实用工具
m0_502724952 天前
vue3在线预览excel表格
javascript·vue.js·excel