2016-09-26 2 views
2

Я хотел бы использовать принцип xagent для создания экспорта из представления Notes с помощью Apache Poi.Как создать несколько экспорта с помощью «xagent»?

Но вместо 1 экспортированного файла с несколькими листами я хотел бы создать несколько экспонатов, каждый из которых содержит только 1 лист.

Возможно ли? например

importPackage(java.lang); 
importPackage(org.apache.poi.hssf.usermodel); 

var fieldList = sessionScope.fList; 

var sheetName = "viewData"; 
var workbookName = "WBViewData"; 

var vName = sessionScope.viewName; 
var nc: NotesView = database.getView(vName); 
var doc: NotesDocument; 
var ndoc: NotesDocument; 

doc = nc.getFirstDocument(); 

for (d = 1; d <= nc.getEntryCount(); d++) { 

    //Create a new workbook object from the poi library 
    var wb: HSSFWorkbook = new HSSFWorkbook(); 
    //Create additional sheets using same syntax and different sheet name 
    var sheet1: HSSFSheet = wb.createSheet(sheetName); 

    //Create helper class and styles for dates 
    var createHelper: HSSFCreationHelper = wb.getCreationHelper(); 
    var dateStyle: HSSFCellStyle = wb.createCellStyle(); 
    dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy")); 

    var headerStyle: HSSFCellStyle = wb.createCellStyle(); 
    var headerFont: HSSFFont = wb.createFont(); 
    headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
    headerStyle.setFont(headerFont); 

    //Create the Column Header Rows 
    var row: HSSFRow = sheet1.createRow(0); 
    for (i = 0; i <= fieldList.length - 1; i++) { 

     var hCell: HSSFCell = row.createCell((java.lang.Integer)(i)); 
     hCell.setCellValue(fieldList[i]); 
     hCell.setCellStyle(headerStyle); 
    } 

    var row: HSSFRow = sheet1.createRow(d); 

    // process document... 


    //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); 
    pageOutput.flush(); 
    pageOutput.close(); 


    ndoc = nc.getNextDocument(doc); 
    doc.recycle(); 
    doc = ndoc; 
} 

// Terminate the request processing lifecycle. 
facesContext.responseComplete(); 
+1

Как вы думаете, как это работает? На один HTTP-запрос должен отвечать несколько ответов, каждый из которых содержит один файл? Нет, это не сработает с использованием HTTP. Или один HTTP-запрос должен отвечать одним ответом, который содержит несколько файлов? Это может работать с использованием HTTP. Просто посылая байты всех файлов в тело ответа. Но как же операционная система отделяет файлы? Единственным вариантом будет использование ZIP-архива (одного файла), содержащего файлы рабочей книги. –

+0

@AxelRichter Я знаю, что это звучит не логично, но если вам случается знать обходные пути. Конечно, я мог бы создавать документы в фоновом режиме и хранить их в документах Notes ... –

ответ

3

Вопрос не столько о XPages и POI, сколько о фундаментальном понимании того, как работает веб-взаимодействие. Каждый запрос, который вы отправляете на любой сервер, имеет ровно один поток для возврата данных. Этот поток можно перенаправить в файл с помощью заголовка вложения. Это все еще один поток. Итак, если вы хотите иметь несколько файлов в одном потоке, вам нужно иметь пункт назначения потока, который может вместить это. Протокол http не поддерживает. Один запрос дает один ответ. Однако вы можете записать свои отдельные файлы в zip-файл и вернуть его в запрос.

Update Но то, что вы действительно хотите сделать: есть ваша серверная сторона готова создать один XLS в то время, на основе строки запроса. Затем на вашей странице, где вы хотите захватить файл, вы используете запрос ajax для каждого файла отдельно, а файл html5 api - для записи результата локально. Поэтому вместо того, чтобы пытаться решить эту проблему на сервере, вы ставите клиента на место водителя. Там вы можете показать анимацию, отреагировать на каждое завершение и т. Д.

+0

можно ли получить какой-то ответ обратно из xagent на xpage, откуда пришел переадресация? –

+0

xagent может писать в область. – stwissel

Смежные вопросы