Poi Зависает После Создания Отчета

Bob84

Well-Known Member
16.05.2012
48
0
#1
Здравствуйте.
С помощью библиотеки POI создаем отчеты в Excel. После того как пользователю предоставляется файл с результатом, для загрузки, на некоторое время (10-20 сек) в окне перестают работать кнопки и ссылки для перехода на другие Xpage.
Примерный код кнопки, для создания отчета:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">onClick, ServerSide</div></div><div class="sp-body"><div class="sp-content">
C++:
try{	
importPackage(java.lang);
importPackage(org.apache.poi.hssf.usermodel);
importPackage(org.apache.poi.hssf.util);

var sheetName = "Лист1";
var workbookName = "workbook1";

var doc: NotesDocument;

var prevDoc: NotesDocument;	

var wb = new HSSFWorkbook();

var sheet1 = wb.createSheet(sheetName);

var query = "формула отбора"

var dcNotSorted: NotesDocumentCollection = database.search(query);

// <бегаем по коллекции>***************************************
rows=sheet1.getLastRowNum();
var dc: NotesDocumentCollection = SortCollection(dcNotSorted, ["ключ для сортировки"]); 

doc = dc.getFirstDocument();

while (doc != null) {
//обработка документа, создаем строки таблици и заполняем их данными из документа

prevDoc = doc;
doc = dc.getNextDocument(doc);		
}	
// </бегаем по коллекции>***************************************

// <вывод результата>
try {
//Create the filename for the spreadsheet	
var fileName = workbookName + ".xls";
// The Faces Context global object provides access to the servlet environment via the external content
var extCont = facesContext.getExternalContext();
// The servlet's response object provides control to the response object
var pageResponse = extCont.getResponse();
//Get the output stream to stream binary data
var pageOutput = pageResponse.getOutputStream();
// Set the content type and headers
pageResponse.setContentType("application/x-ms-excel");
pageResponse.setHeader("Cache-Control", "no-cache");
pageResponse.setHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
//Write the output, flush the buffer and close the stream
wb.write(pageOutput);
} catch (e) {
print(e.toString());
} finally {
pageOutput.flush();
pageOutput.close();
// Terminate the request processing lifecycle.
facesContext.responseComplete();
}
// </вывод результата>
}catch (e) {
view.postScript('alert("' + e.toString() + '")');	
}

Для работы используем следующий jar POI - poi-3.10.1-20140818.jar

Спасибо.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#2
Лучше навесь этот код на отдельную страницу.. в событие afterPageLoad.
А по кнопке или ссылке открывай эту страницу
 

Bob84

Well-Known Member
16.05.2012
48
0
#3
Сделал xpage report2Click.xsp, создание отчета повесил на afterPageLoad. На старнице отчета сдела кнопку с кодом:
C++:
context.redirectToPage("report2Click.xsp");
Эффект тот же, пробовал вешать на событие BeforeRenderResponse, при установленом rendered в false - все равно есть подвисание после отработки.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#4
Сделал xpage report2Click.xsp, создание отчета повесил на afterPageLoad. На старнице отчета сдела кнопку с кодом:
C++:
context.redirectToPage("report2Click.xsp");
Эффект тот же, пробовал вешать на событие BeforeRenderResponse, при установленом rendered в false - все равно есть подвисание после отработки.
Ну у меня тоже этот метод используется, но проблем никаких.
Но с другой стороны, а почему не должно быть тормозов?
Какой объем данных передается?
 

Bob84

Well-Known Member
16.05.2012
48
0
#5
Объем совершенно незначительный, база тестовая, как правило около десяти документов обрабатывает.