poi操作excel(读取)
poi读取excel有两种模式,一种是用户模式,一种是事件模式。用户模式有许多封装好的方法操作简单,但创建太多的对象,非常耗内存。当读取数据量太多时,就需要使用事件模式。
sax模式
excel在07版后存储方式发生变化,因此事件模式也有两种读取接口。一种读取excel03版以下;一种是excel07版以上,使用sax。
excel03版
03版使用HSSFEventFactory来处理excel,HSSFEventFactory通过RecordFactoryInputStreaml循环获取Record.sid,将每一条送给HSSFRequest注册的监听器处理。用户要处理每条记录还需要自定义一个HSSFListener,通过实例化processRecord(Record record)接口方法处理Record.sid。关于Record.sid的类型,可以查看poi的api文档,文档有所有类型Record.sid的描述(这点比07版好,07版可能你还需要自己去找标签的意义)。
1、RecordFactoryInputStreaml:将数据转为Record.sid
2、HSSFListener:监听获取每条Record.sid记录进行处理
3、HSSFRequest:注册监听器
HSSFEventFactory实例化代码示例:
1 /** 2 * 初始化流监控 3 * @param in 4 */ 5 public void readExcelContent(InputStream in,int rowNum){ 6 this.rowNum = rowNum; 7 POIFSFileSystem poifs = null; 8 InputStream din = null; 9 try{ 10 poifs = new POIFSFileSystem(in); 11 din = poifs.createDocumentInputStream("Workbook"); 12 //这儿为所有类型的Record都注册了监听器,如果需求明确的话,可以用addListener方法,并指定所需的Record类型 13 HSSFRequest req = new HSSFRequest(); 14 //添加监听记录的事件 15 MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this); 16 formatListener = new FormatTrackingHSSFListener(listener); //监听代理,方便获取recordformat 17 req.addListenerForAllRecords(formatListener); 18 //创建时间工厂 19 HSSFEventFactory factory = new HSSFEventFactory(); 20 //处理基于时间文档流(循环获取每一条Record进行处理) 21 factory.processEvents(req, din); 22 }catch(Exception e){ 23 throw new RuntimeException(e); 24 }finally{ 25 //关闭基于POI文档流 26 if (din != null) { 27 try { 28 din.close(); 29 } catch (IOException io) { 30 throw new RuntimeException(io); 31 } 32 } 33 } 34 }
excel07版
excel07版是一种基于xml读取的发生取值,通过读取结构化的xml数据,取得表单数据。
07是使用sax(Simple APIs for XML,也即XML简单应用程序接口)来解析excel。SAX接口也被称作事件驱动接口,当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问。
用户实现DefaultHandler接口,获取excel的row和cell的值。
注:poi文档对excel07的xml存储标签没有做详细说明,excel2007是使用xml格式来存储的,把一个excel文件后缀改为zip,打开之后就直接可以看到excel文件对应的xml格式的文件了。
代码示例(github):
里面封装读取03和07读取工具(支持大量数据读取)
https://github.com/L-yulong/poiexcelReader