Excel 导入报告设计
模型示例、调用和结果说明见 Excel README。实现集中在已有 ExcelHelper,结果模型为 ExcelImportReport。
导入与报告共用工作簿打开、工作表定位、标题映射、缓存属性访问器及单元格转换。缓存槽增加属性名、Required 和可写性,不另建反射缓存或解析器。旧入口保留空值/转换失败留默认值及原异常包装;报告入口以严格状态区分成功、空值、无效值。
标题校验使用既有列名比较器,拒绝重复源标题、模型列别名、缺失必填列和映射到不可写属性;模板错误不进入数据读取。逐行捕获转换范围内的格式/溢出错误,记录位置并排除无效行;setter 置于该捕获范围外,防止把用户代码故障伪装成格式错误。
Required 检查源单元格,不读取属性初始化值来代替输入。数值 0 与布尔 false 是成功转换,空/空白是独立状态。数值直接转换失败时,严格入口使用原始数值的 invariant 表达,不通过显示格式舍入后再接受;日期沿用已有格式化回退。公式与错误单元格使用既有 NPOI evaluator。
业务校验只对单元格有效对象调用,导入器按真实行列补充返回错误位置。没有属性名的业务错误属于整行;一个对象可以返回多个错误。有效行与错误同时累计,但取消或非预期异常时不返回部分报告。该过程不替业务事务或回调副作用提供回滚。
CSV 模型适配位于 ExcelHelper.Csv,复用同一属性缓存、文本类型转换、标题校验、业务错误定位和报告模型;记录语法仍由 CsvHelper 解析。首条记录作为表头,后续逐条转换,报告以逻辑记录号定位,来源名为 CSV;数据记录总数受 maximumRows 限制。调用与参数见 DataTransfer。
工作簿与流
NPOI 打开路径会关闭传入流,组件在读取和模板打开边界提供只读、不关闭底层流的适配。工作簿仍由调用者释放,输入流独立归调用者;异步不可定位流先复制到内存。实例保存工作表状态,不支持并发复用。
NPOI 自身保留工作簿对象,异步/Stream 重载没有变成逐行解码。取消能在缓冲、行列及业务错误枚举时检查,不能中断同步工作簿打开。错误报告直接复用已有导出器,平面错误模型提供公开无参构造函数,避免再实现第二个报告写入器。
验证见 ExcelImportReportTests:转换与必填、模型/标题歧义、数值显示格式、公式、业务校验、实际行列、旧宽松行为、错误导出、XLS/XLSX/非定位输入及释放后的调用方流。性能测试默认跳过,不据此宣称大文件吞吐。