poi读取excel2007大文件

读取百万级数据量的xlsx文件的java代码 文件里包含可以运行起来的项目,下载下来解压后,引入项目就可以运行看结果了。该代码可以处理100万数据量的excel文件,xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大excel文件,本例子从这点出发,组装excel里读取的单条数据为list,在根据需求操作list,即单条读取,单条操作,下载下来 后找到endRow(int rowNum)函数,在函数末尾有个注销的list数组打印,这个list即从excel里读取的当前行,列顺序同excel里的列顺序,直接操作list即可。 立即下载

jar包:poi3.7、xbean、xercesImpl

package com.saxfs;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;


public abstract class  XxlsAbstract extends DefaultHandler {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	private SharedStringsTable sst;  
    private String lastContents;  
    private boolean nextIsString;  
  
    private int sheetIndex = -1;  
    private List<String> rowlist = new ArrayList<String>();  
    private int curRow = 0;  
    private int curCol = 0;  
  
    //excel记录行操作方法,以行索引和行元素列表为参数,对一行元素进行操作,元素为String类型  
//  public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ;  
      
    //excel记录行操作方法,以sheet索引,行索引和行元素列表为参数,对sheet的一行元素进行操作,元素为String类型  
    public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws Exception;  
      
    //只遍历一个sheet,其中sheetId为要遍历的sheet索引,从1开始,1-3  
    public void processOneSheet(String filename,int sheetId) throws Exception {  
        OPCPackage pkg = OPCPackage.open(filename);  
        XSSFReader r = new XSSFReader(pkg);  
        SharedStringsTable sst = r.getSharedStringsTable();  
          
        XMLReader parser = fetchSheetParser(sst);  
  
        // rId2 found by processing the Workbook  
        // 根据 rId# 或 rSheet# 查找sheet  
        InputStream sheet2 = r.getSheet("rId"+sheetId);  
        sheetIndex++;  
        InputSource sheetSource = new InputSource(sheet2);  
        parser.parse(sheetSource);  
        sheet2.close();  
    }  
  
    /** 
     * 遍历 excel 文件 
     */  
    public void process(String filename) throws Exception {  
        OPCPackage pkg = OPCPackage.open(filename);  
        XSSFReader r = new XSSFReader(pkg);  
        SharedStringsTable sst = r.getSharedStringsTable();  
  
        XMLReader parser = fetchSheetParser(sst);  
  
        Iterator<InputStream> sheets = r.getSheetsData();  
        while (sheets.hasNext()) {  
            curRow = 0;  
            sheetIndex++;  
            InputStream sheet = sheets.next();  
            InputSource sheetSource = new InputSource(sheet);  
            parser.parse(sheetSource);  
            sheet.close();  
        }  
    }  
  
    public XMLReader fetchSheetParser(SharedStringsTable sst)  
            throws SAXException {  
        XMLReader parser = XMLReaderFactory  
                .createXMLReader("org.apache.xerces.parsers.SAXParser");  
        this.sst = sst;  
        parser.setContentHandler(this);  
        return parser;  
    }  
  
    public void startElement(String uri, String localName, String name,  
            Attributes attributes) throws SAXException {  
        // c => 单元格  
        if (name.equals("c")) {  
            // 如果下一个元素是 SST 的索引,则将nextIsString标记为true  
            String cellType = attributes.getValue("t");  
            if (cellType != null && cellType.equals("s")) {  
                nextIsString = true;  
            } else {  
                nextIsString = false;  
            }  
        }  
        // 置空  
        lastContents = "";  
    }  
  
    public void endElement(String uri, String localName, String name)  
            throws SAXException {  
        // 根据SST的索引值的到单元格的真正要存储的字符串  
        // 这时characters()方法可能会被调用多次  
        if (nextIsString) {  
            try {  
                int idx = Integer.parseInt(lastContents);  
                lastContents = new XSSFRichTextString(sst.getEntryAt(idx))  
                        .toString();  
            } catch (Exception e) {  
  
            }  
        }  
  
        //t 是数据标签  
        // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符  
        if (name.equals("v")) {  
            String value = lastContents.trim();  
            value = value.equals("")?" ":value;  
            rowlist.add(curCol, value);  
            curCol++;  
        }else if(name.equals("t")){
            String value = lastContents.trim();  
            value = value.equals("")?" ":value;  
            rowlist.add(curCol, value);  
            curCol++; 
        }else {  
            //如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法  
            if (name.equals("row")) {  
                try {  
                    optRows(sheetIndex,curRow,rowlist);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
                rowlist.clear();  
                curRow++;  
                curCol = 0;  
            }  
        }  
    }  
  
    public void characters(char[] ch, int start, int length)  
            throws SAXException {  
        //得到单元格内容的值  
        lastContents += new String(ch, start, length);  
    }  

}


测试类如下:

package com.saxfs;

import java.util.List;

public class XxlsPrint extends XxlsAbstract {

