當前位置 主頁 > 服務器問題 > Linux/apache問題 > 最大化 縮小

    java poi sax方式處理大數據量excel文件

    欄目:Linux/apache問題 時間:2020-01-19 11:30

    系統需要用到一個導入excel文件的功能,使用poi組件常規方式讀取excel時,內存耗盡,OutOfMemoryError,或者讀取非常慢
    所以寫了一個工具類,使用poi sax方式讀取excel,速度快很多,內存消耗可以接受。

    測試結果如下:
    .xlsx文件,35M大小,總4個sheel,
    只讀取第一個,37434行,54列

    總行數:37434
    讀取耗時:39秒
    打印耗時:17秒

    主要代碼如下:

    ExcelUtils.class 主入口

    package com.xxx.bi.utils.excel;
    
    import java.util.List;
    import java.util.Objects;
    
    import org.apache.commons.lang3.StringUtils;
    
    import com.google.common.collect.Lists;
    
    public class ExcelUtils {
      /** logger日志. */
      // public static final Logger LOGGER = Logger.getLogger(ExcelUtils.class);
    
      public ExcelUtils() {
      }
    
      /**
       * 獲取excel的表頭
       * 
       * @param filePath
       *      文件路徑
       * @param headerNum
       *      表頭所在行數
       * @return
       */
      public static List<String> getHeader(String filePath, int headerNum) {
        if (StringUtils.isBlank(filePath)) {
          throw new IllegalArgumentException("傳入文件路徑不能為空");
        }
        if (Objects.isNull(headerNum) || headerNum < 1) {
          headerNum = 1;
        }
        try {
          return LargeExcelFileReadUtil.getRowFromSheetOne(filePath, headerNum);
        } catch (Exception e) {
          // LOGGER.info("獲取excel[" + filePath + "]表頭失敗,原因:", e);
          e.printStackTrace();
        }
        return Lists.newArrayList();
      }
    
      /**
       * 獲取excel的所有數據<br/>
       * 所有數據類型都是String<br/>
       * 會以第一行數據的列數為總列數,所以第一行的數據必須都不為空,否則可能出java.lang.IndexOutOfBoundsException
       * 
       * @param filePath
       *      文件路徑
       * @param headerNum
       *      表頭所在行數
       * @return
       */
      public static List<List<String>> getAllData(String filePath) {
        if (StringUtils.isBlank(filePath)) {
          throw new IllegalArgumentException("傳入文件路徑不能為空");
        }
        try {
          return LargeExcelFileReadUtil.getRowsFromSheetOne(filePath);
        } catch (Exception e) {
          // LOGGER.info("獲取excel[" + filePath + "]表頭失敗,原因:", e);
          e.printStackTrace();
        }
        return Lists.newArrayList();
      }
    
      public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String filepath = "C:/Users/Administrator/Desktop/05-作業調配表 -快遞.xlsx";
        // List<String> result = ExcelUtils.getHeader(filepath, 1);
        // for (String col : result) {
        // System.out.println(col);
        // }
    
        List<List<String>> result = ExcelUtils.getAllData(filepath);
        long end = System.currentTimeMillis();
        for (List<String> list : result) {
          System.out.println(list.toString());
        }
        long end1 = System.currentTimeMillis();
        try {
          Thread.sleep(1000l);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.err.println("總行數:" + result.size());
        System.err.println(("讀取耗時:" + (end - start) / 1000) + "秒");
        System.err.println(("打印耗時:" + (end1 - end) / 1000) + "秒");
      }
    }
    
    
    下一篇:沒有了
777亚洲人成视频免费视频