之前我使用过Pentaho报告,在那里我可以使用pentaho报表设计器创建报表,并将.prpt文件部署到BI服务器中。它会工作正常。
现在我正在寻找一个解决方案,我可以将.prpt文件放在Java程序中,并像jasper报告(.jrxml文件)一样运行。因为我需要将Pentaho报告与我的Web应用程序集成。
我可能会问一个非常基本的问题。但我没有找到适当的文件。请指出一些正确的位置,示例代码将有所帮助。
答案 0 :(得分:2)
由于接受答案中的第一个链接似乎不再起作用,正在寻找示例的人可能会发现这更有用:https://github.com/pentaho/pentaho-reporting/blob/master/engine/samples/source/org/pentaho/reporting/engine/classic/samples
某些示例中的代码有点复杂,所以我发布了自己的报表生成器类,其中只包含生成PDF报表的基本要素:
public class ReportGenerator {
public byte[] generateReport(byte[] templateBytes, Map<String, Object> params) throws Exception {
ClassicEngineBoot.getInstance().start();
MasterReport reportData = loadTemplateDefinition(templateBytes);
addParametersToReport(params, reportData);
byte[] reportBytes = generateReport(reportData);
return reportBytes;
}
private MasterReport loadTemplateDefinition(byte[] templateBytes) throws Exception {
ResourceManager resourceManager = new ResourceManager();
Resource templateResource = resourceManager.createDirectly(templateBytes, MasterReport.class);
return (MasterReport) templateResource.getResource();
}
private void addParametersToReport(Map<String, Object> params, MasterReport reportData) {
if (params != null) {
for (String key : params.keySet()) {
reportData.getParameterValues().put(key, params.get(key));
}
}
}
private byte[] generateReport(MasterReport reportData) throws ReportProcessingException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfOutputProcessor outputProcessor = new PdfOutputProcessor(reportData.getConfiguration(), outputStream, reportData.getResourceManager());
AbstractReportProcessor reportProcessor = null;
try {
reportProcessor = new PageableReportProcessor(reportData, outputProcessor);
reportProcessor.processReport();
} finally {
if (reportProcessor != null) {
reportProcessor.close();
}
}
return outputStream.toByteArray();
}
}
generateReport方法接受templateBytes参数中的.prpt文件的内容,以及在params参数中生成报告所需的参数列表。
它返回的字节数组包含生成的PDF报告的内容。
此外,如果您在应用程序中使用Maven,则必须包含所有必需的依赖项。我使用了我在这里找到的列表:http://wiki.pentaho.com/display/Reporting/How+to+integrate+report+designer+to+your+web+application,并在其中用版本6.1.0.1-196替换了所有与pentaho相关的库版本
答案 1 :(得分:1)
我已经在我的Java应用程序中成功嵌入了Pentaho Reporting Engine。有一个包含必要库和示例的教程。启动时唯一需要考虑的是使用相同版本的Pentaho SDK,Pentaho Reporting Engine和Pentaho Report Designer,以避免出现数据源问题。如果您不想要依赖关系的麻烦,可以下载Pentaho Report Designer并将所有库拖放到您的Web应用程序中(当您尝试使用pentaho图表时,大多数问题都出现了,并且它们以这种方式解决)。
官方Pentaho文档:
Pentaho报告经典引擎核心(最好先尝试一下):
http://sourceforge.net/projects/jfreereport/files/01.%20Classic%20Engine/
只需导入IDE中的所有库(我使用Eclipse Helios),并使用提供的示例,它将作为魅力!然后您可以根据需要开始修改它。我建议您查看如何处理报告的路径。
答案 2 :(得分:0)
final FacesContext context = FacesContext.getCurrentInstance();
ClassicEngineBoot.getInstance().start();
try {
// load report definition
ResourceManager manager = new ResourceManager();
manager.registerDefaults();
ExternalContext extContext = context.getExternalContext();
String reportPath = "file:" + extContext.getRealPath("name/name.prpt");
Resource res = manager.createDirectly(new URL(reportPath), MasterReport.class);
MasterReport report = (MasterReport) res.getResource();
................
................
httpServletResponse.setContentType("application/rtf");
httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"name.rtf\"");
RTFReportUtil.createRTF(report, httpServletResponse.getOutputStream());
FacesContext.getCurrentInstance().responseComplete();
} catch (ReportProcessingException ex) {