- 浏览: 836424 次
文章分类
- 全部博客 (365)
- java (124)
- spring mvc (21)
- spring (22)
- struts2 (6)
- jquery (27)
- javascript (24)
- mybatis/ibatis (8)
- hibernate (7)
- compass (11)
- lucene (26)
- flex (0)
- actionscript (0)
- webservice (8)
- rabbitMQ/Socket (15)
- jsp/freemaker (5)
- 数据库 (27)
- 应用服务器 (21)
- Hadoop (1)
- PowerDesigner (3)
- EJB (0)
- JPA (0)
- PHP (2)
- C# (0)
- .NET (0)
- html (2)
- xml (5)
- android (7)
- flume (1)
- zookeeper (0)
- 证书加密 (2)
- maven (1)
- redis (2)
- cas (11)
最新评论
-
zuxianghuang:
通过pom上传报错 Artifact upload faile ...
nexus上传了jar包.通过maven引用当前jar,不能取得jar的依赖 -
流年末年:
百度网盘的挂了吧???
SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) -
953434367:
UfgovDBUtil 是什么类
Java发HTTP POST请求(内容为xml格式) -
smilease:
帮大忙了,非常感谢
freemaker自动生成源代码 -
syd505:
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
通过eventusermodel读取文件
通过eventusermodel读取文件要比使用usermodel复杂得多,但效率也要高不少,因为它要求应用程序一边读取数据,一边处理数据。
eventusermodel实际上模拟了DOM环境下SAX处理XML文档的办法,应用程序首先要注册期望处理的数据,eventusermodel将在遇到匹配的数据结构时回调应用程序注册的方法。使用eventusermodel最大的困难在于你必须熟悉Excel工作簿的内部结构。
在HSSF中,低层次的二进制结构称为记录(Record)。记录有不同的类型,每一种类型由org.apache.poi.hssf.record包中的一个Java类描述。例如,BOFRecord记录表示Workbook或Sheet区域的开始,RowRecord表示有一个行存在并保存其样式信息。
所有具有CellValueRecordInterface接口的记录表示Excel的单元格,包括NumericRecord、LabelSSTRecord和FormulaRecord(还有其他一些,其中部分已被弃置不用,部分用于优化处理,但一般而言,HSSF可以转换它们)。
package com.easyway.excel.events; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener; import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener; import org.apache.poi.hssf.eventusermodel.HSSFEventFactory; import org.apache.poi.hssf.eventusermodel.HSSFListener; import org.apache.poi.hssf.eventusermodel.HSSFRequest; import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener; import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.BlankRecord; import org.apache.poi.hssf.record.BoolErrRecord; import org.apache.poi.hssf.record.BoundSheetRecord; import org.apache.poi.hssf.record.FormulaRecord; import org.apache.poi.hssf.record.LabelSSTRecord; import org.apache.poi.hssf.record.NumberRecord; import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.hssf.record.SSTRecord; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 基于POI HSSF的eventmodel 模型的时间解析方式 * 优点:解析数据相当快。 * 缺点:1.仅仅支持97~2003版本的excel,不支持2007版本的excel。 * 2.只能读Excel中一个Sheet页面。 * @Title: * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-6-14 * @author longgangbai * @version 1.0 */ public class UserModelEventListener implements HSSFListener { private SSTRecord sstrec; /** Should we output the formula, or the value it has? */ private boolean outputFormulaValues = true; /** For parsing Formulas */ private SheetRecordCollectingListener workbookBuildingListener; private int sheetNo=0; private int curRowNum=0; private int ignoreRowNum=1; @Override public void processRecord(org.apache.poi.hssf.record.Record record) { switch (record.getSid()) { case BOFRecord.sid: BOFRecord bof = (BOFRecord) record; //顺序进入新的Workbook if (bof.getType() == bof.TYPE_WORKBOOK) { //System.out.println("开始解析excel 文档....."); //顺序进入新的Worksheet,因为Event API不会把Excel文件里的所有数据结构都关联起来, //所以这儿一定要记录现在进入第几个sheet了。 } else if (bof.getType() == bof.TYPE_WORKSHEET) { //读取新的一个Sheet页 sheetNo++; System.out.println("当前Sheet 页编号:" +sheetNo); } break; //开始解析Sheet的信息,记录sheet,这儿会把所有的sheet都顺序打印出来,如果有多个sheet的话,可以顺序记入到一个List里 case BoundSheetRecord.sid: BoundSheetRecord bsr = (BoundSheetRecord) record; //System.out.println("New sheet named: " + bsr.getSheetname()); break; //执行行记录事件 case RowRecord.sid: RowRecord rowrec = (RowRecord) record; //System.out.println("记录开始, first column at " // + rowrec.getFirstCol() + " last column at " // + rowrec.getLastCol()); break; // SSTRecords store a array of unique strings used in Excel. case SSTRecord.sid: sstrec = (SSTRecord) record; // for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) { // System.out.println("String table value " + k + " = " // + sstrec.getString(k)); // } break; //发现数字类型的cell,因为数字和日期都是用这个格式,所以下面一定要判断是不是日期格式,另外默认的数字也会被视为日期格式,所以如果是数字的话,一定要明确指定格式!!!!!!! case NumberRecord.sid: NumberRecord nr = (NumberRecord) record; if(HSSFDateUtil.isInternalDateFormat(nr.getXFIndex())){ //System.out.println("日付:"+ // +", 行:"+nr.getRow()+ ", 列:"+nr.getColumn()+"。("+nr.getXFIndex()+")"); String timeStr=(new SimpleDateFormat("yyyy-MM-dd")).format(HSSFDateUtil.getJavaDate(nr.getValue())); addDataAndrChangeRow(nr.getRow(),nr.getColumn(),timeStr); }else{ String timeStr=getTime(nr.getValue());; // System.out.println("数字:"+nr.getValue()+", 行:"+nr.getRow()+ ", 列:"+nr.getColumn()+"。("+nr.getXFIndex()+")"); addDataAndrChangeRow(nr.getRow(),nr.getColumn(),getTime(nr.getValue())); } break; //发现字符串类型,这儿要取字符串的值的话,跟据其index去字符串表里读取 case LabelSSTRecord.sid: LabelSSTRecord lsr = (LabelSSTRecord)record; addDataAndrChangeRow(lsr.getRow(),lsr.getColumn(), sstrec.getString(lsr.getSSTIndex())); //System.out.println("文字列:"+sstrec.getString(lsr.getSSTIndex())+", 行:"+lsr.getRow()+", 列:"+lsr.getColumn()); break; case BoolErrRecord.sid: //解析boolean错误信息 BoolErrRecord ber = (BoolErrRecord)record; if(ber.isBoolean()){ addDataAndrChangeRow(ber.getRow(),ber.getColumn(), ber.getBooleanValue()); //System.out.println("Boolean:"+ber.getBooleanValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn()); } if(ber.isError()){ //addDataAndrChangeRow(ber.getRow(),ber.getColumn(), ber.getErrorValue()); //System.out.println("Error:"+ber.getErrorValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn()); } break; //空白记录的信息 case BlankRecord.sid: BlankRecord br = (BlankRecord)record; addDataAndrChangeRow(br.getRow(),br.getColumn(), ""); //System.out.println("空。 行:"+br.getRow()+", 列:"+br.getColumn()); break; case FormulaRecord.sid: //数式 FormulaRecord fr = (FormulaRecord)record; addDataAndrChangeRow(fr.getRow(),fr.getColumn(), fr.getValue()); //System.out.println("数字 。 行:"+fr.getRow()+", 列:"+fr.getColumn()); break; } } /** * 添加数据记录并检查是否换行 * @param row 实际当前行号 * @param col 实际记录当前列 * @param value 当前cell的值 */ public void addDataAndrChangeRow(int row,int col,Object value){ //当前行如果大于实际行表示改行忽略,不记录 if(curRowNum!=row){ System.out.print(row+":"+col+" "+value+"\r"); curRowNum=row; }else{ System.out.print(row+":"+col+" "+value+"\r"); } } /** * [正确地处理整数后自动加零的情况]</li> * @param sNum * @return */ private static String getTime(double daynum) { double totalSeconds=daynum*86400.0D; //总的分钟数 int seconds =(int)totalSeconds/60; //实际小时数 int hours =seconds/60; int minutes = seconds-hours*60; //剩余的实际分钟数 StringBuffer sb=new StringBuffer(); if(String.valueOf(hours).length()==1){ sb.append("0"+hours); }else{ sb.append(hours); } sb.append(":"); if(String.valueOf(minutes).length()==1){ sb.append("0"+minutes); }else{ sb.append(minutes); } return sb.toString(); } /** * Read an excel file and spit out what we find. * * @param args * Expect one argument that is the file to read. * @throws IOException * When there is an error processing the file. */ public static void main(String[] args) throws IOException { UserModelEventListener xlsEventListener=new UserModelEventListener(); MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener( xlsEventListener); FormatTrackingHSSFListener formatListener = new FormatTrackingHSSFListener(listener); //创建一个excel输入流 FileInputStream fin = new FileInputStream("C:\\station2station.xls"); //创建一个 org.apache.poi.poifs.filesystem.Filesystem POIFSFileSystem poifs = new POIFSFileSystem(fin); //将excel 2003格式POI文档输入流 InputStream din = poifs.createDocumentInputStream("Workbook"); //这儿为所有类型的Record都注册了监听器,如果需求明确的话,可以用addListener方法,并指定所需的Record类型 HSSFRequest req = new HSSFRequest(); //添加监听记录的事件 req.addListenerForAllRecords(xlsEventListener); boolean outputFormulaValues=true; if (outputFormulaValues) { req.addListenerForAllRecords(formatListener); } else { SheetRecordCollectingListener workbookBuildingListener = new SheetRecordCollectingListener( formatListener); req.addListenerForAllRecords(workbookBuildingListener); } //创建时间工厂 HSSFEventFactory factory = new HSSFEventFactory(); //处理基于时间文档流 factory.processEvents(req, din); //关闭文件流 fin.close(); //关闭基于POI文档流 din.close(); System.out.println("done."); } }
发表评论
-
eclispe 实用插件大全
2016-03-31 10:17 791在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的 ... -
单点登录 SSO Session
2016-03-14 16:56 4021单点登录在现在的 ... -
通用权限管理设计 之 数据库结构设计
2016-01-26 13:22 2918通用权限管理设计 之 ... -
分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
2016-01-26 13:22 1371分享一个基于ligerui的系统应用案例ligerRM V2 ... -
通用权限管理设计 之 数据权限
2016-01-26 13:20 691通用权限管理设计 之 数据权限 阅读目录 前 ... -
使用RSA进行信息加密解密的WebService示例
2015-12-28 10:30 830按:以下文字涉及RS ... -
防止网站恶意刷新
2015-10-22 10:55 671import java.io.IOExcept ... -
单点登录
2015-10-19 14:24 724Cas自定义登录页面Ajax实现 博客分类: ... -
session如何在http和https之间同步
2015-09-14 09:25 2221首先说下 http>https>http ... -
基于 Quartz 开发企业级任务调度应用
2015-08-17 11:17 792Quartz 是 OpenSy ... -
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
2015-08-17 11:17 852今天来点实际工 ... -
Java加密技术(十)——单向认证
2015-08-13 10:13 646在Java 加密技术(九)中,我们使 ... -
Java加密技术(九)——初探SSL
2015-08-13 10:12 815在Java加密技术(八)中,我们模拟 ... -
Java加密技术(八)——数字证书
2015-08-13 10:12 851本篇的主要内容为Java证书体系的实 ... -
Java加密技术(七)——非对称加密算法最高级ECC
2015-08-13 10:12 924ECC ECC-Elliptic Curv ... -
Java加密技术(六)——数字签名算法DSA
2015-08-13 10:11 1010接下来我们介绍DSA数字签名,非对称 ... -
Java加密技术(五)——非对称加密算法的由来DH
2015-08-12 16:13 831接下来我们 ... -
Java加密技术(四)——非对称加密算法RSA
2015-08-12 16:11 1049接下来我们介绍典型的非对称加密算法—— ... -
Java加密技术(三)——PBE算法
2015-08-12 16:10 907除了DES,我们还知道有DESede( ... -
Java加密技术(二)——对称加密算法DES&AES
2015-08-12 16:09 679接下来我们介绍对称加密算法,最常用的莫 ...
相关推荐
NULL 博文链接:https://topmanopensource.iteye.com/blog/1561151
poi的组件,用于解析office文档,全部的组建放在里面,包含支持包,在对应文件夹里
NULL 博文链接:https://topmanopensource.iteye.com/blog/1562322
Apache POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。此压缩包中包含所有POI相关的jar包
Apache POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。目前POI已经有了Ruby版本。 结构: HSSF - 提供读写Microsoft Excel XLS格式档案的功能。 XSSF - 提供读写Microsoft Excel OOXML XLSX格式...
Apache POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法显示,这一般不是chm文件的问题,这里统一说明一下解决办法: 如果文件...
用于JAVA的Excel读写组件, 配合jre1.8使用
基于 Railo 4.1.2.003 和 4.2.1.000 与 POI 3.8。 编码风格 作为实验,Datasheet.cfc 是一个基于脚本的组件不使用分号Railo 特定功能。 为什么? 看看在没有 ; 的情况下编写脚本的感觉如何; 目前感觉还不错! ...