JasperReports xls download via Spring MVC
This is an extension to the JasperReport step by step tutorial to demonstrate how to generate an Excel file. This extends the tutorial on stand-alone excel file to demonstrate how to produce xls as a file attachment via Spring MVC RESTful service call.
The controller class will be something like
//...
@Controller
public class MyApproller
{
@Resource(name = "myAppService")
private MyAppService myAppService;
@Resource(name = "reportWriter")
private ReportWriter reportWriter;
@RequestMapping(
value = "/person.xls",
method = RequestMethod.GET,
produces = "application/vnd.ms-excel")
@ResponseBody
public void getCashForecastCSV(HttpServletResponse response) throws Exception
{
//get the report data from the service layer
Collection<Person> reportData = myAppService.getReportData();
//get the parameters as a Map from the service layer
Map<String, Object> reportParameters = myAppService.getReportParameters();
//generate the xls report
byte[] xlsAsStringForPerson = reportWriter.getXlsAsStringForPerson(reportData, reportParameters);
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition", "attachment; filename=" + "person.xls");
//since binary, write it as stream
response.getOutputStream().write(xlsAsStringForPerson);
}
//..
}
//...........
@Service(value = "myAppService")
public class MyAppServiceImpl implements MyAppService {
public Collection<Person> getReportData()
{
//declare a list of object
List<Person> data = new LinkedList<Person>();
Person p1 = new Person();
p1.setFirstName("John");
p1.setSurname("Smith");
p1.setAge(Integer.valueOf(5));
data.add(p1);
return data;
}
public Map<String, Object> getReportParameters()
{
Map<String, Object> params = new HashMap<String, Object>();
params.put("footerText", "Just to demonstrate how to pass parameters to report");
return params;
}
}
Finally, the writer class the creates the xls file from the data
//..
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
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.design.JasperDesign;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.springframework.stereotype.Component;
//...
@Component(value = "reportWriter")
public class JasperReportWriterImpl implements ReportWriter
{
public static JasperDesign jasperDesign;
public static JasperPrint jasperPrint;
public static JasperReport jasperReport;
public static String reportTemplateUrl = "jasper/person-template.jrxml";
public byte[] getXlsAsStringForPerson(Collection<Person> reportData, Map<String, Object> reportParameters)
{
ByteArrayOutputStream output = null;
try
{
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(reportTemplateUrl);
//get report file and then load into jasperDesign
jasperDesign = JRXmlLoader.load(resourceAsStream);
//compile the jasperDesign
jasperReport = JasperCompileManager.compileReport(jasperDesign);
output = new ByteArrayOutputStream();
//fill the ready report with data and parameter
jasperPrint = JasperFillManager.fillReport(jasperReport, reportParameters,
new JRBeanCollectionDataSource(
reportData));
//coding for Excel
JRXlsExporter exporterXls = new JRXlsExporter();
exporterXls.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
exporterXls.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output);
exporterXls.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
exporterXls.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
exporterXls.exportReport();
}
catch (JRException e)
{
e.printStackTrace();
}
return output.toByteArray();
}
}
Labels: JasperReports

0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home