powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java + Apache POI. Очень долго формируется Excel-документ
50 сообщений из 50, показаны все 2 страниц
Java + Apache POI. Очень долго формируется Excel-документ
    #39175013
Warlock86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть задача реализовать средствами Oracle автоматическое построение произвольного отчёта с сохранением его в Excel-файл. Написал хранимую процедуру, которая получает в качестве параметра текст SQL-запроса, строит его и сохраняет результат в переменную типа TABLE of CLOB: каждый элемент - строка, значения колонок разделены символом "~". Затем эта переменная передаётся в Java-процедуру, которая должна поместить данные в заранее созданный Excel-файл. При тестировании процедуры на запросе, возвращающем около 70 тысяч строк, оказалось, что весь процесс занял примерно 12 часов, из которых собственно выполнение SQL-запроса занимало меньше 20 минут. Подскажите, пожалуйста, есть ли какой-нибудь способ ускорить формирование Excel-файла?

Текст Java-кода:

Код: 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.
import  java.io.*;
import  org.apache.poi.hssf.usermodel.HSSFSheet;
import  org.apache.poi.hssf.usermodel.HSSFWorkbook;
import  org.apache.poi.hssf.usermodel.HSSFRow;
import  org.apache.poi.hssf.usermodel.HSSFCell;
import java.sql.*;
import java.math.*;
import oracle.sql.*;

public class TestExcel { /*Создание пустого файла*/
	public static void createFile(String f) throws FileNotFoundException, IOException, NullPointerException {
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet("Лист 1");
		FileOutputStream fileOut = new FileOutputStream(f);
		workbook.write(fileOut);
		fileOut.close();
	}

	private static void show_array_info( oracle.sql.ARRAY p_in ) throws SQLException, ClassCastException {
		System.out.println( "Array is of type      " + p_in.getSQLTypeName() );
		System.out.println( "Array is of type code " + p_in.getBaseType() );
		System.out.println( "Array is of length    " + p_in.length() );
	}
	
	public static void setCells(String f, int r, int c, oracle.sql.ARRAY v)  throws FileNotFoundException, IOException, NullPointerException, ClassCastException, SQLException {
		/*Параметры: f - путь к файлу, r - количество строк, c - количество колонок, v - массив данных*/
		long i;
		int j;
		long s;
		s=1;
		FileInputStream input_document = new FileInputStream(new File(f)); /*Открытие файла*/
		HSSFWorkbook my_xls_workbook = new HSSFWorkbook(input_document);
		HSSFSheet my_worksheet = my_xls_workbook.getSheetAt(0);
		show_array_info(v);
                CLOB[] v_rows;
                v_rows = (CLOB[]) v.getArray(); /*Загрузка массива строк*/
		for(i=0;i<r;i++) {
			if(i % 65000 == 0 && i>0) {
				my_worksheet = my_xls_workbook.createSheet("Лист " + (s+1)); /*Переход на новый лист, если количество строк превышает 65 000*/
				s++;
			}
			int ii=(int)(i-65000*(s-1)); /*Номер строки*/
			HSSFRow row = my_worksheet.getRow(ii);
			if (row==null) {
				row = my_worksheet.createRow(ii);
			}
			CLOB v_cells=v_rows[(int) i]; /*Получение строки*/
			long l=v_cells.length(); /*Длина всей строки*/
			long ch=1; /*Проверяемый символ*/
			long st=1; /*Начало подстроки*/
                        j=0; /*Номер колонки*/
			while(ch<l){
				if(v_cells.getSubString(ch,1).equals("~")) { /*Если в строке обнаружен символ ~, добавляем новую ячейку*/
					HSSFCell cell = row.getCell(j); 
					if (cell==null) {
						cell = row.createCell(j);
					}
					if(ch==st) { /*Если начало подстроки совпадает с символом ~, добавляем пустую ячейку, иначе добавляем в ячейку подстроку*/
						cell.setCellValue(" ");
					} else {
						cell.setCellValue(v_cells.getSubString(st,(int)(ch-st)));
					}
					j++;
					st=ch+1; /*Сдвигаем начало подстроки на позицию после последнего найденного символа ~*/
				}
				ch++;
			}
		}
		input_document.close();
		FileOutputStream output_file =new FileOutputStream(new File(f));
		my_xls_workbook.write(output_file); /*Сохраняем изменённый файл*/
		output_file.close();
	}
}
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175154
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO принципиально ускорить: XML (как текст или SAX) или CSV

