`
longgangbai
  • 浏览: 7332421 次
  • 性别: 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中含有表格(表格很宽)时,在网页中显示不正常,怎么解决呀?谢谢!

相关推荐

    poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar

    内部包括poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar、poi-ooxml-schemas-3.8-20120326.jar 测试可用版本,有些下载的不能用

    poi-src-3.8-beta5-20111217.tar.gz

    由于是源代码压缩包,其中的"poi-3.8-beta5"很可能包含了Apache POI项目的全部源代码文件。开发者可以深入研究源码,理解其内部工作原理,进行二次开发或定制化需求。源代码可能包括以下几个部分: 1. **src**: ...

    poi-ooxml-schemas-3.8,poi-3.8,poi-ooxml jar包合集

    标题中的"poi-ooxml-schemas-3.8,poi-3.8,poi-ooxml jar包合集"指的是Apache POI项目中用于处理Microsoft Office格式文件的Java库,特别是针对Excel(XLS和XLSX)文档的处理。Apache POI是一个流行的开源库,允许...

    poi-3.8-POI-HSSF和POI-XSSF和SXSSF.rar

    在"poi-3.8-POI-HSSF和POI-XSSF和SXSSF.rar"这个压缩包中,主要涵盖了POI项目对Excel文件处理的三个关键组件:HSSF、XSSF和SXSSF。 1. HSSF (Horrible Spreadsheet Format):这是POI项目早期开发的一个API,用于...

    poi-3.8-beta3-20110606工具包

    为了使用POI,开发者需要将提供的"poi-3.8-beta3-20110606.jar"添加到项目的类路径中,然后就可以通过调用相应的API来操作Office文件了。同时,通过学习和参考"poi-examples-3.8-beta3-20110606"中的代码,可以加快...

    poi3.8+poi-pdf+poi-core.rar

    - **poi-3.8-20120326.jar**:核心库,提供了对HSSF(用于旧版Excel .xls)和XSSF(用于新版Excel .xlsx)的支持。 - **poi-ooxml-schemas-3.8-20120326.jar**:包含了Office Open XML的XML模式,用于解析和创建...

    poi-3.8.jar;poi-ooxml-3.8.jar;poi-ooxml-schemas-3.8.jar

    java中读取word文档需要引用apache的poi开源项目...为方便下载提供6个jar包,其中包含:poi-3.8.jar;poi-ooxml-3.8.jar;poi-ooxml-schemas-3.8.jar;poi-scratchpad-3.8.jar;xmlbeans-2.3.0.jar;dom4j-1.6.1.jar。

    POI3.8组件研究(四)--Event API (HSSF Only)事件的解析

    在本文中,我们将深入探讨Apache POI 3.8版本中的Event API,特别是针对HSSF(Horizontally Sparse File Format)的事件解析。Apache POI是一个流行的Java库,它允许开发人员处理Microsoft Office格式的文件,如...

    POI包最新版3.8-beta4-20110826

    这个压缩包“POI包最新版3.8-beta4-20110826”包含了POI项目的3.8-beta4版本,发布于2011年8月26日。此版本在当时的POI开发历史中扮演了重要角色,提供了对Office文档更全面和稳定的支持。 1. **POI项目介绍** - ...

    poi-3.8-20120326-6个jar包

    poi-3.8-20120326-6个jar包: poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-excelant-3.8-20120326.jar poi-ooxml-3.8-20120326.jar poi-ooxml-schemas-3.8-20120326.jar poi-scratchpad-3.8-20120326....

    poi3.8和3.10还有3.11的jar包,保证可用

    Apache POI是一个开源项目,主要用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java开发中,POI库被广泛用于读取、写入和修改这些文档。提供的jar包分别是3.8、3.10和3.11版本,每个版本都有其...

    poi-bin-3.8-beta4-20110826

    "poi-bin-3.8-beta4-20110826"是一个特定版本的POI库的二进制发行包,发布于2011年8月26日,属于3.8 beta 4版本。这个版本包含了处理Office文档所需的类和资源文件。 POI项目的核心组件包括以下几个部分: 1. **...

    poi-examples-3.8-beta5-sources.jar.zip

    这个"poi-examples-3.8-beta5-sources.jar.zip"文件包含的是Apache POI 3.8 Beta 5版本的源代码示例。源代码对于开发者来说是极其宝贵的资源,它能帮助我们理解库的内部工作原理,调试问题,以及根据需求自定义功能...

    poi-3.8-20120326.jar 和 poi-excelant-3.8-20120326.jar

    在给定的文件中,"poi-3.8-20120326.jar" 和 "poi-excelant-3.8-20120326.jar" 是Apache POI库的特定版本,主要用于Java环境下读取和写入Excel文件。 Apache POI的核心功能: 1. **Excel文件处理**:Apache POI ...

    poi-3.8-final-jdk1.4-20120520-rc1.jar

    poi-3.8-final-jdk1.4-20120520-rc1.jar

    poi-ooxml-4.1.2-API文档-中文版.zip

    赠送原API文档:poi-ooxml-4.1.2-javadoc.jar; 赠送源代码:poi-ooxml-4.1.2-sources.jar; 赠送Maven依赖信息文件:poi-ooxml-4.1.2.pom; 包含翻译后的API文档:poi-ooxml-4.1.2-javadoc-API文档-中文(简体)版....

    poi-ooxml-schemas-3.8-20120326.jar 包

    导入excel需要的\poi-ooxml-schemas-3.8-20120326.jar

    读写Excel2007 POI3.8

    3. poi-3.8-beta2-20110408.jar:主Apache POI库,提供了与Excel文件交互的基础功能。 4. poi-scratchpad-3.8-beta2-20110408.jar:包含了POI项目的一些实验性或未成熟的功能。 5. poi-ooxml-3.8-beta2-20110408.jar...

    poi 3.8 3.9 3.10 3.15 3.17各种版本

    在Java环境中,POI库提供了丰富的API,使得开发者能够方便地读取、写入和操作这些文件。在给定的标题和描述中,提到了几个不同版本的POI,包括3.8、3.9、3.10、3.15和3.17。每个版本都有其特定的更新和改进,下面将...

Global site tag (gtag.js) - Google Analytics