欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

程序员文章站 2022-05-18 17:11:38
...

转载:https://blog.csdn.net/shiyun123zw/article/details/79166448

2.1 设计报表模板

2.1.1 在Studio中新建一个报表模板(DemoReport2),删除不需要的Band,Column Header,ColumnFooter,Summary,Background,在outline界面中选中要删除Band右键-> delete,即可删除。

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

2.1.2 在outline面板中找到Parameters,右键 -> Create Parameter,新建一个Parameter(生成一个Paramerter1)

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

 2.1.3 右键 Paramete1 -> Show Properties. 设置Name为title、Class为java.lang.String.

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

用同样的方法生成,date,name,age,dept,gender的parameter项,属性全为java.lang.String

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

2.1.4 利用组件面板(Palette)中的组件设计模板。

选取Static Text组件拖动到Detail Band中,写入“NAME:”,可以设置字体,大小。

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

点击 “NAME”显示Properties.在Appearance中可以设置组件的宽高,和组件在模板上的位置。

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

在Properties.的Borders中可以设置组件的边框:

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

将 outline面板中Parameters下的name,拖动到Detail 面板中,通过修改该组件的Properties属性,设置位置和大小,设置边框。

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

2.1.5 通过以上步骤,设计其他parameter属性,设计报表模板如下:

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

2.1.6 保存模板,并Preview

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

结果如图:

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

2.2 通过Java程序,使用Map作为数据源生成报表

 

2.2.1 新建web项目,在下载的jasperreport包的\jasperreports-6.4.1\dist目录下,找到三个jar包引入到项目中。

 

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

 

2.2.2 新建servlet,(这里为JasperServlet),doGet内容如下:

省略:代码下面有全部的

在这里可以发现,parametes作为数据源在程序中是一个Map集合。对应模板中Paramters,并且map的key与模板中Parameters属性的名字一致,map的value的数据类型与模板Parameters属性设置的数据类型保持一致。所以,在设计模板时要注意,Parameters命名不能重复,且设置数据类型时也要留心。

.jsaper文件:由JRXML模板编译生成的二进制文件,用于代码填充数据

在studio中找到.jrxml文件右键 -> Compile Report ,即可生成.Jasper文件,

将生成的DemoReport2.jasper文件放入WebRoot下新建的jasper文件夹中。

2.2.3 报表的生成流程

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

2.2.4 将web工程放入tonmcat中,启动并访问。

 

Jasperreports+jaspersoft studio学习教程(二)- 使用Parameters属性传入Map数据源填充报表并解决中文不显示问题

 

访问成功了,但是中文却并未显示也解决了。

代码如下:

该项目是Maven项目:

项目结构图如下:

pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>JasperReports</groupId>
  <artifactId>JasperReports02</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>JasperReports02 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>  
	    <groupId>net.sf.jasperreports</groupId>  
	    <artifactId>jasperreports</artifactId>  
	    <version>5.6.0</version>  
	</dependency> 
	
	<!-- 解决中文乱码 -->
	<dependency> 
	    <groupId>com.lowagie</groupId>
	    <artifactId>itextasian</artifactId>
	    <version>1.5.2</version>
	</dependency>
	
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>servlet-api</artifactId>
	    <version>2.5</version>
	</dependency>
    
  </dependencies>
  <build>
    <finalName>JasperReports02</finalName>
  </build>
</project>

JasperServlet.java

package com.accord.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

public class JasperServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public JasperServlet() {
        super();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//map作为报表数据源
    	Map<String,Object> parameters = new HashMap<String, Object>();
    	parameters.put("Parameter1", "李思思");
    	parameters.put("Parameter2", "26");
    	
    	ServletContext context = this.getServletConfig().getServletContext(); 	
		
		try {
			//JasperCompileManager.compileReportToFile("E:/report/DbReport.jrxml");
			JasperCompileManager.compileReportToFile(context.getRealPath("/jasper/DemoReport02.jrxml"));
		} catch (JRException e1) {
			e1.printStackTrace();
		}//编译jrxml文件,生成jasper文件

		File reportFile = new File(context.getRealPath("/jasper/DemoReport02.jasper"));
		if (!reportFile.exists())
			throw new JRRuntimeException("FileWebappReport.jasper "
					+ "not found. The report design must be compiledfirst.");
		FileInputStream isRef = new FileInputStream(reportFile);
		ServletOutputStream sosRef = response.getOutputStream();
		try {
			JasperRunManager.runReportToPdfStream(isRef, sosRef, parameters,new JREmptyDataSource());
			response.setContentType("application/pdf");
		} catch (Exception e) {
		}finally{
			sosRef.flush();
			sosRef.close();
		}
		
	}

}

DemoReport02.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0  -->
<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="DemoReport02" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="80a35798-9752-47fd-b0e3-a07b41b5659f">
	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
	<parameter name="Parameter1" class="java.lang.String"/>
	<parameter name="Parameter2" class="java.lang.String"/>
	<queryString>
		<![CDATA[]]>
	</queryString>
	<background>
		<band splitType="Stretch"/>
	</background>
	<title>
		<band height="79" splitType="Stretch"/>
	</title>
	<pageHeader>
		<band height="35" splitType="Stretch"/>
	</pageHeader>
	<detail>
		<band height="79" splitType="Stretch">
			<textField>
				<reportElement x="382" y="10" width="100" height="30" uuid="7e7e2368-44e6-42eb-a753-8bcc9e2bafd7"/>
				<textElement>
				   <font fontName="宋体" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
				</textElement>
				<textFieldExpression><![CDATA[$P{Parameter2}]]></textFieldExpression>
			</textField>
			<staticText>
				<reportElement x="281" y="10" width="101" height="16" uuid="5b87c7e4-73fd-4ef1-bc23-3a35d9785860"/>
				<box>
					<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
				</box>
				<textElement>
				   <font fontName="宋体" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
				</textElement>
				<text><![CDATA[年龄:]]></text>
			</staticText>
			<textField>
				<reportElement x="180" y="6" width="100" height="30" uuid="c21f6fca-dd97-4ce9-9186-d9144abf173c"/>
				<textElement>
				   <font fontName="宋体" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
				</textElement>
				<textFieldExpression><![CDATA[$P{Parameter1}]]></textFieldExpression>
			</textField>
			<staticText>
				<reportElement x="80" y="10" width="100" height="16" uuid="914d0eff-4a06-438f-8010-c80f2c52d77b"/>
				<box>
					<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
					<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
				</box>
				<textElement>
				   <font fontName="宋体" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
				</textElement>
				<text><![CDATA[姓名:]]></text>
				
			</staticText>
		</band>
	</detail>
	<pageFooter>
		<band height="54" splitType="Stretch"/>
	</pageFooter>
</jasperReport>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
  	<servlet-name>JasperServlet</servlet-name>
  	<display-name>JasperServlet</display-name>
  	<description></description>
  	<servlet-class>com.accord.servlet.JasperServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>JasperServlet</servlet-name>
  	<url-pattern>/JasperServlet</url-pattern>
  </servlet-mapping>
</web-app>

访问路径:http://localhost:8080/JasperReports02/JasperServlet

我的解决中文不显示和乱码问题方案如下:


<textElement>
   <font fontName="宋体" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
</textElement>