Если бы ты через OLE Automation в Excel заталкивал, подозреваю было бы еще медленнее.

Не принципиально:
1. Вынести весь это бардак с сервера БД. На месте админов, я бы за такое убивал
2. Разбираться с настройками памяти Java машины, но во встроенной в СУБД JVM - это будет совсем не тривиально, а может даже и почти не возможно ( "там automatic memory management, Oracle умный, сам знает как лучше" ( C ) админ по поводу настройки памяти в Oracle)
3. Профилировать и разбираться что тормозит

IMHO. С POI работал очень давно, лет 10-15 назад ))).
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175208
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warlock86,

Посмотрите https://poi.apache.org/spreadsheet/how-to.html#sxssf
Вы посимвольно сканируете строку на нахождение символа "~", вместо того, что бы сразу разбить её на подстроки - см. split
И вообще с массивом строк, мне кажется, не лучшая идея. Сначала вы набор данных загоняете в массив, потом вытаскиваете всё обратно. Непосредственно с набором данных работать не пробовали?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175212
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warlock86,

1. Обязательно открывать и читать старый файл? Может создавать новый лучше.
2. Я бы использовал Reader
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Reader r=v_rows.getCharacterStream();
StringBuilder sb=new StringBuilder();
while((ch=r.read())!=-1){
  if(ch=='~') { /*Если в строке обнаружен символ ~, добавляем новую ячейку*/
    HSSFCell cell = row.getCell(j); 
  if (cell==null) {
    cell = row.createCell(j);
  }
  cell.setCellValue(sb.length()==0?" ":sb.toString());
  sb.setLength(0);
  j++;
 }else{
   sb.append(ch);
 }
}
cell.setCellValue(sb.length()==0?" ":sb.toString());


3. Последний символ не обрабатывается while(ch<l) <- ch<=l
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175445
Warlock86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garrick , попробовал сделать так, как указано по ссылке. Возвращает ошибку ORA-29532: Java call terminated by uncaught Java exception: java.lang.SecurityException: Unable to create temporary file.

Добавил в код эту строчку:
Код: java
1.
System.setProperty("java.io.tmpdir", "Путь к директории для которой у пользователя есть права записи");


ничего не изменилось.

Как определить, где программа пытается создать временный файл? Или как изменить этот каталог?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175799
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Warlock86] Garrick , попробовал сделать так, как указано по ссылке. Возвращает ошибку ORA-29532: Java call terminated by uncaught Java exception: java.lang.SecurityException: Unable to create temporary file.

Добавил в код эту строчку:
Код: java
1.
System.setProperty("java.io.tmpdir", "Путь к директории для которой у пользователя есть права записи");


ничего не изменилось.

Временный файл создаётся в каталоге предусотренным для этого операционной системой. Проблема не в наличии каталога и прав доступа к нему, а в грантах текущего пользователя внутри Oracle. см. http://citforum.ru/database/oracle/kyte/19.shtml там есть примеры раздачи прав через процедуру GRANT_PERMISSION в пакете DBMS_JAVA
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175805
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warlock86Как определить, где программа пытается создать временный файл? Или как изменить этот каталог?

Извиняюсь, как-то криво цитата вставилась. Жалко редактировать нельзя.
Итак...

Временный файл создаётся в каталоге предусотренным для этого операционной системой. Проблема не в наличии каталога и прав доступа к нему, а в грантах текущего пользователя внутри Oracle. см. http://citforum.ru/database/oracle/kyte/19.shtml там есть примеры раздачи прав через процедуру GRANT_PERMISSION в пакете DBMS_JAVA
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175857
Warlock86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garrick , как давать пользователю права на чтение/запись файлов через DBMS_JAVA я знаю. Вопрос в том, что за папка используется для временных файлов (Windows Server 2008 R2 Standard x64)? Попробовал
Код: java
1.
dbms_java.grant_permission('USER_NAME','java.io.FilePermission','c:\Windows\Temp-','write');

- не помогло. После
Код: java
1.
dbms_java.grant_permission('USER_NAME','java.io.FilePermission','c:\-','write');

