XPages - использование POI 4 XPages poiBean
Я пытаюсь использовать объект POI (из POI 4 XPages) для создания документа Word с содержимым из XPage. Я добавил и настроил службу REST в соответствии с примером в базе данных примера POI.
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())
Я хотел бы сейчас создать ответный документ, который содержит результат приведенного выше кода в поле richtext. Я предпочитаю помещать необходимый код (я полагаю, 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"
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);
Дайте нам знать, как это идет
Я решил эту проблему с помощью библиотеки docx4j. Я думаю, что это гораздо лучший вариант, чем Apache POI. Проверьте http://www.docx4java.org/