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

posted @ 2016-09-25 16:56  Rainbean  阅读(3869)  评论(0编辑  收藏  举报