заработало, но мне кажется, неправильно давать пользователю право на запись во все папки диска C.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39175877
Warlock86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного некорректно выразился в предыдущем сообщении. Неправильно запустил процедуру, потому она и завершилась без ошибок (проблемный Java-код просто не запустился :-) ). При повторном запуске была уже ошибка на то, что у пользователя нет прав на удаление файлов и вот там уже был указан полный путь к директории. Выполнил следующие строчки:

Код: plsql
1.
2.
3.
4.
begin
dbms_java.grant_permission( 'RFO', 'SYS:java.io.FilePermission', 'C:\Users\USER1\AppData\Local\Temp\-', 'read,write' );
dbms_java.grant_permission( 'RFO', 'SYS:java.io.FilePermission', 'C:\Users\USER1\AppData\Local\Temp\-', 'delete' );
end;



где USER1 - имя пользователя, и всё заработало.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176509
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Апну тему, т.к. проблема, точнее говоря задача у меня схожая.

Формирую xlsx файлы с использованием XSSFWorkbook и скорость, которую выдает POI не очень радует, например, формирование таблицы 25 колонок * 100 строк, данные для которой уже профетчены из БД и уже закэшированы в рамках Java'овского процесса, занимает порядка 30 секунд. А бывает, что нужно сформировать файл тысячи, десятки тысяч строк и получается, такие файлы формируются уже десятками минут, при этом свободных аппаратных ресурсов навалом (куча свободных ядер, памяти).

Вот думаю, можно ли, как-нибудь распараллелить формирование файла, тем самым сократить время формирования файла, повысить утилизацию ресурсов?

ЗЫ: пытался гуглить на тему ThreadSafe у POI, но ничего внятного не нашел.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176522
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirдесятки тысяч строк
в excell? Уверены? Бумаги не жалко?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176527
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123just_vladimirдесятки тысяч строк
в excell? Уверены? Бумаги не жалко?
Уверен абсолютно, про бумагу не осилил. Есть соображения, как можно повысить скорость формирования?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176529
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir,
На такой объём нужен СЕРВЕР печати.
Или JasperReport но не POI.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176531
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
сервер печати? Вы о чем, стало еще непонятней...
А в JasperReport раньше вроде тоже POI использовался, что то изменилось? За счет чего он будет быстрее?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176538
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirЗа счет чего он будет быстрее?
- его можно посадить вообще на отдельную машину.
- у него обычный запрос к БД который можно отладить и оттюнить в любой БД, а потом записать в Jasper.
Где тут будет тормозить - выясняйте.
Если вы не ТС, то по новой описывайте проблему и что пытались делать.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176540
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123just_vladimirЗа счет чего он будет быстрее?
- его можно посадить вообще на отдельную машину.
- у него обычный запрос к БД который можно отладить и оттюнить в любой БД, а потом записать в Jasper.
Где тут будет тормозить - выясняйте.
Если вы не ТС, то по новой описывайте проблему и что пытались делать.
Я не ТС, особого смысла в размножении тем не вижу, свою проблему описал в этом посте:
авторФормирую xlsx файлы с использованием XSSFWorkbook и скорость, которую выдает POI не очень радует, например, формирование таблицы 25 колонок * 100 строк, данные для которой уже профетчены из БД и уже закэшированы в рамках Java'овского процесса, занимает порядка 30 секунд. А бывает, что нужно сформировать файл тысячи, десятки тысяч строк и получается, такие файлы формируются уже десятками минут, при этом свободных аппаратных ресурсов навалом (куча свободных ядер, памяти).

Вот думаю, можно ли, как-нибудь распараллелить формирование файла, тем самым сократить время формирования файла, повысить утилизацию ресурсов?

ЗЫ: пытался гуглить на тему ThreadSafe у POI, но ничего внятного не нашел.

Хотя если администрация форума считает, что нужна отдельная, то без проблем создам.


У меня отдельно сервер БД, отдельно сервер с Java приложением, проблем с запросом у меня нет и измеряю время затрачиваемое исключительно на формирование xlsx (все нужные данные уже внутри Java'овской коллекции) и, к сожалению, это время далеко от идеала.
Есть конечно же вариант вспомнить, что xlsx это всего лишь zip'ованный xml, который можно сгенерировать каким-нибудь шаблонным движком и вероятно будет приемлемо быстро, но вдруг все таки POI предлагает какие нибудь красивые возможности по быстрому формированию файлов.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176545
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirэто время далеко от идеала.
- поиск делал? Тут хотя бы цифры времени есть
О выгрузке в excel
- есть ветка форума отдельно для таких больших (странных) отчётов.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176706
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Excel достаточно простой XML формат.

Выгрузить свои данные в XML, создать XSL файл, натравить на исходный XML какой нибудь XSL-транформер (Xalan/Xerces), открыть в Excel. Профит.

Главное DOM не использовать и будет так быстро, как только возможно. IMHO & AFAIK
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176722
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudriavtsevВыгрузить свои данные в XML, создать XSL файл, натравить на исходный XML какой нибудь XSL-транформер (Xalan/Xerces), открыть в Excel. Профит.

Неправильное решение. Если нужно сделать отчёт "средствами Oracle", то такие средства есть - генераторы отчётов Oracle Reports (устаревший, но всё ещё годный) и новый Oracle BI Publisher.

Даже если их не использовать, то это решение лишено смысла, т.к. POI работает очень быстро и расходует мало памяти при правильном использовании (что я сам испытывал). Приведённый пример расходует много памяти, что показывает, что автор не потрудился изучить POI. Почему он работает медленно - заочно сказать трудно, надо смотреть, где торможение. Если памяти не хватает из-за её большого расхода, то будет тормозить. Но возможны другие причины. Но мне бы и в голову не пришло делать для этого хранимые процедуры в Oracle, т.к. они предназначены для расширения возможностей PL/SQL, чего тут не наблюдается. Можно попробовать оформить этот код в виде клиентского приложения, чтобы сравнить скорость.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176726
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MЕсли нужно сделать отчёт "средствами Oracle", то такие средства есть - генераторы отчётов Oracle Reports (устаревший, но всё ещё годный) и новый Oracle BI Publisher.
+

На проектах все на BI Publisher'е делали.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39176828
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ за BI
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39177417
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir,

Есть подозрение, что POI тут ни при чём. Попробуйте выгрузить ваши данные используя тот же самый алгоритм формирования "ячеек", например в CSV-файл. Сильно ли увеличится скорость формирования файла по сравнению с POI?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178030
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
судя по всему дело в автоподгоноке ширины колонок, думаю для больших выгрузок откажусь от этого.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178385
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirGarrick,
судя по всему дело в автоподгоноке ширины колонок, думаю для больших выгрузок откажусь от этого.
Я в процессе дабавления ячеек запоминаю максимальную длину строк в столбцах, а по окончании формирования всей таблицы устанавливаю ширину столбцов по этим значениям. Можно посмотреть здесь .
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178453
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
Спасибо! Решение красивое, наверное так и поступлю. А получается, что много строчные колонки просто будут получать максимальную ширину?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178465
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir,

Да, бывает, что длина строки ну очень большая и текст уходит за границу экрана, поэтому сделал ограничение на максимальную ширину столбца. Если реальная длина строки больше, то ширина столбца будет установлена на максимальный размер, в противном случае по максимальной длине строки в столбце.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178543
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если это отчёт для печати, то ширина колонок постоянна. Часто уход ширины за A4 вызывает больше проблем при печати, чем какие то вычисления по вписыванию отчёта.
Ну и тема пр быстроту вроде, а не про "красивости".
"Красивости" умеет быстро полноценный сервер печати (переброс абзацев на страницу и т.д.)
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178630
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Зачем Excel для печати? Для этого другие, более надёжные, средства есть. А Excel - это посмотреть на экране, посчитать что-нибудь на формулах и т.п. А ширина столбца... ну согласись некрасиво будет если ширина столбца такая, что чтобы прочитать надо два-три экрана вправо-влево крутить.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178667
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warlock86При тестировании процедуры на запросе, возвращающем около 70 тысяч строк, оказалось, что весь процесс занял примерно 12 часов, из которых собственно выполнение SQL-запроса занимало меньше 20 минут. Подскажите, пожалуйста, есть ли какой-нибудь способ ускорить формирование Excel-файла?
GarrickЗачем Excel для печати?
да!
Одно дело для печати. Другое для формул (подгонять равно). Третье для итогов.
Везде решение разное.
Топик стартовали для 70 000 строк. Я и подумал - для печати)).
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178747
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а чем хехель не нравится для печати? мне вот недавно задачу поставили - выдирать из базы и делать красивый прайслист. причем первая страница может через форму доп инфа добавляться, 1 строка или 40 строк. хз. пустое место должно быть заполнено таблицей с заголовком из разл наименований. я тупо сделал в екселе шаблон и закрепил заголовок таблицы как заголовок страницы и всё. просто вставляю тело таблицы и нужную инфу а он сам разбивает. теперь задача номер2 - сделать тоже самое при помощи хтмла и жсп. ну да, можно рассчитать количество строк на страницу и вбивать пейджбрейк - оно создает красивый такой документ. НО это всё легко сделать до тех пор пока ты знаешь сколько у тебя строк и сколько на первом листе утебя будет вставлено инфы, и высота строк постоянная. если эти данные начинают плавать - то всё. вешайся.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178757
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2рассчитать количество строк на страницу
кто в 3-ем тысячелетии решает такую техническую задачу сам? Очень сомнительно.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39178771
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2а чем хехель не нравится для печати?
Из известных мне форматов файлов только PDF позволяет пользователю однозначно вывести на принтер именно то, что задумал программист.
lor2...- то всё. вешайся.
Для таких задач есть XSL-FO. Познакомьтесь с Apache FOP например.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179009
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GarrickДля таких задач есть XSL-FO. Познакомьтесь с Apache FOP например.
автор70 тысяч строк
XSLT-это DOM, там с памятью могут быть всякие ООМ
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179108
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasa,

