我使用xdocreport 1.0.3,我想上传一个odt模板,处理它,最后得到一个docx处理过的文档。我怎么能这样做?
我试过了:
public void generateUserReport(long pcCaseId, long currentUserId) throws CMSException{
try {
InputStream is = new FileInputStream(CustomTemplate.TEMPLATES_PATH + "test.odt");
IXDocReport report;
report = XDocReportRegistry.getRegistry().loadReport(is,TemplateEngineKind.Velocity);
IContext context = report.createContext();
FieldsMetadata metadata = new FieldsMetadata();
metadata.addFieldAsImage("signature");
metadata.addFieldAsImage("logo");
Date currentDate = new Date();
SimpleDateFormat df = new SimpleDateFormat("MM/dd/YYYY");
context.put("currentDate", df.format(currentDate));
User user = this.userDAO.loadUser(currentUserId);
byte[] signatureByteArr = user.getSignature();
context.put("userName", user.getFullName());
//TODO If exists signature, it will be added, in other case?
if (signatureByteArr!=null){
FileOutputStream fos = new FileOutputStream(CustomTemplate.TEMPLATES_PATH + "signature.jpg");
report.setFieldsMetadata(metadata);
fos.write(signatureByteArr);
FileImageProvider signature = new FileImageProvider(new File(CustomTemplate.TEMPLATES_PATH,"signature.jpg"));
context.put("signature", signature);
}else{
FileImageProvider noImage = new FileImageProvider(new File(CustomTemplate.TEMPLATES_PATH, "1px.gif"));
context.put("signature", noImage);
}
FileImageProvider logo = new FileImageProvider(new File("TEMPLATES_PATH, logo.gif"));
context.put("logo", logo);
OutputStream out = new FileOutputStream(new File(CustomTemplate.TEMPLATES_PATH, "OutPut.docx"));
report.process(context, out);
System.out.println("Success");
} catch (IOException e) {
System.out.println("IO exception");
} catch (XDocReportException e) {
System.out.println("XDocException");
e.printStackTrace();
}
}
我得到一个OutPut.docx,但“事实上”它是一个odt文档,Microsoft Office无法在没有错误详细信息的情况下打开它。 OpenOffice没有任何问题地打开它。
答案 0 :(得分:4)
简而言之, XDocReport不支持odt-> docx转换器。
您使用report.process
表示没有转化(docx模板 - > docx报告,odt模板 - > odt报告)。在您的示例中,生成的报告是一个odt(即使您使用docx扩展名设置文件名),这也是启用OpenOffice打开它的原因,尽管MS Word无法打开它。
如果您希望将报告转换为其他格式(如html,pdf),则必须使用report.convert
,但在您的情况下,您需要一个XDocReport不提供的docx-> odt转换器。但是,由于XDocReport是模块化的,您可以开发自己的docx-> odt转换器并使用XDocReport插入它。