2011-07-01 32 views
1

私は500000レコードごとにExcelファイルを分割したい200000 rows.iのExcelシートを持っています。 Apache POI APIを使用しています。Excelファイルを読み書きするために使用しています。定義されたレコードサイズに達した場合にファイルを分割することができます。Javaを使用してExcelファイルを分割する方法は?

コード:

public String[][] getSheetData(int SheetIndex) 
{ 
    int noOfColumns = 0;XSSFRow row = null; 
    XSSFCell cell = null; 
    int i=0;int noOfRows=0; 
    int j=0; 
    String[][] data=null; XSSFSheet sheet=null; 

    try { 
        loadFile(); //load give Excel 
        if(validateIndex(SheetIndex)) 
        { 
          sheet = workbook.getSheetAt(SheetIndex); 
          noOfColumns = getNumberOfColumns(SheetIndex); 
          noOfRows =getNumberOfRows(SheetIndex)+1; 
          data = new String[noOfRows][noOfColumns]; 
          Iterator rowIter = sheet.rowIterator(); 
          while(rowIter.hasNext()) 
          { 
           row = (XSSFRow) rowIter.next(); 
           Iterator cellIter = row.cellIterator(); 
           j=0; 
           while(cellIter.hasNext()) 
           { 
            cell = (XSSFCell) cellIter.next(); 
            if(cell.getCellType() == cell.CELL_TYPE_STRING) 
            { 
             data[i][j] = cell.getStringCellValue(); 
            } 
            else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC) 
            { 
             data[i][j] = Double.toString(cell.getNumericCellValue()); 
            } 

            j++; 
           } 

           i++; 
          } // outer while 


        } 
        else throw new InvalidSheetIndexException("Invalid sheet index."); 


       } catch (Exception ex) { 
        logger.error(ex);} 

     return data; 
} 

は、例外が発生します

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.<init>(Locale.java:1885) 
    at org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904) 
    at org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205) 
    at org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796) 
    at org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332) 
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1269) 
    at org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53) 
    at org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502) 
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source) 
    at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235) 
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189) 
    at com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49) 
    at com.arosys.excelReading.ReadXLSX.getNumberOfSheet(ReadXLSX.java:121) 
    at com.arosys.excelReading.ReadXLSX.main(ReadXLSX.java:324) 
    Java Result: 1 

おかげ

+0

シート全体を読むことができますか?はいの場合は、現在のコードを表示します。 –

+0

はい、私はレコード全体を取得しようとしたときにシート全体のレコードを読み込みました。例外的なヒープメモリが範囲外にあります。 –

+0

_常に_例外を表示してください! –

答えて

3

あなたはPOIでこのdocuemntを読み取ることができませんが、テーブルが単純な場合、私はあなたがそれを開くことをお勧めしたいですExcelをCSVファイルとして保存し、このファイルをフラグメントに分割します。これは、シェルスクリプト/バッチファイルを使用して行うこともできます。

この推奨は、1つの大きなファイルがあり、分割する必要がある場合に有効です。しかし、そのようなExcelファイルを受け取るべきサービスを実装している場合は、それを分離して他の解決策を探します。

+0

ありがとうございます。このようなExcelファイルを受信し、別の解決策を探すサービスを持っています。ファイルを分割しようとすると、ファイルの分割が発生するため、ファイルのレコード数が少ない場合、この問題が発生しない可能性があります。私は正しいと思いますか、私はもう一度混乱します。 –

2

デフォルトのJavaヒープサイズは、特に大きなxmlファイルを扱う場合には非常に小さいです。

メモリ容量を増やすだけで大丈夫です。 Javaの

Gagravarrの全ての使用推奨の
1
  1. 最初に実行するときに、あなたの-Xmx設定のためのまともなサイズを設定し、あなたのメモリフットプリントを最大化します。ご使用のプラットフォームで許可されている場合は、64ビットJVMに切り替えます。 POIはここにどこで(

  2. POI hereを読み取るためeventmodelを使用することをお勧めします.XLS上よりの.xlsxに多くのメモリを消費 - この強引なアプローチだけではファイルを.xlsxの使用を避け、あなたの問題

  3. できれば解決することがあります大部分のメモリが消費されます)、小さなSXSSF APIを書き込み用に試すこともできます(まだベータ版です)。

関連する問題