计划范围文档「导入」的关键,不是行式 CRUD 读表,而是用 Apache POI 把排产 Excel 里的装置绿色合并区拆成扁平记录 FlatRecord。实现类:ExcelGreenRegionExtractor(mes-plan)。
数据模型
每条记录对应「某装置下的一行进料或产品」:
| 字段 | 含义 |
|---|---|
processName |
装置名(合并区文字,去换行) |
load |
负荷(合并区上方单元格,常格式化为 xx%) |
capacity |
加工量(合并区下方单元格) |
type |
进料 或 产品 |
itemName |
物料 / 产品侧线名 |
amount |
加工量或产量 |
yield |
收率(仅产品) |
rowNum / colNum |
合并区左上角,用于排序与分组 |
入口:parseExcel(byte[] / File / InputStream) → XSSFWorkbook → 取第一个 Sheet → 返回按行列排序后的列表。
解析步骤
1. 以合并区为装置锚点
遍历 sheet.getMergedRegions()。合并区首格文本作为装置名;去掉 \n 后长度 < 2 或空则跳过(过滤装饰块)。当前实现里 isGreenCell 判断被注释掉,实际以「合并区 + 有意义的装置名」为准。
2. 块内相对列布局
对每个合并区调用 extractBlockData,以合并区左列为 centerCol:
1 | [进料名][进料量][装置合并区][产品名][收率][产量] |
- 上方一行同列:负荷;数值则 ×100 后加
% - 下方一行同列:年加工量 / 备注
- 左侧两列:进料名 + 量;过滤表头「进料」及含「合计」的行
- 右侧三列:产品名 + 收率 + 产量;过滤「产品/侧线」及「合计」
数量、收率尽量用 BigDecimal 保留两位小数。
3. 排序
全部 FlatRecord 先按 rowNum,再按 colNum 升序,保证后续按装置分组时顺序稳定(与画布从左到右、从上到下一致)。
设计要点
- 结构约定优于颜色:模板用绿色合并区标装置,代码侧更依赖合并区几何与相对列偏移;颜色过滤可按需打开。
- 扁平化:一个装置多行进料/产品 → 多条
FlatRecord,同一processName+ 相同 load/capacity。 - 上游用法:
JhfwDocServiceImpl.importData读PlanFiles二进制调用本解析器,再按processName分组写入主从表;解析器本身不落库。
小结
绿色区块解析 = 合并区定装置 + 固定列偏移读进料/产品 + 上下格读负荷/加工量。改模板列布局时,优先改 extractBlockData 中的相对偏移,而不是改导入接口。