Как разделить файл Excel с помощью Java? - PullRequest
1 голос
/ 01 июля 2011

У меня есть лист Excel с 200000 строками. Я хочу разбить файл Excel на каждые 50000 записей.Я использую API-интерфейс Apache POI. Для чтения и записи файла 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

Спасибо

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Если вы не можете прочитать этот документ с помощью POI, но таблица проста, я бы посоветовал вам открыть его в Excel, сохранить как файл CSV, а затем разделить этот файл на фрагменты. Это может быть сделано даже с использованием сценария оболочки / командного файла.

Эта рекомендация действительна, если у вас есть один огромный файл и вам нужно разбить его. Однако, если вы внедряете сервис, который должен получать такие файлы Excel и отделять его, ищите другое решение.

2 голосов
/ 01 июля 2011

Размер кучи Java по умолчанию очень мал, особенно при работе с большими XML-файлами.

Вам просто нужно увеличить объем памяти, и все будет в порядке.Установите приличный размер для вашей настройки -Xmx при запуске Java

1 голос
/ 18 июля 2011
  1. Прежде всего используйте рекомендации Гаграварра и максимально увеличьте объем используемой памяти. Если ваша платформа позволяет, переключитесь на 64-битную JVM. Один только этот метод грубой силы может решить вашу проблему

  2. Если возможно, избегайте использования файлов .xlsx - POI потребляет намного больше памяти для .xlsx, чем для .xls

  3. POI здесь рекомендует использовать eventmodel для чтения (здесь используется большая часть памяти), и вы также можете попробовать их новый SXSSF API с небольшим объемом памяти для записи (все еще в бета-версии) .

...