使用开源计算引擎提升Excel格式文件处理效率
文章目录
- POI具有全面而细致的xls读写能力
- POI的读写功能很底层
- POI查询计算困难
- SPL内置高级读写函数
- SPL提供足够的查询计算能力
- SPL支持更优的应用架构
- SPL资料
对Excel进行解析\生成\查询\计算等处理是Java下较常见的任务,但Excel的文件格式很复杂,自行编码读写太困难,有了POI\EasyExcel\JExcel等类库就方便多了,其中POI最为出色。
POI具有全面而细致的xls读写能力
POI可读写多种Excel文件格式,既支持古老的二进制格式(xls),也支持现代的OOXML格式(xlsx),既支持全内存一次性读写,也支持小内存流式读写。POI为大量Excel元素设计了相应的JAVA类,包括workbook、printer、sheet、row、cell,其中,与cell相关的类包括单元格样式、字体、颜色、日期、对齐、边框等。仅单元格样式类,方法就超过了四十个,可进行最全面最细致的读写操作。
POI的读写功能很底层
POI的读写功能全面而细致,但细致也意味着过于底层,开发者必须从头写起,自己处理每一处细节,即使简单的操作也要编写大量代码。比如,读入首行为列名的行式xls:
FileInputStream fileInputStream = new FileInputStream("d:\\Orders.xls");
// get the excel book
Workbook workbook = new HSSFWorkbook(fileInputStream);
if (workbook != null) {// get the first sheetSheet sheet = workbook.getSheetAt(0);if (sheet != null) {//get the col name/first lineRow rowTitle = sheet.getRow(0); // first lineif (rowTitle != null) {int cellTitles = rowTitle.getPhysicalNumberOfCells(); // get column numberfor (int i = 0; i < cellTitles; i++) {Cell cell = rowTitle.getCell(i); //the cell!if (cell != null) {System.out.print(cell.getStringCellValue() + " | ");}}}//get the value/other linesint rows = sheet.getPhysicalNumberOfRows(); // get line numberfor (int i = 1; i < rows; i++) {Row row = sheet.getRow(i); // get row iif (row != null) {int cells = row.getPhysicalNumberOfCells(); // get column numberfor (int j = 0; j < cells; j++) {// line number and row numberSystem.out.print("[" + i + "-" + j + "]");Cell cell = row.getCell(j); // the cell!if (cell != null) {int cellType = cell.getCellType();Object value = "";switch (cellType) {case HSSFCell.CELL_TYPE_STRING: // stringvalue = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BLANK: // 空break;case HSSFCell.CELL_TYPE_BOOLEAN: // booleanvalue = cell.getBooleanCellValue();break;case HSSFCell.CELL_TYPE_NUMERIC: // numberif (HSSFDateUtil.isCellDateFormatted(cell)) { // date numberDate date = cell.getDateCellValue();value = new DateTime(date).toString("yyyy-MM-dd HH:mm:ss");}else { // normal number// change to string to avoid being too longcell.setCellType(HSSFCell.CELL_TYPE_STRING);value = cell;}break;case HSSFCell.CELL_TYPE_ERROR:throw new RuntimeException("data type mistaken");}System.out.println(value);}}}System.out.println("end of the "+i+" line");}System.out.println("end of the value lines=======================================");}
}
行式xls是最常见的格式,但POI并没有为此提供方便的处理方法,只能按照workbook->sheet->line->cell的顺序进行循环解析,造成了如此繁琐的代码。
这还只是将数据简单读出来,如果下一步想再处理数据,还要事先转为结构化数据对象,比如ArrayList<实体类>或HashMap,代码就更繁琐了。
POI查询计算困难
解析Excel并不是目标,我们通常还要对这些文件进查询计算,但POI作为Excel的解析类,没有也不合适再提供相关的方法,只能用JAVA手工硬写。比如基础的分组汇总运算,JAVA代码大概这样:
Comparator<salesRecord> comparator = new Comparator<salesRecord>() {public int compare(salesRecord s1, salesRecord s2) {if (!s1.salesman.equals(s2.salesman)) {return s1.salesman.compareTo(s2.salesman);} else {return s1.ID.compareTo(s2.ID);}}
};
Collections.sort(sales, comparator);
ArrayList<resultRecord> result=new ArrayList<resultRecord>();
salesRecord standard=sales.get(0);
float sumValue=standard.value;
for(int i = 1;i < 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代码就简短得多:
生成规则的行式xls,SPL提供了xlsexport函数,用法也很简单。比如,上面例子的解析结果是个序表,存在SPL的A1格中,下面将A1写入新xls的第一个sheet,首行为列名,只要一句代码:=file(“e:/result.xlsx”).xlsexport@t(A1)
xlsexport函数的功能丰富多样,可以将序表写入指定sheet,或只写入序表的部分行,或只写入指定的列:=file(“e:/scores.xlsx”).xlsexport@t(A1,No,Name,Class,Maths)
xlsexport函数还可以方便地追加数据,比如对于已经存在且有数据的xls,将序表A1追加到该文件末尾,外观风格与原文件末行保持一致:=file(“e:/scores.xlsx”).xlsexport@a(A1)
不规则片区写入数据,可以使用前面的xlscell函数。比如,xls中蓝色单元格是不规则的表头,需要在相应的白色单元格中填入数据,如下图:
直接用POI要大段冗长的代码,而SPL代码就简短许多:
注意,第6、9、11行有连续单元格,SPL可以简化代码一起填入,POI只能依次填入。
SPL提供足够的查询计算能力
查询计算是Excel处理任务的重点,SPL提供了丰富的计算函数、字符串函数、日期函数,以及标准SQL语法,不仅支持日常的xls计算,也能计算内容不规则的xls和逻辑复杂的xls。
SPL提供了丰富的计算函数,可直接完成基础计算。比如前面的分组汇总,只要一句:
A1.groups(SellerId;sum(Amount))
更多计算:
条件查询:A1.select(Amount>1000 && Amount<=3000 && like(Client,“S”))
排序:A1.sort(Client,-Amount)"
去重:A1.id(Client)"
关联两个xlsx:join(T(“D:/Orders.xlsx”)
使用开源计算引擎提升Excel格式文件处理效率相关推荐
- python xlrd读取excel-使用Python xlrd模块读取Excel格式文件的方法
这是一篇关于如何使用Python xlrd模块读取Excel格式文件的方法的文章,下面的python代码中使用 了xlrd模块的方法,这样就能够很方便的读取 excel 文件内容.同是这个xlrd模块 ...
- java导出excel 序号_java web将数据导出为Excel格式文件代码片段
本文实例为大家分享了java web将数据导出为Excel格式文件的具体代码,供大家参考,具体内容如下 1.jsp代码 2.js代码 function getVerExcel() { window.l ...
- php导出excel格式文件,PHP导入与导出Excel文件的方法
一.PHP导出Excel文件 1,推荐phpexcel,官方网站: http://www.codeplex.com/PHPExcel 导入导出都成,可以导出office2007格式,同时兼容2003 ...
- python操作excel格式文件
python操作excel格式文件 1. 读数据 2. 写excel 3.操作整合 1. 读数据 安装包 pip install openpyxl 导包 from openpyxl import lo ...
- 【方法指南】将以逗号为分隔值的文件转换为excel格式文件
将以逗号为分隔值的文件转换为excel格式文件 1 项目场景 2 解决方案 1 项目场景 以逗号为分隔值的.txt文件转换为excel格式文件. 2 解决方案 以逗号为分隔值的文件转换为excel格式 ...
- linux 拷贝xlsx_在Linux上,将xlsx Excel格式文件转换为CSV
在这个简短的配置中,我将展示如何使用Gnumeric电子表格程序将xlsx Excel格式文件转换为CSV. Gnumeric是这项工作的最佳工具,因为它将节省大量时间.让我们从安装Gnumeric开 ...
- 在VS2010中利用MFC读取word、ppt、excel格式文件
本文源码的应用环境说明:Windows 7,Microsoft Visual Studio 2010,Microsoft Office Excel 2013 最近自己在做一个利用OLE/COM的实现M ...
- 将table导出为excel格式文件
html: <table cellpadding="0" cellspacing="0" class="data_table" id= ...
- Matlab操作excel格式文件
1,读取excel文件 使用xlsread函数,格式 num = xlsread(filename,sheet,xlRange) [num,txt,raw] = xlsread('my_example ...
最新文章
- EOSIO 转帐详解
- 为什么 JSP 还没有被淘汰?
- qregexp限制数字范围_计算一列数字的平均值
- udacity 同学 pca 客户细分实例操作
- 第二篇: Mysql____语法格式——键值
- C#最佳工具集合:IDE、分析、自动化工具等
- vue根据指令动态改变title名字
- 天池实验室-Task01-Python入门(上)
- OpenCV精进之路(零):HighGUI——读写XML和YML文件
- Hibernate配置文件
- MySQL通过SQL语句生成实体类_使用sql生成表对应的CRUD语句和表对应java实体类的实例变量...
- 请求的资源不可用html,“HTTP状态404请求的资源不可用”
- Windows自带的端口转发工具netsh使用方法
- Map集合常见面试题
- 年底绩效考核,领导让我背「C」
- 通过HTML和CSS制作二级菜单栏
- 666: 神奇的 SQL 之别样的写法 → 行行比较
- Centos自动登录
- 远程操作安卓手机——所见即所控
- 整理最全规范之Git仓库管理规范,Java开发规范,最全Java命名规范,数据库开发设计规范,接口设计规范
热门文章
- 浙江省获部系统集成资质单位名录 (2009年11月23日更新)
- HTML如何修改span里面的字体颜色,怎么用span css设置div内部分字体颜色?
- 常见的5种数据分析方法有哪些?
- 5e一直连接不上服务器,5E启动csgo连接不上服务器 | 手游网游页游攻略大全
- SWFT study-1
- Excel数据分析(三)统计分析函数使用(持续补充)
- 基于javaweb的在线电影售票系统设计和实现(java+springboot+ssm+mysql+jsp)
- 【软件测试】Junit单元测试
- 解决api-ms-win-crt-runtime-l1-1-0.dll文件丢失
- 联合概率和边缘概率的区分