按 Material 规则精准定位取值:SignLocal/ValueLocal 寻址
问题:元素值在表里的位置不固定
识别的表格里,同一个元素"Fe",可能在不同的行、不同的列,甚至符号和值分居两格。硬编码坐标根本扛不住。
第一性原理:别死记坐标,按规则定位。规则里有"在哪找、找谁、值在哪个相对位置"。
规则结构(配置里定义)
我们的匹配规则里有两个关键字段:
SignLocal:定位锚点,描述"在这个位置能找到这个元素"。比如Fe出现在某列。ValueLocal:值的位置,描述符号旁边哪个格子是值。
# 简化规则rule={"Material":"Fe","SignLocal":"F",# 在F列找Fe"ValueLocal":"G",# 值在G列}定位取值
defextract_from_sheet(ws,rules):cells={}# cell对象# 先按坐标知道每格文字抬头forrowinws.iter_rows():forcellinrow:txt=str(cell.valueor"")forruleinrules:ifrule["SignLocal"]intxt:# 找到了锚点,去 ValueLocal 取邻格值neighbors=ws[rule["ValueLocal"]+str(cell.row)]result[rule["Material"]]=neighbors.valuereturnresult核心就一句话:在行里搜到锚点文本,再去同行/同列的另一个坐标取值。
关键:锚点文本的"命中"判断
用in做包含匹配("Fe" in text)比较容易误命中——Fe2O3也含Fe。所以SignLocal的设计要尽量精确到"这一格的文本是该元素,而非包含"。
这一格取舍直接影响准确性,是校验配置时最容易返工的点。
它解决的问题
一段数据,元素名在 A 列、符号在 E 列、值在 F 列,列位置前后版本还变。硬编码坐标死路一条,规则化后改配置就能适配,不用动代码。
取值这种事,写成"规则"永远比写成"坐标"健壮。这就是 SignLocal/ValueLocal 的意义。