读书人

JasperReport动态生成报表报表

发布时间: 2013-03-19 17:22:05 作者: rapoo

JasperReport动态生成表格报表

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

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

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

完成效果图:


JasperReport动态生成报表报表
?
?

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

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" 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:column width="74" uuid="862eeeaf-7934-4c69-86a8-4593ec7a2916"><jr:columnHeader style="table_CH" height="60" rowSpan="1"><staticText><reportElement uuid="ab907c87-9e75-4c48-b356-51c6720d806d" x="0" y="0" width="70" 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="2" y="0" width="70" height="30"/><textElement textAlignment="Center" verticalAlignment="Middle"><font pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/></textElement><textFieldExpression><![CDATA[$F{r_id}]]></textFieldExpression></textField></jr:detailCell></jr:column><jr:column width="82" uuid="830b3444-fd13-4de5-8439-4e5bb562a74a"><jr:tableHeader height="60" rowSpan="1"/><jr:tableFooter height="60" rowSpan="1"/><jr:columnHeader style="table_CH" height="60" rowSpan="1"><staticText><reportElement uuid="ab907c87-9e75-4c48-b356-51c6720d806d" x="0" y="0" width="80" 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:columnFooter height="60" rowSpan="1"/><jr:detailCell style="table_TD" height="30" rowSpan="1"><textField><reportElement uuid="4526b26c-be8c-437f-add5-70e00e0ebece" x="0" y="0" width="80" height="30"/><textElement textAlignment="Center" verticalAlignment="Middle"><font pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/></textElement><textFieldExpression><![CDATA[$F{ord_id}]]></textFieldExpression></textField></jr:detailCell></jr:column></jr:table></componentElement></band></detail></jasperReport>

?2.后台JAVA代码:

//....String reportFilePath = httpRequest.getRealPath("/resources/reports/changeGoods.jrxml");//collection中有一个对象,这个对象里面有一个List集合字段名叫cgrlistJRDataSource dataSource = new JRBeanCollectionDataSource(collection);JasperReport report = JasperCompileManager.compileReport(reportFilePath);//生成JasperPrint 对象的时候会迭代的从数据源中获取数据。//并且为每个在当前数据源记录(data source record)中的报表字段(report field)提供value。JasperPrint jasperPrint = JasperFillManager.fillReport(report, map, dataSource);// 设置相应参数,以附件形式保存XLShttpResponse.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" name="code"><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>。。。。。。。

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

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

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

?

?

读书人网 >ASP

热点推荐