С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10

Загрузка больших xlsxl файлов (POI + SAXParser)

20.02.2017, 13:39. Показов 1604. Ответов 14

Студворк — интернет-сервис помощи студентам
Добрый день.

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

Нашел решение на http://stackoverflow.com/quest... apache-poi

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
public void parseExcel(File file) throws IOException {
 
        OPCPackage container;
        try {
            container = OPCPackage.open(file.getAbsolutePath());
            ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container);
            XSSFReader xssfReader = new XSSFReader(container);
            StylesTable styles = xssfReader.getStylesTable();
            XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
            while (iter.hasNext()) {
                InputStream stream = iter.next();
 
                processSheet(styles, strings, stream);
                stream.close();
            }
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (OpenXML4JException e) {
            e.printStackTrace();
        }
 
}
 
protected void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream) throws IOException, SAXException {
 
        InputSource sheetSource = new InputSource(sheetInputStream);
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        try {
            SAXParser saxParser = saxFactory.newSAXParser();
            XMLReader sheetParser = saxParser.getXMLReader();
            ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new SheetContentsHandler() {
 
            @Override
                public void startRow(int rowNum) {
                }
                @Override
                public void endRow() {
                }
                @Override
                public void cell(String cellReference, String formattedValue) {
                }
                @Override
                public void headerFooter(String text, boolean isHeader, String tagName) {
 
                }
 
            }, 
            false //means result instead of formula
            );
            sheetParser.setContentHandler(handler);
            sheetParser.parse(sheetSource);
        } catch (ParserConfigurationException e) {
            throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());

Однако, мой уровень знаний Junior, и понять весь чужой код не могу.

Просьба к мастерам Java прокомментировать вышеизложенный код по строкам (что от куда и для чего)...
Даже не могу понять откуда взять значения конкретных ячеек...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2017, 13:39
Ответы с готовыми решениями:

Загрузка больших файлов
Подскажите пожалуйста где можно купить модуль который позволяет загружать большие видео файлы (1,5 - 2 гб) с вэб сайта на мой сервер и...

Загрузка больших файлов
Проблема. на строке:https://www.cyberforum.ru/images/editor/justifyleft.gif $src = imagecreatefromjpeg($fromPhoto); //Создает изображение...

Загрузка Больших Файлов
Всем привет! Столкнулся с проблемой загрузки файлов >10Mb, а нужно до 1Gb Куда копать - вообще не понятно :mellow: В серверном...

14
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 14:10
https://poi.apache.org/apidocs... ndler.html
Цитата Сообщение от Dr66 Посмотреть сообщение
@Override
* * * * * * * * public void cell(String cellReference, String formattedValue) {
* * * * * * * * }
смотри что в параметрах приходит
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 14:27  [ТС]
xoraxax

Примитивно вставлял System.out.println("1") в методы
@Override
public void startRow(int rowNum) {
}
@Override
public void endRow() {
}
@Override
public void cell(String cellReference, String formattedValue) {
}
@Override
public void headerFooter(String text, boolean isHeader, String tagName)


Ничего не выводит... не понимаю почему не заходит даже туда... поэтому и пишу сюда )
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 14:54
а ты читаешь вообще, что тебе пишут, когда ты пытаешься этот код запустить?
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 15:07  [ТС]
Не понял... кто пишет?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 15:19
как ты запускаешь этот код?
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 15:40  [ТС]
container = OPCPackage.open(file.getAbsolutePath());

Указываю абсолютный путь к файлу и запускаю... он отрабатывается и все...

А где он хранит разпарсенные данные и как их забрать не знаю
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 15:43
Цитата Сообщение от Dr66 Посмотреть сообщение
и запускаю
КАК?

Добавлено через 37 секунд
из консоли, из иде, еще каким-то причудливым способом?
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 16:14  [ТС]
Через idea

Добавлено через 1 минуту
Shift f9
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 16:24
так вот в идее появляется окошко run или debug, а в этом окошке обычно что-то написано (например исключения).
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 16:27  [ТС]
Код компилируется без ошибок если вопрос в этом... даже вижу распарсенные данные по символьно... но как забрать их
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 16:31
Цитата Сообщение от Dr66 Посмотреть сообщение
даже вижу распарсенные данные по символьно
так а чего тебе еще надо?
в метод cell() пиши
if (cellReference.equals("A1")) myArrayListForXLSData.add(formattedValue ) или какие-там параметры
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
20.02.2017, 16:50  [ТС]
Я поначалу тоже нацелился на этот метод... и для теста вбил в метод system.out.println("1");
При компиляции ничего не вывело в консоли... я так понял что этот метод не отрабатывается
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2017, 19:11
только что проверил все отрабатывается
0
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 10
21.02.2017, 14:27  [ТС]
Спасибо за уделенное время... завтра попробую, скопирую код полностью заного, надеюсь все отработает... а то голову уже сломал, почему не отрабатывается.

Добавлено через 10 часов 45 минут
Можешь вставить код с имортируемыми библиотеками? Сравню библиотеки...

Добавлено через 1 час 40 минут

Добавлено через 8 минут
Вот полный код, который я компилирую:

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();
        }
 
    }
 
 
}
Добавлено через 1 час 10 минут
При компиляции list не заполняется ... так и не заходит в метод cell

Добавлено через 5 часов 25 минут
Итак нашел все таки решение моей проблемы... переписал код, теперь он читает все данные со всех листов файла Xlsx.

Надеюсь кому-нибудь этот код поможет и сэкономит пару деньков головоломки:

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2017, 14:27
Помогаю со студенческими работами здесь

Загрузка больших файлов
Всем привет! Такая проблема в input type file не хочет загружать большие файлы. Когда загружаешь примерно 6-7мг, то нормально. А 20 мг -...

Загрузка больших файлов
День добрый, друзья. В .htaccess я прописал эти строки: php_value post_max_size 2M php_value upload_max_filesize 1M Итак, к...

Загрузка больших файлов на сервер
сделал форму маленькие файлы грузит нормально примерно до 1МБ. вот код: &lt;form enctype=&quot;multipart/form-data&quot;...

Загрузка больших файлов на сервер
Всем привет! Я загружаю файлы на сервер в убунту вот таким кодом(код ниже), но загружаются файлі только меншьше 100 кбайт, а мне надо 5-6...

Загрузка больших файлов на php
Перепробовал с 10 файлообенников, но ни один не хочет работать с большими файлами. в пхп.ини менял макс. размер загруж. файла - не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru