2015-01-21 70 views
0

10讀取java中的xls文件。
但是,當我要讀取大於20MB的大.xls文件時,它會給我提供錯誤。
以下我的代碼運行正常的小.xls文件,但給大的.xls文件的Java堆錯誤。 的Java代碼 -如何讀取java中的大.xls文件?

public static void main(String[] args) throws IOException { 
     ArrayList<ArrayList<String>> Temp = new ArrayList<ArrayList<String>>(); 
     ArrayList<String> Temp1 = new ArrayList<String>(); 
     int row = 0; 
     String fname = "D:/Vijay/xls/vijay/bookTest.xls"; 
     try { 
      InputStream fis = new FileInputStream(fname); 
      HSSFWorkbook workbook = new HSSFWorkbook(fis); 
      HSSFSheet sheet = workbook.getSheetAt(0); 
      FormulaEvaluator formulaEval = workbook.getCreationHelper().createFormulaEvaluator(); 
      int rowEnd = sheet.getLastRowNum(); 
      int rowStart = sheet.getFirstRowNum(); 
      for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) { 
       Row r = sheet.getRow(rowNum); 
       int lastColumn = r.getLastCellNum(); 

       int cols = 0; 
       Temp1 = new ArrayList<String>(); 
       for (int cn = 0; cn < lastColumn; cn++) { 
        String cellvalue = ""; 
        Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL); 
        if (c == null) { 
         cellvalue = ""; 
        } else { 
         if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_STRING) { 
          cellvalue = r.getCell(cn).getStringCellValue(); 
         } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { 
          if (HSSFDateUtil.isCellDateFormatted(r.getCell(cn))) { 
           DateFormat formatter = new SimpleDateFormat(
             "E MMM dd HH:mm:ss Z yyyy"); 
           Date date = (Date) formatter.parse(r 
             .getCell(cn).getDateCellValue() 
             .toString()); 
           Calendar cal = Calendar.getInstance(); 
           cal.setTime(date); 
           cellvalue = cal.get(Calendar.DATE) + "/" 
             + (cal.get(Calendar.MONTH) + 1) + "/" 
             + cal.get(Calendar.YEAR); 
          } else { 
           r.getCell(cn).setCellType(
             r.getCell(cn).CELL_TYPE_STRING); 
           cellvalue = "" 
             + r.getCell(cn).getStringCellValue(); 
          } 
         } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) { 
          cellvalue = "" 
            + r.getCell(cn).getBooleanCellValue(); 
         } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_FORMULA) { 
          cellvalue = "" 
            + formulaEval.evaluate(r.getCell(cn)) 
              .formatAsString(); 
         } 

        } 
        Temp1.add(cols, cellvalue); 
        cols++; 
       } 
       if (Temp1.size() > 0) { 
        Temp.add(row, Temp1); 
        row++; 
       } 
      } 
      for (ArrayList al : Temp) { 
      System.out.println("Contents of temp " + al); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 

錯誤 -

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.LinkedHashMap.createEntry(Unknown Source) 
    at java.util.LinkedHashMap.addEntry(Unknown Source) 
    at java.util.HashMap.put(Unknown Source) 
    at sun.util.resources.OpenListResourceBundle.loadLookup(Unknown Source) 
    at sun.util.resources.OpenListResourceBundle.loadLookupTablesIfNecessary(Unknown Source) 
    at sun.util.resources.OpenListResourceBundle.handleGetObject(Unknown Source) 
    at sun.util.resources.TimeZoneNamesBundle.handleGetObject(Unknown Source) 
    at java.util.ResourceBundle.getObject(Unknown Source) 
    at java.util.ResourceBundle.getObject(Unknown Source) 
    at java.util.ResourceBundle.getStringArray(Unknown Source) 
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(Unknown Source) 
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(Unknown Source) 
    at java.util.TimeZone.getDisplayNames(Unknown Source) 
    at java.util.TimeZone.getDisplayName(Unknown Source) 
    at java.util.Date.toString(Unknown Source) 
    at com.test.arrayList.ValidateXls.main(ValidateXls.java:69) 

請幫我解決這個問題,或者請建議我另一種方式來閱讀的java大.xls文件。
在此先感謝。

+0

您是否嘗試過增加內存使用你的虛擬機?你有多少內存? – Eypros 2015-01-21 07:07:12

回答

4

我認爲你需要嘗試的第一件事是增加java默認堆空間。 例如:-Xms256m -Xmx512m -XX:PermSize = 64M -XX:MaxPermSize參數= 1000M

也 您需要更改文件的加載是這樣的(WorkbookFactory.create(新文件(「MyExcel.xls 「)))根據POI文檔看到此鏈接

http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream

文件VS InputStreams

當打開一個工作簿時,無論是的.xls HSSFWorkbook或.XLSX XSSFWorkbook,工作簿可以從裝載File或InputStream。使用File對象可以降低內存消耗,而InputStream需要更多內存,因爲它必須緩衝整個文件。

如果使用WorkbookFactory,它很容易使用一個或另一個:

//使用文件 工作簿WB = WorkbookFactory.create(新文件( 「MyExcel.xls」));

//使用InputStream,需要更多內存 工作簿wb = WorkbookFactory.create(new FileInputStream(「MyExcel.xlsx」));

,如果你仍然面臨着同樣的異常嘗試使用

XSSF和SAX(事件API)

http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api