авторXSLT-это DOM, там с памятью могут быть всякие ООМ
А если в Excel листы форматировать для печати, то ничего такого не будет? Или там у @lor2 HTML-страница с прайс-листом на пару гигов? OOM всегда можно устроить при желании, никакого DOM для этого не надо. :)
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179119
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasaXSLT-это DOM, там с памятью могут быть всякие ООМ
А не SAX ?

Не знаю как сейчас, но раньше XSLT-трансформеры на SAX'е делали.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179124
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас Xalan работает через DTM

https://xml.apache.org/xalan-j/dtm.html

В память грузить XML придется, но overhead должен быть значительно меньше классического DOM.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179286
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garricklor2а чем хехель не нравится для печати?
Из известных мне форматов файлов только PDF позволяет пользователю однозначно вывести на принтер именно то, что задумал программист.
lor2...- то всё. вешайся.
Для таких задач есть XSL-FO. Познакомьтесь с Apache FOP например.
так я по-сути хтмл в пдф и конвертил. действительно здорово всё получается. т.к. имею некоторый опыт верстки всякого табличного хлама в связках жстл-хтмл. и печатается на всех девайсах одинаково. единственное что у меня вызывало затруднение - сказано выше. но это уже охамевшие хочунки заказчика. простой прайс им видите ли не надо на фирменном бланке стандартной форме им надо прайс от юдашкина. по поводу фопа спасибо. гляну. мне лично было бы удобнее дальше генерить документы внутри жсп а потом потоком в айтекст отдавать и пусть он генерит из хтмла готовый пдф.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39179288
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garrickam_sasa,

авторXSLT-это DOM, там с памятью могут быть всякие ООМ
А если в Excel листы форматировать для печати, то ничего такого не будет? Или там у @lor2 HTML-страница с прайс-листом на пару гигов? OOM всегда можно устроить при желании, никакого DOM для этого не надо. :)
нет, что вы. у меня прайсы в среднем до 4000-4500 позиций. это не пару гигов это в районе сотни. килобайт. ) если с фирменными бланками то может чуть больше - не смотрел. но получается реально красиво. если точно знать сколько строк на каждой странице.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39180310
Фотография A Serious Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
недавно пользовался этим пои. в пределах нескольких тысяч записей вполне быстро сохранял. секунды
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39185671
Warlock86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A Serious Man недавно пользовался этим пои. в пределах нескольких тысяч записей вполне быстро сохранял. секунды

Может быть. Но когда счёт идёт на десятки тысяч записей, начинает страшно тормозить. В итоге я решил задачу другим способом. В хранимой процедуре формирую XML-файлы, которые сохраняю на жёсткий диск и уже потом с помощью Java запаковываю их в Zip-архив с расширением XLSX.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39185750
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется встроенная в Oracle Java не очень быстрая.
Возможно, банальный перенос на другой app-sever
решил-бы проблемы автора.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39185947
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warlock86Но когда счёт идёт на десятки тысяч записей, начинает страшно тормозить.

