明细表一旦错行错列,下游的备料、采购与成本核算就会连锁出错,而且这类错误往往几周后才被发现。这篇文章聚焦最容易翻车的三类结构——跨页续表、合并单元格与多级表头,说明怎样用线框重建加语义校验,把行列关系稳定还原成可以直接入库的二维表。
明细表和标题栏不是一个难度。标题栏错一个字段当场就能看出来;明细表错一行,数据看上去依然规整,只是每个零件的数量对应到了上一行的物料号。
一、错一行的代价
行错位的后果是连锁的:采购按错误数量下单、成本按错误重量核算、库房按错误物料备料。所以第一优先级不是字符准确率,而是行列拓扑的正确性——宁可把一行标成低置信度交人复核,也不要输出看似完整却错位的数据。
二、三类最容易翻车的结构
- 跨页续表。续表可能重复表头也可能不重复,列宽还可能变化。
- 合并单元格。同材质的连续几行只在第一行写材质,几何上是一个大格子对着多行。
- 多级表头。「尺寸」下分「长/宽/厚」,列的语义不在单行里。
三、线框重建:有线表格与无线表格的不同打法
有线表格
提取长横线与长竖线求交点得到网格候选,再聚类成行列边界。分隔线常断裂或被文字压住,形态学会漏线,必须准备回退方案:沿两个方向做投影,波谷即分隔线位置。重建后自检列边界是否全表一致,某段行高突然翻倍通常是漏了一条横线。
无线表格
老图可能只有外框没有内线,此时以列的左对齐边缘聚类出列簇,行用文本块中心纵坐标聚类。
混合策略最稳:先试有线重建,若网格列数与表头文本块数量不符,再切到无线通道,并把该表降一档置信度。
四、合并单元格怎么还原成规范二维表
- 记录跨度。记下每个单元格覆盖的行区间与列区间,而不是只存一个坐标。
- 纵向合并向下填充。材质、供应商这类属性列,取值复制到被覆盖的所有行。
- 横向合并不要复制数值。横跨多列的多是分组标题或整行说明,应存为行级备注。
- 保留来源标记。存一列记录该值是原生还是填充而来,便于下游判断问题来源。
判断合并单元格处理得好不好有个简单办法:把还原后的表按物料号分组求数量合计,再和图上的总件数比对。对不上,说明填充方向或行归属出了问题。
五、多级表头的列路径展开
正确做法是展开成列路径,而不是把表头硬拼成一行字:「尺寸-长」「数量-单件」,落库时用路径作映射键。实现上按 colspan 建表头树,上层单元格的列区间包含下层的即为父子关系。叶子数量必须等于数据区列数,这是最有效的自检。
表头别名也要处理。同一列可能写作「件数」「数量」「QTY」,需要一张按企业维护的同义词映射表。
六、跨页续表的拼接与去重表头
- 丢弃重复表头行。判据是与首页表头相似度高且数值列全为非数字,不要一律丢弃第一行。
- 按语义对齐列。续表列宽可能变,用表头文本匹配比 x 坐标可靠;无表头则沿用上页列路径。
- 处理跨页合并。上页末尾的纵向合并可能延续,拼接后要再执行一次向下填充。
- 用序号列校验。拼接后检查序号是否连续递增,断号或重号可直接定位到出问题的页。
七、语义校验:用业务规则兜住几何判断的失误
几何方法总有失手的时候,最后一道防线是业务规则,廉价、可解释,能抓住大部分错位:
- 数量列必须是正整数,出现小数或文字说明该行可能整体右移了一列。
- 物料号必须匹配企业编码正则,不匹配的标记待复核。
- 材质取值必须落在物料字典内,字典外的作为新值提交而非静默入库。
校验不通过的行不要丢弃或强行修正,连同原图坐标送人工复核队列。
小结
几何负责重建拓扑,语义负责验证拓扑:合并单元格靠跨度记录加定向填充,多级表头靠列路径展开加叶子数自检,跨页续表靠语义列对齐加序号连续性。