要在Eclipse中開發CR報表,我首先要下載下傳CR報表的插件Crystal Report for Eclipse Edition1.0(CR4E)
下載下傳位址為
寫道 http://diamond.businessobjects.com/node/450
選擇其中的手動下載下傳(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,将可以看到所有的學生資訊都會在報表中顯示了。