Уточнение: у вас начинает страшно тормозить. В чём и был ваш вопрос. Но виновато не POI. Надо бвло искать свою ошибку. Вы в вашей программе не экономили память, загружая в неё сразу весь набор данных. Возможно есть ещё какие дефекты в программе. Я их не стал искать поскольку вы не отреагировали на моё первоначальное предложение. При правильном программировании POI не замедлится и от десятков тысяч строк, что мной проверено.

mayton
Мне кажется встроенная в Oracle Java не очень быстрая.
Возможно, банальный перенос на другой app-sever
решил-бы проблемы автора.


Чтобы проблемы были решены, надо программировать правильно. Но сервер приложений тут ни причём. Афтар зачем-то сделал программу в виде хранимой процедуры в Oracle, а они выполняются самой СУБД Oracle без сервера приложений.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Java + Apache POI. Очень долго формируется Excel-документ
    #39787574
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, тут дело не в "построчном" чтении. А в фомировании самого листа excel.
У меня сейчас (и даже не в Oracle а просто отдельный софт) экспорт запроса на 432 строки заметное время отномает.
т.е. если в любой другой формат, хоть html хоть в scv и прочее - доля секунды, а в Excel минуту наверно (не засекал но видимо долго).

На эту тему набрел в поисках ответа "как ускорить экпорт в excel org.apache.poi".
Помню, в другой среде, существенно было быстрей локально формировать массив а потом этот масив вставлять на лист, может, думал и тут что-то похожее есть.

А насчет "70 тысяч строк" - это не для excel задача (видимо забыли, что еще не так давно, было ограничение у него на 32 000 :D ). Да и не для печати.
Но, это уже не к теме.

Так есть варианты ускорить формирование листа? Не по строчно записывать а массивом (как пример) ?
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787618
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Время открытие книги: 0,117
Время формирование заголовка: 0,006
Время формирование данных: 53,548 сек, строк: 436 колонок: 9
Время записи файла: 0,041
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787641
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class ApachePOITest {

    @Test
    public void simpleTest() throws ServiceException {
        long start = System.currentTimeMillis();
        HSSFWorkbook wb = new HSSFWorkbook();
        Sheet sheet = wb.createSheet();
        PrintSetup printSetup = sheet.getPrintSetup();
        printSetup.setLandscape(true);

        for (int rows = 0; rows < 500; rows++) {
            Row row = sheet.createRow(rows);
            for (int cols = 0; cols < 10; cols++) {
                Cell cell = row.createCell(cols);
                cell.setCellValue("r=" + rows + "; c=" + cols);
            }
        }

        File file = WorkBookUtils.createFile(wb, "simple_report");
        long end = System.currentTimeMillis();
        System.out.println("elapsed time = " + TimeUnit.SECONDS.convert((end - start), TimeUnit.MILLISECONDS) + " sec.\n" + file.getAbsolutePath());
    }
}



Код: sql
1.
elapsed time = 0 sec.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787667
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там есть вторая имплементация XSSFWorkbook. Для xml-формата.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787673
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТам есть вторая имплементация XSSFWorkbook. Для xml-формата.

думаете, что вторая имплементация даст 50+секунд на формирование жалких 500 строк?:)
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ничего не думаю. Я просто говорю что надо тестить обе. Там еще и zip-архивация идет.
Мало-ли какие еще гвозди и болты забиты.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787729
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинstells2,
Код: sql
1.
elapsed time = 0 sec.



Запись данных : 0,525 сек
Записб файла: 0,031 сек

Да.. там стояло sheet.autoSizeColumn(i); в цикле записи данных.
Вынес в отдельный цикл после записи данных, результат выше :)

Просто, форматированный вывод.
...
Рейтинг: 0 / 0
Java + Apache POI. Очень долго формируется Excel-документ
    #39787733
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТам есть вторая имплементация XSSFWorkbook. Для xml-формата.
спасибо, будем посмотреть :)
Как то не озадачивался раньше этими вещами.
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Java + Apache POI. Очень долго формируется Excel-документ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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