zoukankan      html  css  js  c++  java
  • Java 读取大容量excel

    项目要求导入excel, 但是文件很大,一次性读进去会导致内存不足而报错,

    下面是我解决的方法:

    首先倒入需要的jar

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.17</version>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
    </dependency>
    <dependency>
    <groupId>com.monitorjbl</groupId>
    <artifactId>xlsx-streamer</artifactId>
    <version>1.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/openxml4j -->
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>openxml4j</artifactId>
    <version>1.0-beta</version>
    </dependency>

    //报这个错需要引下面这个jar包

    Exception in thread "main" java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

    <dependency>
    <groupId>xml-apis</groupId>
    <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
    </dependency>

    借助第三方工具:StreamingReader
    package com.quanzhen.test;

    import com.monitorjbl.xlsx.StreamingReader;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;


    import java.io.FileInputStream;

    /**
    * Created by Administrator on 2019/5/21 0021.
    */
    public class Utf8Util {

    public static void testLoad() throws Exception{
    FileInputStream in = new FileInputStream("C:/Users/Administrator/Desktop/Dm_Mobile.xlsx");
    Workbook wk = StreamingReader.builder()
    .rowCacheSize(100) //缓存到内存中的行数,默认是10
    .bufferSize(4096) //读取资源时,缓存到内存的字节大小,默认是1024
    .open(in); //打开资源,必须,可以是InputStream或者是File,注意:只能打开XLSX格式的文件
    Sheet sheet = wk.getSheetAt(0);
    //遍历所有的行
    for (Row row : sheet) {
    System.out.println("开始遍历第" + row.getRowNum() + "行数据:");
    //遍历所有的列
    for (Cell cell : row) {
    System.out.print(cell.getStringCellValue() + " ");
    }
    System.out.println(" ");
    }
    }

    public static void main(String[] args) throws Exception {
    testLoad();
    }
    }

    刚开始报版本不支持52.0,网上说是因为我用的jdk是1.7的,要更新成1.8的,换成1.8的之后,还是一大堆错误,主要是因为
    jar包没有全部导入,还有一个原因就是版本不一致,要是4.0都是4.0要是3.8都是3.8,
    全部导入之后,把jdk切换成1.7和1.8,发现两个都是可以的,并不是jdk版本问题
  • 相关阅读:
    像调试java一样来调试Redis lua
    微言限流
    性能测试遭遇TPS抖动问题
    你所不知道的堆外缓存
    基于JMH的Benchmark解决方案
    基于FastJson的通用泛型解决方案
    你所不知道的日志异步落库
    mac上配置java开发环境
    你所不知道的库存超限做法
    服务器一般达到多少qps比较好[转]
  • 原文地址:https://www.cnblogs.com/foreverstudy/p/11321207.html
Copyright © 2011-2022 走看看