	@Override
	public void optRows(int sheetIndex, int curRow, List<String> rowlist)
			throws Exception {
		for (int i = 0; i < rowlist.size(); i++) {  
            System.out.print("'" + rowlist.get(i) + "',");  
        }  
        System.out.println();  
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		XxlsPrint howto = new XxlsPrint();  
        try {
			howto.processOneSheet("f:/dcs/cess.xlsx",3);
			//完整的代码
			//howto.process("f:/dcs/cess.xlsx");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
	}

}


 

使用Poi读取大数据量excel的方法 使用Poi读取大数据量excel的方法 支持2003和2007的版本 立即下载

相关推荐

poi读取Excel2007文件

NULL 博文链接:https://jumpman.iteye.com/blog/1094537

java eventusermodel_Java XSSFReader.getSharedStringsTable方法代碼示例

本文整理匯總了Java中org.apache.poi.xssf.eventusermodel.XSSFReader.getSharedStringsTable方法的典型用法代碼示例。如果您正苦於以下問題:Java XSSFReader.getSharedStringsTable方法的具體用法?Java XSSFReader.getSharedStringsTable怎麽用?Java XSSFRea...

weixin_33199315的博客 1589

从0到1,快速理清 | DeepSeek Harness

DeepSeek推出自研Harness开发平台,主打"一切皆插件"理念,将AI执行能力模块化为可自由组合的插件体系。带你从0到1,快速了解开发链路。

IT学习博客 685

Java学习笔记-EXCEL文件的读写操作

一、基于POI操作EXCEL文件 <!-- POI依赖包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.po

PURSUE ONE PIECE 1204

Linux虚拟机mysql安装教程(详细步骤)出现了一个错误:依赖检测失败

Linux虚拟机安装mysql的详细步骤(有报错预警哦)

m0_74953387的博客 5258

【初阶】手把手教你轻松上手Denodo | 连接数据库并创建基本视图 (二)

在本教程的第二部分,我们将涵盖:连接到数据库,与创建基本视图。

Denodo的博客 1107

Poi读取大数据量Excel文件

前言 最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了。 分析 1.dump内存文件 liunx使用如下命令: ? 1 ./jmap -dump:format=b,file=heap.hprof pid 2.使用Eclipse Memory Analysis进行分析 异常如下: ? ...

haylee的专栏 2926

图解凸函数与凹函数:别再被数学定义搞晕了!

本文通过图解和生活化类比,深入浅出地解释了凸函数与凹函数的数学定义及其与日常直觉的差异。文章详细介绍了凸函数的图像特征、数学定义(包括二阶导数判断)、在机器学习中的重要性,以及常见误区和实际应用中的判断技巧,帮助读者彻底理解这一关键数学概念。

weixin_29159441的博客 657

java poi 操作excel

HSSF是POI对Excel-97(-2007)文件操作的纯Java实现。XSSF是POI对Excel 2007 OOXML(.xlsx)文件操作的纯Java实现。从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API(SXSSF)。 POI提供两种读写API模型:事件模型和用户模型。事件模型是基于流的方式实现,使用sax(simple api for XML)模型进行内容解析,对...

金溪的博客 1024

Ubuntu操作系统等保测评指南

Ubuntu操作系统等保测评指南

qq_40181198的博客 7032

xHCI驱动学习(1) 核心数据结构

虽然Linux内核拥有C语言构建的身体,但它骨子里散发的是面向对象的气质,这一个个的对象就是struct。面对一个内核模块的时候,首先要找出关键的struct和它们之间的关系,才能摸清代码的骨骼脉络。今天来理清USB xHCI相关的数据结构类型usb_hcd、xhci_hcd、hc_driver和全局变量xhci_pci_driver、xhci_hc_driver、xhci_pci_hc_driver之间的关系。

1万+

java eventusermodel_异常读取XLSB文件Apache POI java.io.CharConversionException

我正在开发一个使用Apache POI读取excel xlsb文件的Java应用程序,但是在读取它时遇到异常,我的代码如下:import java.io.IOException;import java.io.InputStream;import org.apache.poi.xssf.eventusermodel.XSSFReader;import org.apache.poi.xssf.mode...

weixin_36488250的博客 525

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 375

Android修行手册 - 实现POI上万行的大数据量Excel读写操作,解决内存溢出

搞过POI的都知道,在处理Excel文件时,POI提供了两种模式:用户模式和SAX事件驱动模式。用户模式API丰富使用起来相对简单,但当遇到大文件、大量数据或复杂格式时,可能会导致内存溢出。因此,官方推荐使用SAX事件驱动模式来解析大型Excel文件。 开始想解决方法之前,我们要先知道 Excel2003与Excel2007 的区别。

空名先生 2304

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

上一篇文章详细讲解如何利用数据增强方法实现图像数据集的扩充,并以濒危水书作为案例讲解。这篇文章将详细讲解基于机器学习的水书图像识别方法,以图像像素统计为特征开展图像分类讲解,这是最基础的方法,也为后续深度学习图像分类描述提供支撑。基础性文章,希望对您有所帮助!让我们开始吧,且看且珍惜。

杨秀璋的专栏 989

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

POI以SAX方式解析Excel2007大文件(包含空单元格的处理)

POI以SAX方式解析Excel2007大文件(包含空单元格的处理)if(name.equals("c")) { //前一个单元格的位置 if(preRef == null){ preRef = attributes.getValue("r"); }else{ preRef = ref; } //当前单元格的位置 ref = attributes.getValue("r"); 从c中是判断不出来是...

伏虎游侠的博客 2054

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java 操作 Excel (读取Excel2007,Poi实现)

关于Java读取Excel2007的文章在Google、百度上搜索一下,没有太好的例子,实现的也不算太好。查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2007(XLSX and PPTX),自己来实现Java读取Excel2007了。   1,下载 POI 3.5 beta 4 解压,把其中的jar包导入项目文件。以我的读取为例,导入了以下jar包。...

kxjhlele的专栏 914

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

easyexcel和poi对比_POI 和 EasyExcel

POI 和 easyExcel 讲解转自狂神老师,仅作为个人笔记使用一、POI常用进程1、将用户信息导出为excel表格(导出数据....)2、将Excel表中的信息录入到网站数据库(习题上传....)开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中!操作Excel目前比较流行的就是 Apache POI 和 阿里巴巴的 easyExcel !Apache POIea...

weixin_39517868的博客 9494

POI处理Excel大文件的问题和解决方法

    最近在测试上传Excel2007大文件的功能,采用的是Apache POI工具。     Excel2007: 24M , POI :3.10     发现POI在处理24MExce2007l文件的时候,几乎占用了2G的Heap Space.     由于Excel2007的文件是经过压缩的,其实数据都是存放在shareStringl.xml文件中。  所以24M的文件,经过解压...

u014690081的专栏 675

Excel POI

Excel POI maven依赖如下 <!--xls(03)--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>

qq_35032539的博客 828

大数据量的excel文件读取——excel2007(含代码及示例)

excel2007文件格式与之前版本不同,之前版本采用的是微软自己的存储格式。07版内容的存储采用XML格式,所以,理所当然的,对大数据量的 xlsx文件的读取采用的也是XML的处理方式SAX。     同之前的版本一样,大数据量文件的读取采用的是事件模型eventusermodel。usermodel模式需要将文件一次性全部读到内存中,07版的既然采用的存储模式是xml,解析用的DOM方式也是...

資料為我做事 456

POI - 简单读写Excel

官网地址:https://poi.apache.org/ 基本功能: HSSF — 提供读写Microsoft Excel格式文档的功能。(2003版,最多只能存65536行数据) XSSF — 提供读写Microsoft Excel OOXML格式文档的功能。(2007版,可存放的数据无限制) 1. POI - Excel写 1.1 相关依赖: <!-- xls(2003) --> <dependency> <groupId>org.apache.poi&l

luobi1995的博客 690

excel大量数据读取工具类2

读取大数据量excel文件;用于excel2007版本的读取;用于excel2003版本的读取

似水流年风萧兮 797

从零开始SpringCloud Alibaba实战(88)——poi excel 百万数据大数据量导入

前言 POI读取Excel的方式 用户模式:也就是poi下的usermodel有关包,它对用户友好,有统一的接口在ss包下,但是它是把整个文件读取到内存中的, 对于大量数据很容易内存溢出,所以只能用来处理相对较小量的数据; 事件模式:在poi下的eventusermodel包下,相对来说实现比较复杂,但是它处理速度快,占用内存少,可以用来处理海量的Excel数据。 所以使用POI的用户模式去读取Excel大文件,会导致内存泄漏。读取大文件用事件模式。 代码 pom <!-- POI,excel导入

liuerchong的博客 1526

Apache-POI读取Excel2003和Excel2007中数据。

首先在F盘下的poiExcelTest文件夹下建立2个文件:student2003.xls和student2007.xlsx,如图 内容为: 2个文件中的内容一样由于Excel2003和Excel2007数据读取方式不一样, Excel2003需要用HSSF…开头的类,Excel2007需要XSSF…开头的类,所以,通过判断文件后缀名之后用不同的方法来读取, 本测试中用到

爱的叹息的专栏 2550
上一篇: JavaScript如何将json字符串转化为数组
下一篇: myeclipse安装反编译插件
滴答
博客等级 码龄16年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值