`
longgangbai
  • 浏览: 7360774 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析

阅读更多

    针对Event API事件解析仅仅支持excel97~03版本的excel,然而基于XSSF and SAX (Event API)事件的解析仅仅支持excel2007解析方式:同时需要创建SAX处理器继承自SAXHandler对象。

采用XSSF and SAX (Event API) 方式解析Excel2007
        excel2007是一个标准xml所以可以采用sax解析的模式。
         优点:1.效率比较高。
         缺点: 2.只能支持excel2007,针对97~2003格式的excel非标准的xml不支持

 

针对SAX的解析处理器对象:

 

package com.easyway.excel.events.sax;

import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 *  创建SAX解析处理器必须继承自
 *  org.xml.sax.helpers.DefaultHandler
 * 实现响应的方法。
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-6-17
 * @author  longgangbai
 * @version 1.0
 */
public class ExcelSheetSAXHandler extends DefaultHandler {
	private SharedStringsTable sst;
	private String lastContents;
	private boolean nextIsString;
	
	public ExcelSheetSAXHandler(SharedStringsTable sst) {
		this.sst = sst;
	}
	
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// c => cell
		if(name.equals("c")) {
			// Print the cell reference
			System.out.print(attributes.getValue("r") + " - ");
			// Figure out if the value is an index in the SST
			String cellType = attributes.getValue("t");
			if(cellType != null && cellType.equals("s")) {
				nextIsString = true;
			} else {
				nextIsString = false;
			}
		}
		// Clear contents cache
		lastContents = "";
	}
	
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// Process the last contents as required.
		// Do now, as characters() may be called more than once
		if(nextIsString) {
			int idx = Integer.parseInt(lastContents);
			lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
        nextIsString = false;
		}

		// v => contents of a cell
		// Output after we've seen the string contents
		if(name.equals("v")) {
			System.out.println(lastContents);
		}
	}

	public void characters(char[] ch, int start, int length)
			throws SAXException {
		lastContents += new String(ch, start, length);
	}
}
 

针对HSSF+SAX的类:

package com.easyway.excel.events.sax;

import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.openxml4j.opc.Package;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
 * 采用XSSF and SAX (Event API) 方式解析Excel2007
 *  
 *    excel2007是一个标准xml所以可以采用sax解析的模式。
 *    优点:1.效率比较高。
 *    缺点: 2.只能支持excel2007,针对97~2003格式的excel非标准的xml不支持
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-6-17
 * @author  longgangbai
 * @version 1.0
 */
public class SAXHandlerEventUserModel {
	/**
	 * 处理excel中只有一个sheet的方法
	 * @param filename
	 * @throws Exception
	 */
	public void processOneSheet(String filename) throws Exception {
		@SuppressWarnings("deprecation")
		Package pkg = Package.open(filename);
		//创建excel2007的阅读器对象
		XSSFReader r = new XSSFReader( pkg );
		SharedStringsTable sst = r.getSharedStringsTable();
		XMLReader parser = fetchSheetParser(sst);

		// rId2 found by processing the Workbook
		// Seems to either be rId# or rSheet#
		InputStream sheet2 = r.getSheet("rId2");
		InputSource sheetSource = new InputSource(sheet2);
		parser.parse(sheetSource);
		sheet2.close();
	}

	/**
	 * 处理excel中有多个sheet的格式的 
	 * @param filename
	 * @throws Exception
	 */
	public void processAllSheets(String filename) throws Exception {
		Package pkg = Package.open(filename);
		XSSFReader r = new XSSFReader( pkg );
		SharedStringsTable sst = r.getSharedStringsTable();
		XMLReader parser = fetchSheetParser(sst);
		//获取多个sheet的输入流对象
		Iterator<InputStream> sheets = r.getSheetsData();
		while(sheets.hasNext()) {
			System.out.println("Processing new sheet:\n");
			InputStream sheet = sheets.next();
			InputSource sheetSource = new InputSource(sheet);
			parser.parse(sheetSource);
			sheet.close();
			System.out.println("");
		}
	}

	/**
	 * 设置xml阅读器的解析器对象
	 * @param sst
	 * @return
	 * @throws SAXException
	 */
	public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
		//通过放射方式获取xml阅读器对象
		XMLReader parser =
			XMLReaderFactory.createXMLReader(
					"org.apache.xerces.parsers.SAXParser"
			);
	     //创建相关的xml解析器对象
		ContentHandler handler = new ExcelSheetSAXHandler(sst);
		//设置解析器对象
		parser.setContentHandler(handler);
		return parser;
	}
}
 

测试方法如下:

package com.easyway.excel.events.sax;
/**
 * 
 * 
 * @Title: 测试SAX方式解析Excel 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-6-17
 * @author  longgangbai
 * @version 1.0
 */
public class SAXEventUserModel {
	public static void main(String[] args) throws Exception {
		System.out.println("开始采用SAX解析Excel !");
		SAXHandlerEventUserModel howto = new SAXHandlerEventUserModel();
		howto.processOneSheet("C:\\station2stationone.xlsx");
		System.out.println("单独一个sheet解析完毕!");
		howto.processAllSheets("C:\\station2stationmany.xlsx");
		System.out.println("单独多个个sheet解析完毕!");
		System.out.println("采用SAX解析Excel 完毕!");
	}

}

 

 

测试所需的两个excel文件:

 

0
0
分享到:
评论
3 楼 上树的猪 2014-12-15  
clgoogle 写道
但是这种方式比 一次性读到内存中的慢很多

慢了4倍左右,
14万数据(只有一列),文件大小只有1M,直接读到内存的方式,只要6s
sax这种方式需要27s
这个不知道你们有解决过


大哥 内存操作肯定快啊,但是你内存能加载多大数据?
2 楼 clgoogle 2012-12-18  
但是这种方式比 一次性读到内存中的慢很多

慢了4倍左右,
14万数据(只有一列),文件大小只有1M,直接读到内存的方式,只要6s
sax这种方式需要27s
这个不知道你们有解决过
1 楼 qingyezhu 2012-09-23  
请问,用poi3.8中的wordtohtmlconver类将doc转化为html,其中doc中含有表格(表格很宽)时,在网页中显示不正常,怎么解决呀?谢谢!

相关推荐

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用 ,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用。,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协议与数据加密,适用于多种物联网应用。,资料:4g GPRS DTU 开发板软件代码硬件图纸料包括:原理图,版图,单片机代码,sim800c官方资料 不含PCB板 本公司批产产品,已无故障运行数年 全套硬件图纸和软件代码。 程序比正点原子的可靠,军工级485电路。 NBIOT和4G等采用AT指令的均可参照此代码 GPRS具有比NBIOT更低的价格更好的网络,是目前低速物联网的主要通讯技术之一。 485转GPRS GPRS支持协议: TCP UDP HTTP-GET HTTP-POST FTP Md5数据加密 心跳包 电源部分,带共模电感,防反接二极管,Tvs管,5-30Vdc转5V和4V 485部分,硬件延时电路,可靠稳定 引出网络状态(兼电源)指示灯,收发指示灯,设置状态指示灯 微动按键设置工作状态 已预留LORA模块位置,若不用可将他的Io口改做他用,能引出一路串口,2路Io口 单片机

    scala-intellij-bin-2024.1.1.zip

    scala-intellij-bin-2024.1.1.zip

    基于Android的平台书架设计实现源码.zip

    基于Android的平台书架设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    (源码)基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用_1.zip

    # 基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用 ## 项目简介 这是一个基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗(BLE)应用程序的示例项目。项目包含基于nRF51822和nRF52832芯片的示例代码,以及设备固件升级(DFU)相关的代码。 ## 项目的主要特性和功能 基于nRF5系列芯片项目代码适用于Nordic Semiconductor的nRF51822和nRF52832芯片,这些芯片是专为蓝牙低能耗应用设计的。 使用SoftDevice SDK项目使用了Nordic的SoftDevice SDK,这是一个高度优化的BLE堆栈,适用于nRF5系列芯片。 支持UART通信项目中的BLE应用程序通过UART接口进行通信,允许数据通过BLE连接进行发送和接收。 设备固件升级(DFU)支持项目包含用于安全设备固件升级的引导加载程序,支持固件更新的验证和存储。

    矿业生产管理数字化平台解决方案.doc

    矿业生产管理数字化平台解决方案.doc

    【ACO三维路径规划】基于matlab蚁群算法ACO无人机巡检三维路径规划【含Matlab源码 13058期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    battery 电池信息表

    kylin v10 SP1 系统下 可以查看本机电池容量放电和充电电流

    基于深度学习的movielens推荐模型新版算法源码+数据+说明文档

    【资源介绍】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,也可以作为小白实战演练和初期项目立项演示的重要参考借鉴资料。 3、本资源作为“学习资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研和多多调试实践。 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip

    【雷达通信】基于matlab雷达系统极化对消仿真【含Matlab源码 9700期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    STM32的智能养老服务机器人系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    基于STM32的智能风扇系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    14.智能台灯(语音模式)_20240318_205506.zip

    14.智能台灯(语音模式)_20240318_205506.zip

    数字信号处理中的采样与重构理论及其应用

    数字信号处理中的采样与重构理论及其应用

    Python快速入门.zip

    python快速入门,零基础也能轻松掌握的入门指南,看着一个就够了。

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读取方法。 ,LabVIEW; 三菱全系列通讯方法; 三菱全系列通讯办法; 上位机读取方法,LabVIEW与三菱全系列通讯方案及上位机读取方法详解

    基于51的多参数水质监测与报警系统设计20250304

    题目:基于51单片机的多参数水质监测与报警系统设计 主控:AT89C51 显示:LCD1602 DS18B20温度传感器 浊度传感器(PCF8591+滑动变阻器模拟) PH传感器(ADC0832+滑动变阻器) 声光报警 led*4 功能: 1.实时检测水质温度、浊度、PH 2.实时显示相关数据 3.可以通过按键修改阈值 4.各数值不在标准范围内启动声光报警 5.ph低于下限红色小灯点亮;ph高于上限绿色小灯电亮;温度低于阈值蓝色小灯电亮;浑浊度高于阈值橙色小灯电亮

    B站黑马程序员python第二章06-标识符(个人笔记)

    在B站看黑马程序员视频,整理的个人笔记

    java项目之水果系统源码.zip

    java项目之水果系统源码

    Delphi 12.3 控件之Office-Tool-with-runtime-v10.14.28.0-x64.zip.rar

    Office_Tool_with_runtime_v10.14.28.0_x64.zip.rar

Global site tag (gtag.js) - Google Analytics