Tuesday, December 9, 2014

Downloading documents in CSV and PDF formats using Jasper Reports

For downloading documents liferay supports jasper reports engine and one of the market place EE portlet like Reports portlet is also works on the same. To work with Reports EE portlet we should have jrxml and need to upload in to the definition to generate CSV and PDF formats or any other formats. So If you want to download any document in your custom portlet you need to write the code using Jasper Reports API for preparing document. For that we need to pass Jrxml file (Jasper Report xml file) and this creation of jrxml will be done using ireport designer tool. IReport designer tool: Install any latest version of ireport designer and create data source connection with MySql server details as shown in step1 of the tool. Once it is done next step is click on step2 link and in Report section select Blank A4 and click on button “Open this Template”. It will ask the file to save and those folder details. After this a new report will be created by opening with designer view: So this is the designer page here you can give the fields for display, headings, fonts ,styles and lines we can draw and we can add tables, sub reports using the elements in Right-hand side of Palette section. So here you can design the page in the way what we want and arrange those using designer. We can drag and drop the fields from Fields section from the “Report Inspector”. So now we have created successfully a report and its view as shown below: This jrxml will be saved in folder location you gave. Copy this jrxml and create one folder in docroot with the name as reports and save this file in this location (report1.jrxml) Use this jrxml and pass this file to the Jasper reports using below code:

private void generateReport(PortletRequest resourceRequest , PortletResponse response, Map parameters) throws IOException {

String fileType = ParamUtil.getString(resourceRequest, "fileType");

if(fileType != null && fileType != ""){

HttpServletResponse httpServletResponse = PortalUtil.getHttpServletResponse(response);

OutputStream outputStream = httpServletResponse.getOutputStream();

List invoicesList = new ArrayList();

try { invoicesList = InvoiceLocalServiceUtil.getInvoices(-1, -1);

} catch (SystemException e) { System.out.println("no list found");

} String path = getPortletContext().getRealPath("/reports/test_jasper.jrxml");

InputStream inputStream = new FileInputStream (path);

JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(invoicesList);

byte[] contentArray = null;

try { JasperDesign jasperDesign = JRXmlLoader.load(inputStream);

JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);

if(fileType.equalsIgnoreCase("PDF")){

System.out.println("PDF calling");

contentArray = JasperExportManager.exportReportToPdf(jasperPrint);

httpServletResponse.setContentType("application/pdf");

httpServletResponse.setHeader("Content-Disposition","attachment;filename=test."+fileType);

outputStream.write(contentArray);

}else{

httpServletResponse.setContentType("text/csv");

JRCsvExporter exporter = new JRCsvExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER,";");

exporter.setParameter(JRCsvExporterParameter.RECORD_DELIMITER,"\r\n");

httpServletResponse.setHeader("Content-Disposition", "attachment;filename=testcsv.csv");

StringBuffer buffer = new StringBuffer();

exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, buffer);

exporter.exportReport();

outputStream.write(buffer.toString().getBytes());

httpServletResponse.flushBuffer();

} } catch (JRException e) {

e.printStackTrace();

System.out.println("data not found");

} outputStream.close();

}

}



Required jars for the above code is :

For preparing CSV document use the class JRCsvExporter and for PDF document use the class JasperExportManager. In above code for exporting document in to PDF and CSV formats the code has written. And remaining things are self-explanatory in the code. For downloading document we need to create OutputStream object and pass the appropriate MIME formats to the HttpServletResponse object. And from UI side I have created forms with two submit buttons “Generate CSV Report” and “Generate PDF Report”. While submitting the report I have created ResourceURL because the action we are doing here is ajax request because after downloading the document the page should not refresh. So I created liferay resource url and written serveResource() method implementation in controller side.

If we look on code in controller is : ExportReports.java



@Override public void serveResource(ResourceRequest resourceRequest, ResourceResponse response) throws IOException, PortletException {

String[] invoiceInfo = ParamUtil.getParameterValues(resourceRequest, "invoiceInfo");

generateReport(resourceRequest,response,putParameters(invoiceInfo));

} private Map putParameters(String[] invoiceInfo) {

Map parameters = new HashMap();

for(String selectedData : invoiceInfo){

selectedData = "show"+selectedData;

parameters.put(selectedData, Boolean.TRUE);

} return parameters;

}

We have completed our coding part and need to check it in application how is it working: downloaded csv file is :







No comments:

Post a Comment