要在Eclipse中开发CR报表,我首先要下载CR报表的插件Crystal Report for Eclipse Edition1.0(CR4E)
下载地址为
选择其中的手动下载(Manual Installation)大概50多M的样子。
下载好后,和安装其他的插件一样,如果没有问题的话,我们就可以在Eclipse的项目新建中看到
Create a Crystal Reports web project这个选项了,
我们选择新建一个Crystal Reports web project项目,取名为TestCR,新建完成后,项目需要jar包都会自动添加到lib目录下面。因为要涉及到数据的链接我可以自己添加相应的数据库驱动jar包。这里我添加的是SQL Server2005的jar包。
本文主要简单介绍下,如何从test数据库中student表中数据查询出来,在报表中显示出来。
因为数据来自于数据库,因此建立一个链接数据库的类:DBConn.java
package com.lyl.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConn { public static final String USERNAME="sa"; private static final String PASSWORD="123"; private static final String CONNECTION_URL = "jdbc:sqlserver://localhost:1433;databaseName=test"; private static Connection conn=null; /** * 准备一个本地线程池(为了装连接) */ private static ThreadLocal<Connection> t=new ThreadLocal<Connection>(); static{ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConn(){ //先从连接池里面拿 conn=t.get(); try { if(conn==null) { conn=DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void closeConn(){ conn=t.get(); try { if(conn!=null&& !conn.isClosed()){ conn.close(); //清空关闭的连接 t.set(null); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
其次,建立一个操作数据库的DAO类,StudentDao.java
package com.lyl.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.lyl.entity.Student; import com.lyl.utils.DBConn; public class StudentDao { public List<Student> queryAll() { Connection conn=null; PreparedStatement pst=null; List<Student> studentList=new ArrayList<Student>(); String sql="select stu.sid,stu.sname,stu.age,stu.cardid,stu.tid from dbo.Student stu"; conn=DBConn.getConn(); try { pst=conn.prepareStatement(sql); ResultSet rs=pst.executeQuery(); Student stu=null; while(rs.next()) { stu=new Student(); stu.setSid(rs.getInt("sid")); stu.setSname(rs.getString("sname")); stu.setAge(rs.getInt("age")); stu.setTid(rs.getInt("tid")); stu.setCardid(rs.getString("cardid")); studentList.add(stu); } } catch (Exception e) { DBConn.closeConn(); e.printStackTrace(); } finally{ DBConn.closeConn(); } return studentList; } }
和数据库表对应的实体类Student.java
package com.lyl.entity; public class Student { private int sid; private String sname; private int age; private String cardid; private int tid; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getCardid() { return cardid; } public void setCardid(String cardid) { this.cardid = cardid; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } }
以上全多做好后,下面的才是关键,如何与报表关联。
首先,我们可以通过,首先我们需要一个空白的报表文件,此时项目中应该在新建的时候就自动生成了一个报表文件CrystalReport1.rpt和一个CrystalReport-viewer.jsp的jsp文件,因此我们不需要新建了,可以直接用。
1、打开报表,可以看到报表中有Layout(布局),Formulas(计算公式),Data(数据),Preview(预览),Crystal Report Community等几种视图,我么打开Data视图。
2、在项目资源管理其中,选中java视图,找到要在报表显示的数据对于的实体。这里是student.java,选中student.java前面的图标,拉倒报表视图中,此时我们可以看到Student的各个字段都在报表中,选中要显示是字段,右键——insert,这时我们打Layout视图中可以看到对应的字段了,有必要调整下布局。
3、在CrystalReport-viewer.jsp添加一下代码。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib uri="/crystal-tags-reportviewer.tld" prefix="crviewer" %> <crviewer:viewer reportSourceType="reportingComponent" viewerName="Report1-viewer" reportSourceVar="Report1" isOwnPage="true"> <crviewer:report reportName="Report1.rpt" /> </crviewer:viewer> <%//Crystal Java Reporting Component (JRC) imports.%> <%-- jrcerom.jar--%> <%@page import="com.crystaldecisions.sdk.occa.report.application.*" %> <%-- rascore.jar--%> <%@page import="com.crystaldecisions.sdk.occa.report.lib.*" %> <%@page import="com.businessobjects.samples.*,java.util.*" %> <%@page import="com.lyl.dao.StudentDao,com.lyl.entity.Student" %> <% //水晶报表的位置 final String REPORT_NAME = "CrystalReport1.rpt"; %> <% String className="com.lyl.entity.Student"; String tableAlias="student"; ReportClientDocument reportDocument=new ReportClientDocument(); reportDocument.open(REPORT_NAME, 0); StudentDao stuDao=new StudentDao(); List<Student> stuList =stuDao.queryAll(); CRJavaHelper.passPOJO(reportDocument,stuList,className,tableAlias,""); %>
4、启动Tomcate,运行CrystalReport-viewer.jsp,将可以看到所有的学生信息都会在报表中显示了。