- 浏览: 853643 次
文章分类
- 全部博客 (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 836在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的 ... -
单点登录 SSO Session
2016-03-14 16:56 4052单点登录在现在的 ... -
通用权限管理设计 之 数据库结构设计
2016-01-26 13:22 2952通用权限管理设计 之 ... -
分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
2016-01-26 13:22 1493分享一个基于ligerui的系统应用案例ligerRM V2 ... -
通用权限管理设计 之 数据权限
2016-01-26 13:20 739通用权限管理设计 之 数据权限 阅读目录 前 ... -
使用RSA进行信息加密解密的WebService示例
2015-12-28 10:30 874按:以下文字涉及RS ... -
防止网站恶意刷新
2015-10-22 10:55 705import java.io.IOExcept ... -
单点登录
2015-10-19 14:24 763Cas自定义登录页面Ajax实现 博客分类: ... -
session如何在http和https之间同步
2015-09-14 09:25 2254首先说下 http>https>http ... -
基于 Quartz 开发企业级任务调度应用
2015-08-17 11:17 836Quartz 是 OpenSy ... -
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
2015-08-17 11:17 876今天来点实际工 ... -
Java加密技术(十)——单向认证
2015-08-13 10:13 679在Java 加密技术(九)中,我们使 ... -
Java加密技术(九)——初探SSL
2015-08-13 10:12 884在Java加密技术(八)中,我们模拟 ... -
Java加密技术(八)——数字证书
2015-08-13 10:12 889本篇的主要内容为Java证书体系的实 ... -
Java加密技术(七)——非对称加密算法最高级ECC
2015-08-13 10:12 972ECC ECC-Elliptic Curv ... -
Java加密技术(六)——数字签名算法DSA
2015-08-13 10:11 1057接下来我们介绍DSA数字签名,非对称 ... -
Java加密技术(五)——非对称加密算法的由来DH
2015-08-12 16:13 868接下来我们 ... -
Java加密技术(四)——非对称加密算法RSA
2015-08-12 16:11 1093接下来我们介绍典型的非对称加密算法—— ... -
Java加密技术(三)——PBE算法
2015-08-12 16:10 957除了DES,我们还知道有DESede( ... -
Java加密技术(二)——对称加密算法DES&AES
2015-08-12 16:09 718接下来我们介绍对称加密算法,最常用的莫 ...
相关推荐
6. **库依赖**:虽然标题中提到了poi3.8,但现代项目可能需要更新版本的Apache POI,因为它包含了更多的功能和错误修复。同时,如果要处理2007及更高版本的文件,还需要引入XSSF和XWPF库。 7. **其他工具和库**:...
这里的"poi-3.8组件"指的是Apache POI项目的3.8版本,这是一个稳定且广泛使用的版本,为开发者提供了在Java环境中读写Microsoft Office文档的能力。 Apache POI的主要知识点包括: 1. **组件结构**:Apache POI...
11. **poi3.8版本.rar**:这可能是整个Apache POI 3.8的源码或附加资源,方便开发者进行深入研究或定制开发。 使用这些库,开发者可以创建Java应用程序来导入和导出Excel文件,例如,创建新的工作簿,添加工作表,...
标题 "POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析" 提到了Apache POI库的一个高级话题,主要关注的是如何使用XSSF(XML Spreadsheet Formatting Streams)和SAX(Simple API for XML)的Event ...
在POI3.8中,最重要的组件包括HSSF(Horrible Spreadsheet Format)和XSSF(Extensible Spreadsheet Format),分别用于处理老版的BIFF8格式(.xls)和新的OOXML格式(.xlsx)。HSSF提供了对Excel 97-2003工作簿的...
这个压缩包包含的6个jar文件是POI 3.8版的核心组件,每个都有特定的功能: 1. **poi-3.8-20120326.jar**:这是Apache POI的主要库,包含了处理二进制Excel文件(.xls)的基本功能。你可以通过这个库创建、读取和...
在本文中,我们将深入探讨Apache POI 3.8版本中的Event API,特别是针对HSSF(Horizontally Sparse File Format)的事件解析。Apache POI是一个流行的Java库,它允许开发人员处理Microsoft Office格式的文件,如...
标题中的"poi3.8jar包"指的是Apache POI项目的3.8版本的Java库,这个库以JAR(Java Archive)文件的形式提供,便于Java开发者在他们的应用中集成对Office文档的支持。 Apache POI的主要功能: 1. **Excel处理**: ...
1. **HSSF和XSSF**:这是POI用来处理Excel文件的两个主要组件。HSSF是处理旧版BIFF格式(.xls)的API,而XSSF则是用于处理OOXML格式(.xlsx)的API。两者都提供了创建工作簿、工作表、单元格、样式等功能。 2. **...
Apache POI库提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个主要组件,分别用于处理老版本的BIFF格式(.xls)和新版本的OOXML格式(.xlsx)。对于大数据量的Excel文件,XSSF通常更...
标题中的"POI3.8以及3.9的API"指的是这两个版本的API接口文档,是开发者理解和使用POI库的关键资源。API文档详尽地列出了各种类、方法和接口,使得开发者能够有效地利用POI进行文件操作。 在POI 3.8和3.9中,主要...
标题“读写Excel2007 POI3.8”涉及的是使用Apache POI库的3.8版本处理Microsoft Excel 2007文件的方法。Apache POI是Java的一个开源项目,专门用于读取、创建和修改Microsoft Office格式的文件,特别是Excel文件。在...
Apache POI是一个强大的Java库,专门用于处理微软的OLE2组件文档格式,如Microsoft Excel、Word、PowerPoint等。这个库使得在Java环境中创建、读取和修改这些文件变得非常容易,无需依赖于微软的Office套件。"POI ...
Apache POI的API设计直观且易于理解,其核心组件包括: 1. HSSF(Horrible Spreadsheet Format):用于处理老版的Excel 97-2003文件格式(.xls)。 2. XSSF(XML Spreadsheet Format):用于处理Excel 2007及以后...
这个压缩包提供了POI项目3.8版本的所有核心组件以及相关的XML schema定义,使得Java开发者能够方便地在应用程序中读取、写入和操作这些Office文档。 POI是Apache软件基金会的一个开源项目,它的全称是"Poor ...
这个压缩包中包含的文件是Apache POI 3.8版本的组件,允许开发者在Java环境中读取、写入和修改这些Office文档。 1. **POI-3.8.jar**:这是主POI库的核心JAR文件,包含了处理Excel(HSSF和XSSF)、Word(HWPF和XWPF...
这个资源包含了Apache POI 3.8 - beta4版本的所有开发所需的JAR包,使得Java开发者能够轻松地在他们的应用中实现读取、写入以及修改Office文档的功能。 1. **Apache POI 概述** Apache POI 是Apache软件基金会的一...
这个“poi-src-3.8”源码库是Apache POI 3.8版本的源代码,它包含了构建和理解这些文件格式所需的全部Java类和方法。 在3.8版本中,Apache POI提供以下关键功能: 1. **Excel处理**:POI-HSSF(Horrible ...
在这个压缩包中,你将会找到六个名为"poi-3.8-20120326"的JAR文件,这很可能是Apache POI库的不同组件或模块。JAR(Java Archive)是Java平台的标准打包格式,用于收集多个类文件和其他资源文件,便于部署和分发。这...