< sales.size(); i ++){ salesRecord rd=sales.get(i); if(rd.salesman.equals(standard.salesman)){sumValue=sumValue+rd.value; }else{result.add(new resultRecord(standard.salesman,sumValue));standard=rd;sumValue=standard.value; }}result.add(new resultRecord(standard.salesman,sumValue));Java编码实现计算不仅繁琐 , 而且存在架构性缺陷 。代码很难复用 , 数据结构和计算代码通常会耦合在一起 , 如果数据结构发生变化 , 代码就要重写 。查询计算的要求灵活多变 , 而Java作为编译型语言 , 每次修改代码都要重启应用 , 维护工作量大 , 系统稳定性差 。
POI成熟稳定 , 但读写能力过于底层 , 且未提供查询计算能力 , 直接基于POI完成Excel文件的处理(特别是查询计算)的开发效率很低 。如果针对POI进行封装 , 形成简单易用的高级读写函数 , 并额外提供查询计算能力 , 就能大幅度提高开发效率了 。
esProc SPL就是其中的佼佼者 。
SPL内置高级读写函数SPL是JVM下开源的计算引擎 , 它对POI也进行了封装 , 内置简单易用的高级函数 , 可解析\生成各类格式规则或不规则的xls , 并自动生成结构化数据对象 。
解析格式规则的行式Excel , SPL提供了T函数 。比如解析前面的xls文件 , 用封装前的POI要几十行 , 封装后只要一句:
=T("d:\Orders.xls")
解析行式Excel是很常见的任务 , SPL用T函数封装了POI的功能 , 接口简单易用 。无论xls还是xlsx , T函数都可以统一解析 。可自动进行类型转换 , 开发者无须在细节浪费时间 。T函数可自动区分首行的列名和其他行的数据 , 并根据列名创建序表(SPL的结构化数据对象)并填入数据:
文章插图
读入并解析成序表后 , 就可以使用SPL提供的丰富的结构化数据处理方法了:
取第3条记录:A1(3)
取后3条记录:A1.m([-1,-2,-3])
取记录的字段值:A1(3).Amount*0.05
修改记录的字段值:A1(3).Amount = A1(3). Amount*1.05
取一列 , 返回集合:A1.(Amount)
取几列 , 返回集合的集合:A1.([CLIENT,AMOUNT])
追加记录:A1.insert(200,"APPL",10,2400.4,date("2010-10-10"))
先按字段取再按记录序号取:A1.(AMOUNT)(2);等价于先按记录序号取再按字段取:A1(2).AMOUNT
解析格式较不规则的行式xls , SPL提供了xlsimport函数 , 内置丰富而简洁的读取功能:
没有列名 , 首行直接是数据:file("D:\Orders.xlsx").xlsimport()
跳过前2行的标题区:file("D:/Orders.xlsx").xlsimport@t(;,3)
从第3行读到第10行:file("D:/Orders.xlsx").xlsimport@t(;,3:10)
只读取其中3个列:file("D:/Orders.xlsx").xlsimport@t(OrderID,Amount,OrderDate)
读取名为"sales"的特定sheet:file("D:/Orders.xlsx").xlsimport@t(;"sales")
函数xlsimport还具有读取倒数N行、密码打开文件、读大文件等功能 , 这里不再详述 。
解析格式很不规则的xls , SPL提供了xlscell函数 , 可以读写指定sheet里指定片区的数据 , 比如读取第1个sheet里的A2格:
=file("d:/Orders.xlsx").xlsopen().xlscell("C2")
配合SPL灵活的语法 , 就可以解析自由格式的xls , 比如将下面的文件读为规范的二维表(序表):
文章插图
这个文件格式很不规则 , 直接基于POI写Java代码是个浩大的工程 , 而SPL代码就简短得多:
经验总结扩展阅读
- C++ 使用栈求解中缀、后缀表达式的值
- 裹粉可以用面粉代替吗
- 欧莱雅男士劲能醒肤露怎样使用?
- 分布式存储系统之Ceph集群启用Dashboard及使用Prometheus监控Ceph
- 炒菜锅涂层掉了有害吗
- 难蚌是什么意思
- 结婚端洗脸水有讲究吗 洗脸水如何使用
- 使用Pytorch进行多卡训练
- AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
- 单独用泡打粉发面要醒多久