第一步让我们来看看我们的大量数据的excel 文件

好的下面第二步看一下代码:


  1. package com.chinait.utils;
  2. /**
  3. * 写这个东西主要是最近做了一个联通的数据迁移工作,他们就是这样导出的数据,所以我们写了这个代码。
  4. * 还有一个就是网上n 多都是半成品,代码不能直接运行,我这个代码能够直接运行。
  5. * java poi 之sax 解析10万级大数量数据,其实百万,千万都是可以的,
  6. * 但是想到这么大的数据一般不会使用excel 进行导入数据的行为,所以我采用了这个方法只是针对于10万级数据,
  7. * 宁外,虚拟机的堆内存需要设置大一些,不然会报内存溢出。
  8. * 支持多个sheet 数据一起导入
  9. * 支持按照数据量范围取值
  10. */
  11. import java.io.InputStream;
  12. import java.util.ArrayList;
  13. import java.util.Iterator;
  14. import java.util.LinkedHashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.Map.Entry;
  18. import java.util.regex.Pattern;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.apache.poi.openxml4j.opc.OPCPackage;
  21. import org.apache.poi.xssf.eventusermodel.XSSFReader;
  22. import org.apache.poi.xssf.model.SharedStringsTable;
  23. import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  24. import org.xml.sax.Attributes;
  25. import org.xml.sax.ContentHandler;
  26. import org.xml.sax.InputSource;
  27. import org.xml.sax.SAXException;
  28. import org.xml.sax.XMLReader;
  29. import org.xml.sax.helpers.DefaultHandler;
  30. import org.xml.sax.helpers.XMLReaderFactory;
  31. public class MyExcel2007ForPaging_high {
  32. private static List<Map<String,String>> dataListT;
  33. private final int startRow;
  34. private final int endRow;
  35. private int currentRow = 0;
  36. private final String filename;
  37. private static Map<String,String> map;
  38. static char[] strChar ;
  39. /**
  40. * 构造方法
  41. */
  42. public MyExcel2007ForPaging_high(String filename,int startRow,int endRow) throws Exception{
  43. dataListT = new ArrayList<>();
  44. if(StringUtils.isEmpty(filename)) throw new Exception("文件名不能空");
  45. this.filename = filename;
  46. this.startRow = startRow;
  47. this.endRow = endRow+1;
  48. processSheet();
  49. }
  50. /**
  51. * 指定获取第一个sheet
  52. * @param filename
  53. * @throws Exception
  54. */
  55. private void processSheet() throws Exception {
  56. OPCPackage pkg = OPCPackage.open(filename);
  57. XSSFReader r = new XSSFReader( pkg );
  58. SharedStringsTable sst = r.getSharedStringsTable();
  59. XMLReader parser = fetchSheetParser(sst);
  60. Iterator<InputStream> it = r.getSheetsData();
  61. while(it.hasNext()){
  62. map = null;
  63. InputStream sheet1 = it.next();
  64. InputSource sheetSource = new InputSource(sheet1);
  65. parser.parse(sheetSource);
  66. sheet1.close();
  67. }
  68. }
  69. /**
  70. * 加载sax 解析器
  71. * @param sst
  72. * @return
  73. * @throws SAXException
  74. */
  75. private XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
  76. XMLReader parser =
  77. XMLReaderFactory.createXMLReader(
  78. "org.apache.xerces.parsers.SAXParser"
  79. );
  80. ContentHandler handler = new PagingHandler(sst);
  81. parser.setContentHandler(handler);
  82. return parser;
  83. }
  84. /**
  85. * See org.xml.sax.helpers.DefaultHandler javadocs
  86. */
  87. private class PagingHandler extends DefaultHandler {
  88. private SharedStringsTable sst;
  89. private String lastContents;
  90. private boolean nextIsString;
  91. private String index = null;
  92. private PagingHandler(SharedStringsTable sst) {
  93. this.sst = sst;
  94. }
  95. /**
  96. * 开始元素 (获取key 值)
  97. */
  98. @Override
  99. public void startElement(String uri, String localName, String name,
  100. Attributes attributes) throws SAXException {
  101. if(name.equals("c")) {
  102. index = attributes.getValue("r");
  103. //判断是否是新的一行
  104. if(Pattern.compile("^A[0-9]+$").matcher(index).find()){
  105. if(map!=null&&isAccess()&&!map.isEmpty()){
  106. dataListT.add(map);
  107. }
  108. map = new LinkedHashMap<>();
  109. currentRow++;
  110. }
  111. if(isAccess()){
  112. String cellType = attributes.getValue("t");
  113. if(cellType != null && cellType.equals("s")) {
  114. nextIsString = true;
  115. } else {
  116. nextIsString = false;
  117. }
  118. }
  119. }
  120. lastContents = "";
  121. }
  122. /**
  123. * 获取value
  124. */
  125. @Override
  126. public void endElement(String uri, String localName, String name)
  127. throws SAXException {
  128. if(isAccess()){
  129. if(nextIsString) {
  130. int idx = Integer.parseInt(lastContents);
  131. lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
  132. nextIsString = false;
  133. }
  134. if(name.equals("v")) {
  135. map.put(index, lastContents);
  136. }
  137. }
  138. }
  139. @Override
  140. public void characters(char[] ch, int start, int length)
  141. throws SAXException {
  142. if(isAccess()){
  143. lastContents += new String(ch, start, length);
  144. }
  145. }
  146. @Override
  147. public void endDocument ()throws SAXException{
  148. if(map!=null&&isAccess()&&!map.isEmpty()){
  149. dataListT.add(map);
  150. }
  151. }
  152. }
  153. private boolean isAccess(){
  154. if(currentRow>=startRow¤tRow<=endRow){
  155. return true;
  156. }
  157. return false;
  158. }
  159. /**
  160. * 获取数据 并且填补字段值为空的数据
  161. * @return
  162. * @throws Exception
  163. */
  164. public List<Map<String,String>> getMyDataList() throws Exception{
  165. List<Map<String,String>> list = dataListT.subList(startRow, dataListT.size());
  166. if(!list.isEmpty()){
  167. Map<String,String> map = dataListT.get(0);
  168. List<String> com = data("A",map.size()-1);
  169. for(int i=0;i<list.size();i++){
  170. Map<String,String> returnMap = list.get(i);
  171. for(String str:com){
  172. boolean flag = true;
  173. for(Entry<String,String> entry:returnMap.entrySet()){
  174. if(entry.getKey().contains(str)){
  175. //有
  176. flag = false;
  177. break;
  178. }
  179. }
  180. if(flag){
  181. //没有
  182. returnMap.put(str+(i+2), null);
  183. }
  184. }
  185. }
  186. }
  187. return list;
  188. }
  189. public static void main(String[] args) throws Exception {
  190. MyExcel2007ForPaging_high reader = new MyExcel2007ForPaging_high("D://20000.xlsx",1,30000);
  191. reader.getMyDataList();
  192. }
  193. /**
  194. * 封装数据
  195. * @param str
  196. * @param counts
  197. * @return
  198. */
  199. public static List<String> data(String str,int counts){
  200. List<String> list = new ArrayList<>();
  201. list.add(str);
  202. for(int i=0;i<counts;i++){
  203. strChar = str.toCharArray();
  204. jinwei(0);
  205. str = new String(strChar);
  206. list.add(str);
  207. }
  208. return list;
  209. }
  210. //数字进位
  211. public static void jinwei(int index){
  212. char a = 'A';
  213. int aint =(int)('A');
  214. if((strChar.length-1)-index>=0){
  215. int sc = (int)strChar[(strChar.length-1)-index];
  216. if(sc- 25 >= aint){
  217. jinwei(index+1);
  218. strChar[(strChar.length-1)-index] = a;
  219. }else{
  220. strChar[strChar.length-1-index] = (char)(sc+1);
  221. }
  222. }else{
  223. strChar[(strChar.length-1)-index+1] = a;
  224. StringBuilder str = new StringBuilder();
  225. str.append('A');
  226. str.append(strChar);
  227. strChar = str.toString().toCharArray();
  228. }
  229. }
  230. }

