JAVA Apache POI 之sax 解析10万级大数量数据
第一步让我们来看看我们的大量数据的excel 文件
好的下面第二步看一下代码:
-
package com.chinait.utils;
-
-
/**
-
* 写这个东西主要是最近做了一个联通的数据迁移工作,他们就是这样导出的数据,所以我们写了这个代码。
-
* 还有一个就是网上n 多都是半成品,代码不能直接运行,我这个代码能够直接运行。
-
* java poi 之sax 解析10万级大数量数据,其实百万,千万都是可以的,
-
* 但是想到这么大的数据一般不会使用excel 进行导入数据的行为,所以我采用了这个方法只是针对于10万级数据,
-
* 宁外,虚拟机的堆内存需要设置大一些,不然会报内存溢出。
-
* 支持多个sheet 数据一起导入
-
* 支持按照数据量范围取值
-
*/
-
-
import java.io.InputStream;
-
import java.util.ArrayList;
-
import java.util.Iterator;
-
import java.util.LinkedHashMap;
-
import java.util.List;
-
import java.util.Map;
-
import java.util.Map.Entry;
-
import java.util.regex.Pattern;
-
-
import org.apache.commons.lang.StringUtils;
-
import org.apache.poi.openxml4j.opc.OPCPackage;
-
import org.apache.poi.xssf.eventusermodel.XSSFReader;
-
import org.apache.poi.xssf.model.SharedStringsTable;
-
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
-
import org.xml.sax.Attributes;
-
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.DefaultHandler;
-
import org.xml.sax.helpers.XMLReaderFactory;
-
-
public class MyExcel2007ForPaging_high {
-
private static List<Map<String,String>> dataListT;
-
private final int startRow;
-
private final int endRow;
-
private int currentRow = 0;
-
private final String filename;
-
private static Map<String,String> map;
-
static char[] strChar ;
-
/**
-
* 构造方法
-
*/
-
public MyExcel2007ForPaging_high(String filename,int startRow,int endRow) throws Exception{
-
dataListT = new ArrayList<>();
-
if(StringUtils.isEmpty(filename)) throw new Exception("文件名不能空");
-
this.filename = filename;
-
this.startRow = startRow;
-
this.endRow = endRow+1;
-
processSheet();
-
}
-
/**
-
* 指定获取第一个sheet
-
* @param filename
-
* @throws Exception
-
*/
-
private void processSheet() throws Exception {
-
OPCPackage pkg = OPCPackage.open(filename);
-
XSSFReader r = new XSSFReader( pkg );
-
SharedStringsTable sst = r.getSharedStringsTable();
-
XMLReader parser = fetchSheetParser(sst);
-
Iterator<InputStream> it = r.getSheetsData();
-
while(it.hasNext()){
-
map = null;
-
InputStream sheet1 = it.next();
-
InputSource sheetSource = new InputSource(sheet1);
-
parser.parse(sheetSource);
-
sheet1.close();
-
}
-
}
-
/**
-
* 加载sax 解析器
-
* @param sst
-
* @return
-
* @throws SAXException
-
*/
-
private XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
-
XMLReader parser =
-
XMLReaderFactory.createXMLReader(
-
"org.apache.xerces.parsers.SAXParser"
-
);
-
ContentHandler handler = new PagingHandler(sst);
-
parser.setContentHandler(handler);
-
return parser;
-
}
-
-
/**
-
* See org.xml.sax.helpers.DefaultHandler javadocs
-
*/
-
private class PagingHandler extends DefaultHandler {
-
private SharedStringsTable sst;
-
private String lastContents;
-
private boolean nextIsString;
-
private String index = null;
-
private PagingHandler(SharedStringsTable sst) {
-
this.sst = sst;
-
}
-
/**
-
* 开始元素 (获取key 值)
-
*/
-
@Override
-
public void startElement(String uri, String localName, String name,
-
Attributes attributes) throws SAXException {
-
if(name.equals("c")) {
-
index = attributes.getValue("r");
-
//判断是否是新的一行
-
if(Pattern.compile("^A[0-9]+$").matcher(index).find()){
-
if(map!=null&&isAccess()&&!map.isEmpty()){
-
dataListT.add(map);
-
}
-
map = new LinkedHashMap<>();
-
currentRow++;
-
}
-
if(isAccess()){
-
String cellType = attributes.getValue("t");
-
if(cellType != null && cellType.equals("s")) {
-
nextIsString = true;
-
} else {
-
nextIsString = false;
-
}
-
}
-
}
-
lastContents = "";
-
}
-
/**
-
* 获取value
-
*/
-
@Override
-
public void endElement(String uri, String localName, String name)
-
throws SAXException {
-
if(isAccess()){
-
if(nextIsString) {
-
int idx = Integer.parseInt(lastContents);
-
lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
-
nextIsString = false;
-
}
-
if(name.equals("v")) {
-
map.put(index, lastContents);
-
}
-
}
-
-
}
-
@Override
-
public void characters(char[] ch, int start, int length)
-
throws SAXException {
-
if(isAccess()){
-
lastContents += new String(ch, start, length);
-
}
-
}
-
@Override
-
public void endDocument ()throws SAXException{
-
if(map!=null&&isAccess()&&!map.isEmpty()){
-
dataListT.add(map);
-
}
-
}
-
-
}
-
private boolean isAccess(){
-
if(currentRow>=startRow¤tRow<=endRow){
-
return true;
-
}
-
return false;
-
}
-
/**
-
* 获取数据 并且填补字段值为空的数据
-
* @return
-
* @throws Exception
-
*/
-
public List<Map<String,String>> getMyDataList() throws Exception{
-
List<Map<String,String>> list = dataListT.subList(startRow, dataListT.size());
-
if(!list.isEmpty()){
-
Map<String,String> map = dataListT.get(0);
-
List<String> com = data("A",map.size()-1);
-
for(int i=0;i<list.size();i++){
-
Map<String,String> returnMap = list.get(i);
-
for(String str:com){
-
boolean flag = true;
-
for(Entry<String,String> entry:returnMap.entrySet()){
-
if(entry.getKey().contains(str)){
-
//有
-
flag = false;
-
break;
-
}
-
}
-
if(flag){
-
//没有
-
returnMap.put(str+(i+2), null);
-
}
-
}
-
}
-
}
-
return list;
-
}
-
-
public static void main(String[] args) throws Exception {
-
MyExcel2007ForPaging_high reader = new MyExcel2007ForPaging_high("D://20000.xlsx",1,30000);
-
reader.getMyDataList();
-
}
-
/**
-
* 封装数据
-
* @param str
-
* @param counts
-
* @return
-
*/
-
public static List<String> data(String str,int counts){
-
List<String> list = new ArrayList<>();
-
list.add(str);
-
for(int i=0;i<counts;i++){
-
strChar = str.toCharArray();
-
jinwei(0);
-
str = new String(strChar);
-
list.add(str);
-
}
-
return list;
-
}
-
//数字进位
-
public static void jinwei(int index){
-
char a = 'A';
-
int aint =(int)('A');
-
if((strChar.length-1)-index>=0){
-
int sc = (int)strChar[(strChar.length-1)-index];
-
if(sc- 25 >= aint){
-
jinwei(index+1);
-
strChar[(strChar.length-1)-index] = a;
-
}else{
-
strChar[strChar.length-1-index] = (char)(sc+1);
-
}
-
}else{
-
strChar[(strChar.length-1)-index+1] = a;
-
StringBuilder str = new StringBuilder();
-
str.append('A');
-
str.append(strChar);
-
strChar = str.toString().toCharArray();
-
}
-
}
-
}
这是输出结果:
写这个东西主要是最近做了一个联通的数据迁移工作,他们就是这样导出的数据,所以我们写了这个代码。
还有一个就是网上n 多都是半成品,代码不能直接运行,我这个代码能够直接运行。
java poi 之sax 解析10万级大数量数据,其实百万,千万都是可以的。
但是想到这么大的数据一般不会使用excel 进行导入数据的行为,所以我采用了这个方法只是针对于10万级数据。
宁外,虚拟机的堆内存需要设置大一些,不然会报内存溢出。
支持多个sheet 数据一起导入。
支持按照数据量范围取值。
支持原创,支持代码能运行的原创,谢谢!~
原文地址:https://blog.csdn.net/sai739295732/article/details/68489403
JAVA Apache POI 之sax 解析10万级大数量数据的更多相关文章
- 10万级etl调度软件Taskctl-web版免费授权及产品功能特性
转: 10万级etl调度软件Taskctl-web版免费授权及产品功能特性 初识Taskctl-Web版 Taskctl Free应用版原型是在原有商用版Taskctl 6.0衍生扩展开发出的专门为批 ...
- 【Java】使用Apache POI生成和解析Excel文件
概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...
- 使用java Apache poi 根据word模板生成word报表
项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...
- Apache Poi实现excel解析
一.说明 1.本文通过使用 poi 工具解析 excel 表格数据,实现导入导出 2.excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种 ...
- 10万级etl批量作业自动化调度工具Taskctl之轻量级Web应用版
什么是批量作业: 批量处理是银行业整个信息后台最为重要的技术形态,也是银行核心信息资产数据的分享.传输.演化的重要技术手段.有调查指出,全球70%的数据是经过批量处理得以再次使用,可见批量处理在整个信 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题
庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- Read / Write Excel file in Java using Apache POI
Read / Write Excel file in Java using Apache POI 2014-04-18 BY DINESH LEAVE A COMMENT About a year o ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
随机推荐
- Newtonsoft.Json初探
1.序列化 VehicleModelSearchingModel model = new VehicleModelSearchingModel() { brandId = , modelIds=&qu ...
- python @staticmethod和@classmethod
Python其实有3个方法,即 静态方法 (staticmethod), 类方法 (classmethod)和 实例方法. 如下: def foo(x): print "executing ...
- C/C++基础知识:函数指针和指针函数的基本概念
[函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指 ...
- 【转】浅谈对主成分分析(PCA)算法的理解
以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...
- 【Git版本控制】idea中使用git进行项目管理
转载博文:完整教程-idea使用git进行项目管理(总结版)
- Python数据分析【炼数成金15周完整课程】
点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...
- Eclipse上进行java web项目的打包
以下是一个基于maven搭建的Spring Boot项目的目录结构 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/ ...
- jsp内置对象及其方法
JSP中一共预先定义了9个这样的对象,分别为: request. response. session. application. out. pagecontext. con ...
- webdriver高级应用- 启动FireFox的同时打开Firebug
1. 首先本机Firefox浏览器需要安装一下firebug插件,具体怎么安装这里不赘述,网上教程很多. 2. 具体自动化实现的代码如下: #encoding=utf-8 from selenium ...
- POJ 2051 Argus
Argus Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8782 Accepted: 3985 Description ...