package net.conselldemallorca.helium.webapp.mvc; import java.io.ByteArrayInputStream; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.conselldemallorca.helium.v3.core.api.service.AdminService; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.export.JRCsvExporter; import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRRtfExporter; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; import net.sf.jasperreports.engine.export.JRXmlExporter; import net.sf.jasperreports.engine.export.oasis.JROdtExporter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.View; /** * Vista per a generar un report amb Jasper Reports * * @author Limit Tecnologies <limit@limit.es> */ public class JasperReportsView implements View { public static final String HEADER_PRAGMA = "Pragma"; public static final String HEADER_EXPIRES = "Expires"; public static final String HEADER_CACHE_CONTROL = "Cache-Control"; public static final String MODEL_ATTRIBUTE_REPORTDATA = "mapCollectionData"; public static final String MODEL_ATTRIBUTE_REPORTCONTENT = "reportContent"; public static final String MODEL_ATTRIBUTE_SUBREPORTS = "subreports"; public static final String MODEL_ATTRIBUTE_SUBREPORTDATA_PREFIX = "subreportFile_"; public static final String MODEL_ATTRIBUTE_CONSULTA = "reportConsulta"; public static final String MODEL_ATTRIBUTE_PARAMS = "reportParams"; private AdminService adminService; @Autowired public JasperReportsView(AdminService adminService) { this.adminService = adminService; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void render( Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setHeader(HEADER_PRAGMA, ""); response.setHeader(HEADER_EXPIRES, ""); response.setHeader(HEADER_CACHE_CONTROL, ""); JRBeanCollectionDataSource datasource = null; if (model.get(MODEL_ATTRIBUTE_REPORTDATA) != null) datasource = new JRBeanCollectionDataSource((List<Map<String, Object>>)model.get(MODEL_ATTRIBUTE_REPORTDATA)); if (datasource != null) { adminService.mesuraTemporalIniciar("INFORME: " + (String)model.get(MODEL_ATTRIBUTE_CONSULTA), "report", null, null, "REPORT"); JasperReport report = null; report = JasperCompileManager.compileReport(new ByteArrayInputStream((byte[])model.get(MODEL_ATTRIBUTE_REPORTCONTENT))); Map<String, Object> params = new HashMap<String, Object>(); JasperReport subreport = null; HashMap<String, byte[]> subreports = (HashMap<String, byte[]>)model.get(MODEL_ATTRIBUTE_SUBREPORTS); if (subreports!=null) if (!subreports.isEmpty()) { Iterator it = subreports.entrySet().iterator(); while (it.hasNext()) { Map.Entry e = (Map.Entry)it.next(); subreport = JasperCompileManager.compileReport(new ByteArrayInputStream((byte[]) e.getValue())); String nom = (String) e.getKey(); nom = nom.substring(0, nom.lastIndexOf(".")); params.put(nom, subreport); params.put("ds_" + nom, new JRBeanCollectionDataSource((List<Map<String, Object>>)model.get(MODEL_ATTRIBUTE_REPORTDATA))); } } Map<String, Object> paramsModel = (Map<String, Object>)model.get( MODEL_ATTRIBUTE_PARAMS); if (paramsModel != null) params.putAll(paramsModel); JasperPrint jasperPrint = JasperFillManager.fillReport( report, params, datasource); Object exp = (String)request.getAttribute("formatJR"); if("PDF".equals(exp)){ //exportar PDF response.setHeader("Content-Disposition","attachment; filename=\"informe.pdf\""); response.setContentType("application/pdf"); response.getOutputStream().write( JasperExportManager.exportReportToPdf(jasperPrint)); } else if("ODT".equals(exp)){ //exportar ODT response.setHeader("Content-Disposition","attachment; filename=\"informe.odt\""); response.setContentType("application/vnd.oasis.opendocument.text"); File odtFile = new File("filename=\"informe.odt\""); JROdtExporter loOdtExp = new JROdtExporter(); loOdtExp.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); loOdtExp.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); loOdtExp.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); loOdtExp.setParameter(JRExporterParameter.OUTPUT_FILE, odtFile); loOdtExp.exportReport(); } else if("RTF".equals(exp)){ //exportar RTF response.setHeader("Content-Disposition","attachment; filename=\"informe.rtf\""); response.setContentType("application/rtf"); File rtfFile = new File("filename=\"informe.rtf\""); JRRtfExporter loRtfExp = new JRRtfExporter(); loRtfExp.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); loRtfExp.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); loRtfExp.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); loRtfExp.setParameter(JRExporterParameter.OUTPUT_FILE, rtfFile); loRtfExp.exportReport(); } else if("CSV".equals(exp)){ //exportar CSV response.setHeader("Content-Disposition","attachment; filename=\"informe.csv\""); response.setContentType("Content-type: text/csv"); File csvFile = new File("filename=\"informe.csv\""); JRCsvExporter loCsvExp = new JRCsvExporter(); loCsvExp.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); loCsvExp.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); loCsvExp.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); loCsvExp.setParameter(JRExporterParameter.OUTPUT_FILE, csvFile); loCsvExp.exportReport(); } else if("HTML".equals(exp)){ //exportar HTML response.setHeader("Content-Disposition","attachment; filename=\"informe.html\""); response.setContentType("text/html"); File htmlFile = new File("filename=\"informe.html\""); final JRHtmlExporter loHtmlExp = new JRHtmlExporter(); loHtmlExp.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); loHtmlExp.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); loHtmlExp.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); loHtmlExp.setParameter(JRExporterParameter.OUTPUT_FILE, htmlFile); loHtmlExp.exportReport(); } else if("XML".equals(exp)){ //exportar XML response.setHeader("Content-Disposition","attachment; filename=\"informe.xml\""); response.setContentType("text/xml"); JRXmlExporter xmlExporter = new JRXmlExporter(); File xmlFile = new File("filename=\"informe.xml\""); xmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); xmlExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); xmlExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); xmlExporter.setParameter(JRExporterParameter.OUTPUT_FILE, xmlFile); xmlExporter.exportReport(); } else if("XLS".equals(exp)){ //exportar XLS response.setHeader("Content-Disposition","attachment; filename=\"informe.xls\""); response.setContentType("application/excel"); JRXlsExporter loXlsExp = new JRXlsExporter(); loXlsExp.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); loXlsExp.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); loXlsExp.setParameter(JRXlsExporterParameter.CHARACTER_ENCODING, "UTF-8"); loXlsExp.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, response.getOutputStream()); loXlsExp.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); loXlsExp.exportReport(); } else { //exportar PDF response.setHeader("Content-Disposition","attachment; filename=\"informe.pdf\""); response.setContentType("application/pdf"); response.getOutputStream().write( JasperExportManager.exportReportToPdf(jasperPrint)); } adminService.mesuraTemporalCalcular("INFORME: " + (String)model.get(MODEL_ATTRIBUTE_CONSULTA), "report", null, null, "REPORT"); } } public String getContentType() { return null; } }