powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение больших Excel файлов (POI + SAXParser)
2 сообщений из 2, страница 1 из 1
Чтение больших Excel файлов (POI + SAXParser)
    #39408340
Dr66
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Столкнулся с проблемой загрузки крупных файлов ексель (400 000 строк по 20 колонок).
POI чудовищно съедает больше гига оперативы и выводит ошибку OutOfMemory.

Нашел решение на http://stackoverflow.com/questions/13020658/error-while-reading-large-excel-files-xlsx-via-apache-poi

Написал код из stackoverflow.com:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
 
 
 
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
 
/**
 * 
 */
public class My {
 
    OPCPackage pk;
    ArrayList<String> list = new ArrayList<>();
 
    public void openXlsx()
    {
 
        try {
            pk=OPCPackage.open("D:/1.xlsx");
            ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pk);
            XSSFReader xssfReader = new XSSFReader(pk);
            StylesTable styles = xssfReader.getStylesTable();
            XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
            while(iter.hasNext())
            {
                InputStream stream = iter.next();
 
                processSheet(styles,strings,stream);
                stream.close();
            }
 
            System.out.println(list);
 
 
        } catch (InvalidFormatException e) {
            e.printStackTrace();
            System.out.println("Ошибка при открытии файла");
        } catch (SAXException e) {
            e.printStackTrace();
            System.out.println("Ошибка SAX");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ошибка IO при создании ReadOnlySharedStringsTable");
        } catch (OpenXML4JException e) {
            e.printStackTrace();
            System.out.println("Ошибка при создании XSSFReader");
        }
 
 
    }
 
    public void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputstream)
    {
        org.xml.sax.InputSource sheetSource = new org.xml.sax.InputSource(sheetInputstream);
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
 
        try {
 
            javax.xml.parsers.SAXParser saxParser = saxFactory.newSAXParser();
            XMLReader sheetParser = saxParser.getXMLReader();
 
            org.xml.sax.ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new SheetContentsHandler() {
                @Override
                public void startRow(int i) {
 
                }
 
                @Override
                public void endRow(int i) {
 
 
                }
 
                @Override
                public void cell(String s, String s1, XSSFComment xssfComment) {
 
                    if (s.equals("A1")) list.add(s1);
 
                }
 
                @Override
                public void headerFooter(String s, boolean b, String s1) {
 
 
                }
            } , false);
 
            sheetParser.setContentHandler(handler);
            sheetParser.parse(sheetSource);
 
 
 
 
 
 
 
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
 
}




Но по каким то причинам, данный код выдает пустой list... то есть не заходит в метод cell.
Исключений и ошибок при компиляции в IDE IDEA не выдает.

Не могу понять... что здесь не так...
...
Рейтинг: 0 / 0
Чтение больших Excel файлов (POI + SAXParser)
    #39408506
Dr66
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел решение проблемы... переписал код.

Надеюсь этот код поможет найти решение для тех, кто хочет читать (и загружать) большие xlsx файлы Excel.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;


public class My {
    OPCPackage pk = OPCPackage.open("d:/1.xlsx");
    ArrayList<String> list = new ArrayList<>();


    public My() throws InvalidFormatException {


        XSSFReader xssfReader = null;
        try {
            xssfReader = new XSSFReader(pk);

        StylesTable styles = xssfReader.getStylesTable();
            ReadOnlySharedStringsTable strings = null;
            try {
                strings = new ReadOnlySharedStringsTable(pk);

            XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
                XMLReader parser = XMLReaderFactory.createXMLReader();
                
            while (iter.hasNext()) {

                    InputStream stream=iter.next();

                    ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new XSSFSheetXMLHandler.SheetContentsHandler() {
                        @Override
                        public void startRow(int i) {

                        }

                        @Override
                        public void endRow(int i) {

                        }

                        @Override
                        public void cell(String s, String s1, XSSFComment xssfComment) {

                            list.add(s1);


                        }

                        @Override
                        public void headerFooter(String s, boolean b, String s1) {

                        }
                    }, true);


                    parser.setContentHandler(handler);
                    parser.parse(new InputSource(stream));


                   

        }
            } catch (SAXException e) {
                e.printStackTrace();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (OpenXML4JException e) {
            e.printStackTrace();
        }


    }
}
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение больших Excel файлов (POI + SAXParser)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]