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

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

20.02.2017, 13:39. Показов 1658. Ответов 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
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru