栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java解析Excel遇见的问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java解析Excel遇见的问题

项目中使用java解析excel经常会遇见oom的问题,这里选择两个开源框架,进行简单的比较和测试。
EasyExcel
阿里开源(EasyExcel)
引入maven依赖

     com.alibaba
     easyexcel
     1.1.2-beta5
 
 
使用EasyExcel对我们解析excel提供了便利,但是测试的时候当excel达到100M左右
依然会发送OOM,下面看一下入门的使用方法
简单使用
public class ExcelListener extends AnalysisEventListener {

    private List datas = new ArrayList();
    public void invoke(Object object, AnalysisContext context) {
 System.out.println("当前行:"+context.getCurrentRowNum());
 System.out.println(object);
 datas.add(object);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
 doSomething(object);//根据自己业务做处理
    }
    private void doSomething(Object object) {
 //1、入库调用接口
    }
    public void doAfterAllAnalysed(AnalysisContext context) {
 // datas.clear();//解析结束销毁不用的资源
    }
    public List getDatas() {
 return datas;
    }
    public void setDatas(List datas) {
 this.datas = datas;
    }

}

读取:
public static void saxReadSheetsV2007() throws IOException {
 InputStream inputStream = new FileInputStream(new File("F:/Excel/demo02.xlsx"));
 BufferedInputStream inputStreams = new BufferedInputStream(inputStream);

ExcelListener excelListener = new ExcelListener();

 ExcelReader excelReader = EasyExcelFactory.getReader(inputStreams,excelListener);

 List sheets = excelReader.getSheets();
 System.out.println();
 for (Sheet sheet:sheets) {
     if(sheet.getSheetNo() ==1) {
  excelReader.read(sheet);
     }else if(sheet.getSheetNo() ==2){
  excelReader.read(sheet);
     }else if(sheet.getSheetNo() ==3){
  excelReader.read(sheet);
     }
    System.out.println(sheet.getSheetNo());
 }
 inputStream.close();
    }


xlsx-streamer
**github地址:https://github.com/monitorjbl/excel-streaming-reader**
使用xlsx-streamer可以解决OMM的问题,它是一种流式的读取方式。
引入maven依赖:
		
		     org.apache.commons
		     commons-compress
		     1.18
		 

 
     com.monitorjbl
     xlsx-streamer
     2.1.0
 
简单使用
  public static void main(String[] args) {

 try (
  InputStream is = new FileInputStream(new File("F:/Excel/sss.xlsx"));
  Workbook workbook = StreamingReader.builder()
   .rowCacheSize(100)
   .bufferSize(4096)
   .open(is)) {
     for (Sheet sheet : workbook){
  System.out.println(sheet.getSheetName());
  for (Row r : sheet) {
      for (Cell c : r) {
   System.out.println(c.getStringCellValue());
      }
  }
     }
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
     e.printStackTrace();
 }
    }
问题
当使用xlsx-streamer读取excel的时候,如果文件达到500M左右,会抛出大概如下异常:
 "Zip bomb detected! The file would exceed the max size of the expanded data in the zip-file.This may indicates that the file is used to inflate memory usage and thus could pose a security risk.You can adjust this limit via ZipSecureFile.setMaxEntrySize() if you need to work with files which are very large.


原因是poi进行了限制  [0-4GB]:
     
    public static void setMaxEntrySize(long maxEntrySize) {
 if (maxEntrySize < 0 || maxEntrySize > 0xFFFFFFFFL) {   // don't use MAX_ENTRY_SIZE here!
     throw new IllegalArgumentException("Max entry size is bounded [0-4GB], but had " + maxEntrySize);
 }
 MAX_ENTRY_SIZE = maxEntrySize;
    }

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号