excel/wps, 转code128字体宏, 部分字符串出现空格, 导致条码断裂无法扫描的解决方案
笔记哥 /
05-22 /
25点赞 /
0评论 /
538阅读
原宏是网上抄的, 传播比较广的那个.
后来发现, 部分条码出现空格断裂, 导致PDA无法扫描, 经搜索在一个帖子里, 发现是因为: 宏计算条码时, 会出现校验位刚好是空格的情况, 而空格在code128字体里是不显示的, 所以最后的现象就是条码断裂, 无法扫描
解决思路, 如果校验位为空格, 那么修改起始位或者结束位, 来达到修改校验位的结果
修改之后的宏如下: 其中`function encodeToCode128()`函数由AI重写完成(原来的该函数已被注释), 经我测试没有发现问题

```csharp
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);
}
```
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/3602
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利