JasperReport动态生成表格报表

在JasperReport中动态的生成报表有两种情况:

一、直接从数据库中查询把查询结果直接显示出来适合简单的报表;

二、手动传一个DataSuoce适合复杂报表。

完成效果图:


JasperReport动态生成表格报表_第1张图片
 
 

在页面显示字体比较复杂的时候往往是自己去传一个数据源,比如说要显示的字段是来自多张表的内容时,具体过程是这样的:

1.用iReport创建jrmxl文件



	
	
	
	 
		
			
		
		
		
		
		
		
	
	
		
	
	
		
	
	
	
		
			
			
				
					
				
				
				
					
						
													  
						
						
						
					
					
					
					
						
						  
							
						  
						
					
					
				
			
		
	
	

 

 2.后台JAVA代码:

//....
//把样式表读取到内在中
String reportFilePath = httpRequest.getRealPath("/resources/reports/changeGoods.jrxml");

//collection中有一个对象,这个对象里面有一个List集合字段名叫cgrlist
JRDataSource dataSource = new JRBeanCollectionDataSource(collection);
JasperReport report = JasperCompileManager.compileReport(reportFilePath);

//生成JasperPrint 对象的时候会迭代的从数据源中获取数据。
//并且为每个在当前数据源记录(data source record)中的报表字段(report field)提供value。
JasperPrint jasperPrint = JasperFillManager.fillReport(report, map, dataSource);

// 设置相应参数,以附件形式保存XLS
httpResponse.setContentType("application/vnd.excel");
httpResponse.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8")  + ".xls\"");

JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);  
exporter.exportReport();// 导出  

//.....

 

3.基本代码就这样了,这里有些东西还要再说明一下,在上面的jrxml文件中我们可以看到以下的代码:


		
			
		
		
		
		
		
		


	

 

在表格标签里面可以看到下面的代码: 




  

mber_username}]]>

 

这里使用到了 mber_username之前自己一直搞不懂为什么要这样写,后来尝试过几遍之后明白了,在中定义这些变量是因为在表格中要用到这些变量,如果把它们定义到外面,表格中就无法使用这些变量,因为找不到。所以如果在报表中使用了标签就要先在中定义变量。另外在表格中有cgrlist的使用


  
    cgrlist})]]>
  

 这里是使用之前就已经在上面定义了这个变量cgrlist,在Java代码中生成dataSource的collection不是一个简单的集合,这个集合的格式是这样的

//queryResult的内容是从数据库中查询出来的
List queryResult = new ArrayLit();

//在object3中有只有一个字段,一个类型为Object2的ArrayList,字段名是cgrlist
Object3 object3 = new Object3();
object3.setCgrlist(queryReult);
List collection = new ArrayList();
collection.add(object3);

JRDataSource dataSource = new JRBeanCollectionDataSource(collection);

 JasperReport在进行工作的时候,会就传进去的collection进行迭代,所以会从collection中得到一个object3

然后会根据xml文件中定义的字段名,从object3中去找到对应的字段cgrlist。在进行表格填充的时候会根据标签里面的字义字段名迭代地cgrlist从中找到对应的字段如name,id等,这样就可以将报表填充成定义的样子。

   ps.在含有的报表中如果collectionsize大于1那么在生成报表的时候就会出现多个表格,例如collection的size为2,里面放了两个object3对象,如果两个object3对象的数据相等就会产生两个数据一样的表格,数据不相同会产生两个数据不同的表格(相当于一个子报表)。如果想要传一个String类型的List(如:List srtList =new ArrayList();),需要先将所有String字段封装到一个类中,再对应地包装成collection才能传入(在相当双层循环中的第二层)。

      如果报表中没有则不用使用上面包含两层的复杂collection,直接用List collection = new ArrayList();(在JasperReport中把一个Object对象代表一行数据)

 

 

你可能感兴趣的:(JasperReport动态生成表格报表)