XPages — использование POI 4 XPages poiBean

Я пытаюсь использовать POI Bean (из POI 4 XPages) для создания документа Word с содержимым из XPage. Я добавил и настроил службу REST в соответствии с примером в базе данных POI Example.

var template = poiBean.buildResourceTemplateSource(null,"YourFile.docx");
var lstBM = new java.util.ArrayList();
var jce:CategoryFields = new CategoryFields();
var doc = currentDocument.getDocument(true);
var retOutput1 = jce.getCategoryField1(doc);
var retOutput2 = jce.getCategoryField2(doc);
var doc:NotesDocument = currentDocument.getDocument();
var Field1 = retOutput1;
var Field2 = retOutput2;
lstBM.add(poiBean.buildDocumentBookmark("Field1", retOutput1));
lstBM.add(poiBean.buildDocumentBookmark("Field2", retOutput2));
var result = poiBean.processDocument2Stream(template, lstBM);
if (result == null) {
print("?????");
}
return new java.io.ByteArrayInputStream(result.toByteArray()) 

Теперь я хотел бы создать ответный документ, который содержит результат приведенного выше кода в поле форматированного текста. Я предпочитаю размещать необходимый код (я думаю, SSJS) в событии кнопки onClick. Однако из кнопки я не знаю, как получить дескриптор вывода службы REST. Кто-нибудь знает, как я могу это сделать?

Я изменил код, предложенный ниже, следующим образом:

package AZGPackage;
import java.io.*;
import java.util.List;
import lotus.domino.*;
import biz.webgate.dominoext.poi.beans.PoiBean;
import biz.webgate.dominoext.poi.component.data.ITemplateSource;

public class MimeMaker {

private final PoiBean poiBean;
private final String templateName;
private String resultName;

public MimeMaker(PoiBean poiBean, String templateName, String resultName) {
    this.poiBean = poiBean;
    this.templateName = templateName;
}

public void renderToDocument(Session s, Document doc) throws NotesException {

    ITemplateSource template = poiBean.buildResourceTemplateSource(null,this.templateName);
    List lstBM = new java.util.ArrayList();
    CategoryFields jce = new CategoryFields();
    String retOutput1 = jce.getCategoryField1(doc);
    String retOutput2 = jce.getCategoryField2(doc);

    lstBM.add(poiBean.buildDocumentBookmark("Fachkompetenz", retOutput1));
    lstBM.add(poiBean.buildDocumentBookmark("Arbeitsverhalten", retOutput2));
    ByteArrayOutputStream result = poiBean.processDocument2Stream(template, lstBM);

    // Do the mime
    s.setConvertMime(false);
    MIMEEntity emailRoot = doc.createMIMEEntity("Body");
    MIMEEntity emailRootChild = emailRoot.createChildEntity();

    MIMEHeader emailHeader = emailRootChild.createHeader("Content-Disposition");
    emailHeader.setHeaderVal("attachment; filename=\"" + resultName + "\"");
    InputStream is = new ByteArrayInputStream(result.toByteArray());
    Stream stream = s.createStream();
    stream.setContents(is);
    emailRootChild.setContentFromBytes(stream, "x-vnd/ms-office-docx", MIMEEntity.ENC_IDENTITY_BINARY);

    s.setConvertMime(true);

   }
 }

Однако после звонка:

var mimeMaker = new AZGPackage.MimeMaker(poiBean, "YourFile.docx", "someFile.docx");
mimeMaker.renderToDocument(session, currentDocument.getDocument(true));

Я получаю сообщение об ошибке:

Ошибка интерпретатора сценария, строка = 3, столбец = 11: ошибка при вызове метода «renderToDocument (lotus.domino.local.Session, lotus.domino.local.Document)» в классе Java «AZGPackage.MimeMaker»


person Community    schedule 15.04.2014    source источник
comment
Для начала: не импортируйте class.*; быть конкретной. Затем удалите исключения NotesException и обработайте исключение внутри своего кода. Если поле Body уже существует, createMIMEEntity завершится ошибкой. Вы можете изменить тип возвращаемого значения с void на String и вернуть успех или текст ошибки — удобно для проверки.   -  person stwissel    schedule 15.04.2014
comment
Спасибо, я внес изменения, которые вы предлагаете. Код дает сбой в строке InputStream is = new ByteArrayInputStream(result.toByteArray()); с ошибкой java.lang.NullPointerException   -  person    schedule 16.04.2014
comment
Строка ByteArrayOutputStream result = poiBean.processDocument2Stream(template, lstBM); кажется, не работает, но я не могу понять, почему.   -  person    schedule 16.04.2014
comment
создать общедоступную static void main(String[] args) {   -  person stwissel    schedule 16.04.2014
comment
Спасибо, я попробую это, когда у меня будет время. По сравнению с Lotus Notes работать с MS Word в XPages намного сложнее :-(   -  person    schedule 16.04.2014
comment
Вы переходите с рабочего стола на среду браузера — в этом сложность. XPages с возможностями Java делают это относительно легко. Серверная среда требовательна, а офисные форматы — это вчерашний день!   -  person stwissel    schedule 16.04.2014


Ответы (2)


Создайте класс Java примерно так:

public class MimeMaker {

private final PoiBean poiBean;
private final String templateName;

public MimeMaker(PoiBean poiBean, String templateName, String resultName) {
    this.poiBean = poiBean;
    this.templateName = templateName;
}

public void renderToDocument(Session s, Document doc) {
    Template template = poiBean.buildResourceTemplateSource(null,this.templateName);
    Collection lstBM = new java.util.ArrayList();
    CategoryFields jce = new CategoryFields();
    String retOutput1 = jce.getCategoryField1(doc);
    String retOutput2 = jce.getCategoryField2(doc);

    lstBM.add(poiBean.buildDocumentBookmark("Field1", retOutput1));
    lstBM.add(poiBean.buildDocumentBookmark("Field2", retOutput2));
    ByteArrayOutputStream result = poiBean.processDocument2Stream(template, lstBM);

    // Do the mime
    s.setConvertMime(false);
    MIMEEntity emailRoot = emailDocument.createMIMEEntity("Body");
    MIMEEntity emailRootChild = emailRoot.createChildEntity();

    MIMEHeader emailHeader = emailRootChild.createHeader("Content-Disposition");
    emailHeader.setHeaderVal("attachment; filename=\"" + resultName + "\"");
    InputStream is = new ByteArrayInputStream(result.toByteArray());
    Stream stream = s.createStream();
    stream.setContents(is);
    emailRootChild.setContentFromBytes(stream, "x-vnd/ms-office-docx", MIMEEntity.ENC_IDENTITY_BINARY);

    s.setConvertMime(true);
   }
 }

Вам нужно исправить типы данных (я только что набрал в Блокноте), но суть вы поняли. Затем вы можете перейти к кнопке и сделать:

    var mimeMaker = new com.acme.MimeMaker(poiBean, "YourFile.docx", "someFile.docx");
    mimeMaker.renderToDocument(session, currentDocument.getDocument(true);

Дайте нам знать, как это происходит

person stwissel    schedule 15.04.2014
comment
В конце концов я решил эту проблему, используя docx4j, который мне кажется намного проще, чем Apache POI. - person ; 11.07.2014

Я решил эту проблему, используя библиотеку docx4j. Я думаю, что это гораздо лучший вариант, чем Apache POI. Посетите http://www.docx4java.org.

person Community    schedule 11.07.2014