`
Notebookdong
  • 浏览: 122335 次
社区版块
存档分类
最新评论

JasperReport动态生成表格报表

 
阅读更多

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

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

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

完成效果图:



 
 

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

1.用iReport创建jrmxl文件

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="merclickreport" language="groovy" pageWidth="1020" pageHeight="842" columnWidth="980" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="1f7516fd-fdf2-4832-bd65-e38f305e587c">
	<property name="ireport.zoom" value="1.0"/>
	<property name="ireport.x" value="0"/>
	<property name="ireport.y" value="0"/>
	 <subDataset name="Table Dataset 1" uuid="beace6af-4d6c-4014-8611-e9409b9d6050">
		<queryString>
			<![CDATA[]]>
		</queryString>
		<field name="mber_nickname" class="java.lang.String"/>
		<field name="mber_username" class="java.lang.String"/>
		<field name="r_id" class="java.lang.Long"/>
		<field name="r_createtime" class="java.lang.String"/>
		<field name="ord_id" class="java.lang.Long"/>
	</subDataset>
	<queryString>
		<![CDATA[]]>
	</queryString>
	<field name="cgrlist" class="java.util.List">
		<fieldDescription><![CDATA[cgrlist]]></fieldDescription>
	</field>
	<detail>
	<band height="150">
		<componentElement>
			<reportElement uuid="07fec065-eeb0-4feb-a1bb-2f2350517e63" key="table" style="table" positionType="Float" stretchType="RelativeToTallestObject" x="13" y="33" width="955" height="80" isPrintWhenDetailOverflows="true"/>
			<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
				<datasetRun subDataset="Table Dataset 1" uuid="c5aa5d25-ef6c-44d9-8474-7ed2eefeee5a">
					<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cgrlist})]]></dataSourceExpression>
				</datasetRun>
				<jr:column width="102" uuid="d89caf07-d0fc-479d-9d7d-75d0c22eb5d6">
				<jr:columnHeader style="table_CH" height="60" rowSpan="1">
					<staticText>
						<reportElement uuid="ab907c87-9e75-4c48-b356-51c6720d806d" x="1" y="0" width="100" height="30"/>
						<textElement textAlignment="Center" verticalAlignment="Middle">							  
						<font isBold="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
						</textElement>
						<text><![CDATA[会员登录名]]></text>
					</staticText>
					</jr:columnHeader>
					<jr:detailCell style="table_TD" height="30" rowSpan="1">
					<textField>
						<reportElement uuid="4526b26c-be8c-437f-add5-70e00e0ebece" x="1" y="0" width="100" height="30"/>
						  <textElement textAlignment="Center" verticalAlignment="Middle">
							<font pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
						  </textElement>
						<textFieldExpression><![CDATA[$F{mber_username}]]></textFieldExpression>
					</textField>
					</jr:detailCell>
				</jr:column>
			</jr:table>
		</componentElement>
	</band>
	</detail>
</jasperReport>

 

 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文件中我们可以看到以下的代码:

<subDataset name="Table Dataset 1" uuid="beace6af-4d6c-4014-8611-   e9409b9d6050">
		<queryString>
			<![CDATA[]]>
		</queryString>
		<field name="mber_nickname" class="java.lang.String"/>
		<field name="mber_username" class="java.lang.String"/>
		<field name="r_id" class="java.lang.Long"/>
		<field name="r_createtime" class="java.lang.String"/>
		<field name="ord_id" class="java.lang.Long"/>
</subDataset>
<field name="cgrlist" class="java.util.List">
	<fieldDescription><![CDATA[cgrlist]]></fieldDescription>
</field>

 

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

<textField>
<reportElement uuid="4526b26c-be8c-437f-add5-70e00e0ebece" x="1" y="0" width="100" height="30"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
  <font pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H"    isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{mber_username}]]></textFieldExpression>
</textField>

 

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

<datasetRun subDataset="Table Dataset 1" uuid="c5aa5d25-ef6c-44d9-8474-7ed2eefeee5a">
  <dataSourceExpression>
    <![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cgrlist})]]>
  </dataSourceExpression>
</datasetRun>

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

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

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

JRDataSource dataSource = new JRBeanCollectionDataSource(collection);

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

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

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

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

 

 

  • 大小: 31.9 KB
分享到:
评论

相关推荐

    JasperReport动态生成报表

    **JasperReport动态生成报表** JasperReport是一款强大的开源报表工具,主要用于生成各种复杂的静态和动态报表。它基于Java,可以很好地与Java应用程序、Web应用和企业级应用集成,提供丰富的报表设计和灵活的数据...

    jasperreport 6.4.1报表动态列,以及生成导出html

    JasperReport是一款强大的开源报告生成库,主要用于设计和打印各种复杂的报表。在6.4.1版本中,它提供了丰富的功能,包括支持动态列的报表设计,这使得开发者可以根据数据的实际情况灵活调整列的数量和内容。这个...

    JasperReport 中交叉报表指南

    JasperReport 是一个功能强大且灵活的报表生成工具,它提供了许多功能来帮助开发者生成复杂的报表。在报表生成中,交叉报表是一种常用的报表类型,能够将数据按照行和列进行交叉处理,生成一个交叉表。以下是 ...

    JasperReport动态表头及subreport实现多表

    在IT行业中,报表生成是数据分析和业务展示的重要环节,JasperReport作为一个强大的开源报表工具,被广泛应用在Java项目中。本篇文章将详细讲解如何利用JasperReport实现动态表头和多表分页,并通过subreport来达到...

    jasperReport 动态合并单元格示例

    JasperReport是一款强大的Java报表工具,它允许开发者创建复杂、美观的报告,广泛应用于企业级应用的报表生成。在jasperReport中,动态合并单元格是一项重要的功能,它能够根据数据的特性和需求灵活调整表格的布局,...

    jasperreport动态表头

    要实现JasperReport的动态表头,首先需要理解报表设计的基本元素,如文本框、表格、样式和变量。动态表头通常涉及到以下步骤: 1. **设计报表模板**:使用iReport(现在已被Jaspersoft Studio取代)等设计工具,...

    jasperreport ireport开发java报表入门级教程(完整版).rar

    JasperReport的核心功能是设计和生成静态报表,而动态数据的填充则依赖于Java代码或者其他数据源。 IReport是JasperReport的官方报告设计器,提供了一个直观的GUI界面,让用户无需编写代码就能设计报表模板。用户...

    iReport 和 Jasperreport整合开发web报表向导2.doc

    完成报表设计后,可以通过 JasperReport API 将报表引入 Java 应用程序中,生成报表实例并输出为各种格式(如 PDF、HTML、Excel 等)。 9. **报表元素和属性**: iReport 提供了 "Element properties" 和 ...

    springboot整合JasperReport实现报表功能

    总的来说,SpringBoot与JasperReport的整合使得报表生成变得简单,它提供了灵活的设计工具和丰富的数据绑定能力,可以帮助开发者快速地实现复杂报表的展示需求。通过学习和掌握这一技术,你可以提升企业应用的报表...

    jasperreport 生成pdf,html,xml,csv,xls报表,myeclipse源码

    在Java应用中,jasperreport通常用于生成数据可视化的静态或交互式报表。这个源码项目是基于**MyEclipse**开发的,MyEclipse是一款集成开发环境(IDE),它是Eclipse的扩展,专门针对Java、Web和企业级应用程序的...

    JasperReport动态表头及按组分页,去掉了subreport

    在IT行业中,报表生成是数据分析和业务展示的重要环节,而JasperReport作为一款强大的开源报表工具,被广泛应用在各种项目中。本主题聚焦于“JasperReport动态表头及按组分页,去掉了subreport”,这是一个高级用法...

    基于Jasperreport动态单元格合并模板

    总结起来,JasperReport的动态单元格合并功能增强了报表的灵活性和可读性,尤其是在处理多层分组数据时。通过理解和实践提供的模板实例,开发者可以熟练掌握这一技术,为企业的数据分析和决策支持提供强有力的支持。

    利用Jasperreport+IReport进行报表开发

    JasperReport支持动态数据,允许开发者设计灵活的布局,并且可以嵌入到任何Java应用中。而IReport则是JasperReport的图形化设计工具,它提供了一个用户友好的界面,使得非程序员也能轻松创建和编辑报表模板。 首先...

    iReport 和 Jasperreport整合开发web报表向导

    设计完成后,将jrxml文件部署到Web应用服务器,与Java代码结合,通过Jasperreport API动态生成报表。在Servlet或JSP中调用报表引擎,传入数据和参数,即可在Web页面上显示报表。 9. **高级特性** - **交互式报表*...

    iReport和Jasperreport整合开发web报表向导.pdf

    iReport是一款功能强大且灵活的报表设计工具,能够与Jasperreport集成,生成精美的web报表。本文档将对iReport进行深入介绍,展示如何使用iReport设计报表、连接数据库、定义变量和参数、设置字体等。 一、iReport...

    JasperReport+ireport实现报表导出功能

    在实际开发中,JasperReport和iReport的组合使用可以帮助开发者高效地实现报表的生成和导出功能,而且由于其开源性质,可以自由定制和扩展,适用于各种项目需求。对于初学者,可以通过阅读官方文档和在线教程,快速...

    JasperReport+iReport高级报表设计实战

    JasperReport是一款强大的开源报表生成工具,而iReport则是它的可视化设计界面,降低了报表设计的复杂度。本文将深入探讨iReport的高级功能,特别是针对复杂报表设计和数据源的配置。 1. **iReport 概览** iReport...

    JasperReport+iReport报表工具

    JSP(JavaServer Pages)是一种用于生成动态网页内容的技术,JasperReport可以将报表导出为JSP页面,便于在Web环境中展示。Java是一种广泛使用的编程语言,JasperReport和iReport都是用Java编写,因此运行这些工具...

Global site tag (gtag.js) - Google Analytics