JasperSoft Studio的使用(5)——后端调用并填充模板,导出pdf/excel/word

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方法	
}
  1. 启动项目,访问得到结果。
    run on server
    得到结果。
    结果
    假如,选择如下的运行方式,可能会出现中文无法显示的情况。

eclipse内置的方法
结果2
究其原因是因为JasperReport从6.0开始就不再支持中文了,需要我们自己配置中文。
我尝试了好几种方法,点 这里可以参考,也可以尝试一下其他的解决方法。
以上,谢谢观看。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值