1.为项目添加依赖,涉及到的依赖如下:
<!-- Jasper -->
<dependency>
<groupId>net.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>net.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>net.jasperreports</groupId>
<artifactId>fonts</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.jasperreports</groupId>
<artifactId>jasperreports-javaflow</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>commons-javaflow</groupId>
<artifactId>commons-javaflow</artifactId>
<version>20060411</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>net.sourceforge.barbecue</groupId>
<artifactId>barbecue</artifactId>
<version>1.5-beta1</version>
</dependency>
以上就是导出报表需要的依赖,接下来就是拿到可调用的模板。
2. 在JasperSoft软件中的模板需要编译一下才可以被我们直接调用,编译步骤如下:
编译生成可调用模板
3. 准备要写入模板的数据、调用写入模板的方法。
没有数据可以自己简单编写一下,此处省略,以下重点是文件的生成。
3.1 方法一
// http://localhost:8080/originaldisplay
@RequestMapping("/originaldisplay")
public void originaldisplay(HttpServletResponse response )throws Exception {
//map对应模板中Parameters中的参数
Map<String, Object> params = new HashMap<String,Object>();
params.put("applyDate",new Date(2019,1,10));
params.put("sampleNo", "976073X");
//子报表
params.put("SUBPATH_TWO", this.getClass().getClassLoader().getResource("jasper")+"/apply003.jasper");
params.put("tips", "无附件");
//list对应模板中Fields中的参数,Displaymain中的两个list元素,一个对应table,一个对应子报表
List<DisplayMain> listdata = displayService.selectInfo();
ServletOutputStream sosRefPdf = null;
InputStream isRef = null;
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
try {
isRef = this.getClass().getResourceAsStream("/jasper/apply001.jasper");
JasperPrint report = JasperFillManager.fillReport(isRef, params, new JRBeanCollectionDataSource(listdata));
JRAbstractExporter exporter = null;
sosRefPdf = response.getOutputStream();
response.setHeader("Content-disposition", "inline; filename=" + new String(("物品申请书"+".pdf").getBytes(),"ISO8859-1"));
JasperExportManager.exportReportToPdfStream(report, sosRefPdf);
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
sosRefPdf.close();
isRef.close();
}
}
3.2 方法二:配置的方法。
//导出到浏览器,BasicParams 是打印模板的基础类,自己创建的,包括文件的类型和模板的路径等
public void exportBrowser(HttpServletResponse response,Map<String, Object> map,BasicParams basicParams,List<?> data) throws Exception{
ServletOutputStream sosRef = null;
InputStream isRef = null;
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
try {
isRef = this.getClass().getResourceAsStream(basicParams.getTemplatePath());
JasperPrint report = JasperFillManager.fillReport(isRef, map, new JRBeanCollectionDataSource(data));
JRAbstractExporter exporter = null;
sosRef = response.getOutputStream();
response.setContentType("application/octet-stream");// 二进制流,不知道下载文件的类型
response.setHeader("content-type", "application/octet-stream");// 让服务器告诉浏览器它发送的数据属于什么文件类型
//FileType.PDF是文件的枚举类型,也是自己创建的
if(basicParams.getFileType() == FileType.PDF) {
response.setHeader("Content-Disposition", "attachment;fileName=" + new String((basicParams.getFileName().toString()+".pdf").getBytes(),"ISO8859-1"));// 设置文件名(这个信息头会告诉浏览器这个文件的名字和类型)
}
if(basicParams.getFileType() == FileType.EXCEL) {
response.setHeader("Content-Disposition", "attachment;fileName=" + new String((basicParams.getFileName()+".xlsx").getBytes(),"ISO8859-1"));
}
if(basicParams.getFileType() == FileType.WORD) {
response.setHeader("Content-Disposition", "attachment;fileName=" + new String((basicParams.getFileName().toString()+".docx").getBytes(),"ISO8859-1"));
}
exporter = CreateExporter(basicParams.getFileType(),report,sosRef);
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}finally {
sosRef.close();
isRef.close();
}
}
CreateExporter方法
//对应导出不同类型文件的配置
private JRAbstractExporter CreateExporter(FileType fileType,JasperPrint jasperPrint,OutputStream sosRefFile)
{
JRAbstractExporter result = null;
try {
if (fileType == FileType.PDF) {
result = new JRPdfExporter();
result.setExporterInput(new SimpleExporterInput(jasperPrint));
result.setExporterOutput(new SimpleOutputStreamExporterOutput(sosRefFile));
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
result.setConfiguration(configuration);
result.exportReport();
}
if (fileType == FileType.EXCEL) {
result = new JRXlsxExporter();
result.setExporterInput(new SimpleExporterInput(jasperPrint));
result.setExporterOutput(new SimpleOutputStreamExporterOutput(sosRefFile));
SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setOnePagePerSheet(true);
configuration.setDetectCellType(true);
configuration.setCollapseRowSpan(false);
result.setConfiguration(configuration);
result.exportReport();
}
if (fileType == FileType.WORD) {
result = new JRDocxExporter();
result.setExporterInput(new SimpleExporterInput(jasperPrint));
result.setExporterOutput(new SimpleOutputStreamExporterOutput(sosRefFile));
SimpleDocxExporterConfiguration configuration = new SimpleDocxExporterConfiguration();
result.setConfiguration(configuration);
result.exportReport();
}
}catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
基础类BasicParams
public class BasicParams {
private String templatePath;//模板路径
private FileType fileType;//导出的文件类型
private String fileName;//导出文件的名称,不带文件类型后缀
private String savePath;//导出文件的存储位置,对应需要直接存储的方法,此案例中不用
//省略get和set方法
}
枚举类FileType
public enum FileType {
PDF,WORD,EXCEL
}
以下类是对应模板中的主体数据,SubOne 和SubTwo是两个子集。
package com.example.demo.report.bean;
import java.util.List;
public class DisplayMain {
private Integer applyId;
private String applyApartment;
private String applicant;
private String consignee;
private String consigneePhone;
private String outType;
private String consigneeAdress;
private String liaison;
private String liaisonPhone;
private String liaisonEmail;
private String applyType;
private String applyReason;
private List<SubOne> subOne;
private List<SubTwo> subTwo;
//省略get和set方法
}
SubOne
public class SubOne {
private Integer id;
private String medelno;
private Integer quantity;
private BigDecimal singlepriceE;
private BigDecimal sumpriceE;
private String salesType;
private Date deliveryDate;
//省略get和set方法
}
SubTwo
public class SubTwo {
private Integer id;
private String approver;
private String checkSituation;
private String checkOpinion;
private Date checkDate;
//省略get和set方法
}
- 启动项目,访问得到结果。
得到结果。
假如,选择如下的运行方式,可能会出现中文无法显示的情况。
究其原因是因为JasperReport从6.0开始就不再支持中文了,需要我们自己配置中文。
我尝试了好几种方法,点 这里可以参考,也可以尝试一下其他的解决方法。
以上,谢谢观看。