这是输出结果:

写这个东西主要是最近做了一个联通的数据迁移工作,他们就是这样导出的数据,所以我们写了这个代码。

还有一个就是网上n 多都是半成品,代码不能直接运行,我这个代码能够直接运行。

java poi 之sax 解析10万级大数量数据,其实百万,千万都是可以的。

但是想到这么大的数据一般不会使用excel 进行导入数据的行为,所以我采用了这个方法只是针对于10万级数据。

宁外,虚拟机的堆内存需要设置大一些,不然会报内存溢出。

支持多个sheet 数据一起导入。

支持按照数据量范围取值。

支持原创,支持代码能运行的原创,谢谢!~

原文地址:https://blog.csdn.net/sai739295732/article/details/68489403

JAVA Apache POI 之sax 解析10万级大数量数据的更多相关文章

  1. 10万级etl调度软件Taskctl-web版免费授权及产品功能特性

    转: 10万级etl调度软件Taskctl-web版免费授权及产品功能特性 初识Taskctl-Web版 Taskctl Free应用版原型是在原有商用版Taskctl 6.0衍生扩展开发出的专门为批 ...

  2. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  3. 使用java Apache poi 根据word模板生成word报表

    项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...

  4. Apache Poi实现excel解析

    一.说明 1.本文通过使用 poi 工具解析 excel 表格数据,实现导入导出 2.excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种 ...

  5. 10万级etl批量作业自动化调度工具Taskctl之轻量级Web应用版

    什么是批量作业: 批量处理是银行业整个信息后台最为重要的技术形态,也是银行核心信息资产数据的分享.传输.演化的重要技术手段.有调查指出,全球70%的数据是经过批量处理得以再次使用,可见批量处理在整个信 ...

  6. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题

    庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...

  7. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  8. 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 ...

  9. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

随机推荐

  1. Mysql 8.0 新特性

    转载:https://www.jianshu.com/p/be29467c2b0c

  2. python2和python3中filter函数

    在python2和python3中filter是不同的,其中在python2中filter返回的是一个list,可以直接使用 >>> a = [1,2,3,4,5,6,7] > ...

  3. Docker 容器的数据管理

    docker 容器的数据卷 什么是数据卷(DataVolume) 数据卷是经过特殊计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问. 数据卷设计的目的,在于数据的永久化,它完全独立与 ...

  4. Voyager下的关系模型

    关系:一个用户有几件商品,对应User表和Products表 在Products表下添加字段,user_id 打开products下的bread,点击Create Relationship Produ ...

  5. 使用linux安装gitolite管理git

    系统:centos7 服务器:阿里云 一.前期准备 1.安装git yum install git 2.安装perl yum install perl 3.安装openssh yum install ...

  6. 线段树:CDOJ1592-An easy problem B (线段树的区间合并)

    An easy problem B Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  7. Solution: 最近公共祖先·一 [hiho一下 第十三周]

    题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中 ...

  8. Linux学习-YUM 在线升级机制

    这个 yum 是透过分析 RPM 的标头资料后, 根据 各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件 安装或移除与升级的问题. 利用 yum 进行查询.安装 ...

  9. webservice soap wsdl简介

    先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构 ...

  10. 虚拟机上的Linux学习

    title: 虚拟机上的Linux学习 date: 2018-08-08 15:48:28 updated: tags: [Linux,学习笔记] description: keywords: com ...