报表是基于web的oa的重要组成部分。我做报表经历了三个阶段。
最早是把报表直接在ie里输出,这是一种比较土的做报表的方法。这样做逻辑上简
单。只是客户在使用的时候不太方便。因为有的报表输出结果后,客户需要修改,比如删
除其中某些行,某些列。为此我用javascript写了一段很长的代码,用以让客户定制输出
的列,根据他的选择输出不同的列。至于有的客户需要删除某些行。我建议客户把ie里输
出的报表全部拷贝到elxcel里,在那里编辑打印。
用ireport做报表。
学写ierport做报表,我花了一个星期。这确实是个不错的报表工具。因为某些原因,我必须使
用jdk1.3.1所以选择了与之兼容性比较好但版本比较底的ireport0.1.0。但是遇到些问
题。比如,在ireport里画表格是用线条工具。在设计版面上有各种band,每个band都划
分了一定位置。如果我在一个区域比如column header里画的线条不小心超出到了detail
里,那么在报表编译输出时竖线就不能输出,所以我觉得在ireport里画表格不太方
便。我同时也怀疑是不是我用的工具版本太低?用ireport还有个问题,客户端要装
adobe acrbat reader才可以看到报表。我想用ireport做饼状图柱状图一类,没成功。
用jsp文件调用ireport生成的.jasper文件总是弹出对话框问是否打开或者下载,我打开后是乱
码,下载后也是乱码。据说是adobe reader的问题,换了ie和adobe reader的版本都不
行,郁闷ing。
改用servlet调用.jasper文件。用adobe reader6.0还是不行,可能是我jsper.jar版本太低,改成了
adobe reader4.0成功了。具体的例子
jsp调用:Test.jsp文件
〈%@ page import="dori.jasper.engine.*" %>
〈%@ page import="java.util.*" %>
〈%@ page import="java.io.*" %>
〈%@ page import="java.sql.*" %>
〈%
java.sql.Connection sqlCon; //数据库连接对象
java.lang.String strCon; //数据库连接字符串
//装载JDBC驱动程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//设置数据库连接字符串
strCon ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah" ;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","sa");
File reportFile = new File(application.getRealPath("/reports/test1.jasper"));
out.println(reportFile.getPath());
out.println(sqlCon);
Map parameters = new HashMap();
parameters.put("ReportTitle", "p");
byte[] bytes = JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
sqlCon
);
out.println(bytes.length);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
%>
servlet调用:TestReport.java
import javax.servlet.*;
import javax.servlet.http.*;
import dori.jasper.engine.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class TestReport extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
Connection conn = null;
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah","sa", "sa");
ServletContext servletContext = this.getServletContext();
File reportFile = new File(servletContext.getRealPath("/reports/test1.jasper"));
Map parameters = new HashMap();
String myname = new String("lxd");
parameters.put("Name",myname);
System.out.println(myname);
System.out.println("hello");
byte[] bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
outputStream.close();
}catch(JRException jre){
System.out.println("JRException:"+jre.getMessage());
}catch(Exception e){
System.out.println("Exception:"+e.getMessage());
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doGet(request,response);
}
}
把报表直接输出到word
我认为这是采用web方式的OA做报表的好方式。制作简单,只要修改原jsp文件,
把输出方式该成调用word就行。
那么输出的报表直接调用word,运行是会弹出对话框问是否打开还是保存,选择打开,ie就直接调用word,
那客户就可以在word里直接编辑输出的报表了。
jsp文件修改的地方:〈%@ page contentType="application/msword;charset=gb2312" %> 就是修改contentType的值。
例子:mytest.jsp
〈%@ page contentType="application/msword;charset=gb2312" %>
〈%@ page import="java.sql.*" %>
〈html>
〈head>
〈title>报表>〈/title>
〈/head>
〈body bgcolor="#FFFFFF">
〈center>〈h1>报表〈/h1>〈/center>
〈table border=1 cellspacing=0 cellpadding=0 bordercolor=#000000 align=center>
〈tr>
〈td>用户名〈/td>
〈td>真实姓名〈/td>
〈td>性别〈/td>
〈/tr>
〈%
java.sql.Connection sqlCon; //数据库连接对象
java.lang.String strCon; //数据库连接字符串
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//连接user数据库
strCon ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah" ;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","sa");
Statement stmt=sqlCon.createStatement();
ResultSet rs=stmt.executeQuery("select * from kenoahuser ");
//查询user表
while(rs.next()){
%>
〈tr>
〈td>〈%= rs.getString("fullname") %>〈/td>
〈td>〈%= rs.getString("mobile") %>〈/td>
〈td>〈%= rs.getString("workemail") %>〈/td>
〈/tr>
〈%
}
%>
〈%
rs.close();
stmt.close();
sqlCon.close();
%>
〈/table>
最早是把报表直接在ie里输出,这是一种比较土的做报表的方法。这样做逻辑上简
单。只是客户在使用的时候不太方便。因为有的报表输出结果后,客户需要修改,比如删
除其中某些行,某些列。为此我用javascript写了一段很长的代码,用以让客户定制输出
的列,根据他的选择输出不同的列。至于有的客户需要删除某些行。我建议客户把ie里输
出的报表全部拷贝到elxcel里,在那里编辑打印。
用ireport做报表。
学写ierport做报表,我花了一个星期。这确实是个不错的报表工具。因为某些原因,我必须使
用jdk1.3.1所以选择了与之兼容性比较好但版本比较底的ireport0.1.0。但是遇到些问
题。比如,在ireport里画表格是用线条工具。在设计版面上有各种band,每个band都划
分了一定位置。如果我在一个区域比如column header里画的线条不小心超出到了detail
里,那么在报表编译输出时竖线就不能输出,所以我觉得在ireport里画表格不太方
便。我同时也怀疑是不是我用的工具版本太低?用ireport还有个问题,客户端要装
adobe acrbat reader才可以看到报表。我想用ireport做饼状图柱状图一类,没成功。
用jsp文件调用ireport生成的.jasper文件总是弹出对话框问是否打开或者下载,我打开后是乱
码,下载后也是乱码。据说是adobe reader的问题,换了ie和adobe reader的版本都不
行,郁闷ing。
改用servlet调用.jasper文件。用adobe reader6.0还是不行,可能是我jsper.jar版本太低,改成了
adobe reader4.0成功了。具体的例子
jsp调用:Test.jsp文件
〈%@ page import="dori.jasper.engine.*" %>
〈%@ page import="java.util.*" %>
〈%@ page import="java.io.*" %>
〈%@ page import="java.sql.*" %>
〈%
java.sql.Connection sqlCon; //数据库连接对象
java.lang.String strCon; //数据库连接字符串
//装载JDBC驱动程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//设置数据库连接字符串
strCon ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah" ;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","sa");
File reportFile = new File(application.getRealPath("/reports/test1.jasper"));
out.println(reportFile.getPath());
out.println(sqlCon);
Map parameters = new HashMap();
parameters.put("ReportTitle", "p");
byte[] bytes = JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
sqlCon
);
out.println(bytes.length);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
%>
servlet调用:TestReport.java
import javax.servlet.*;
import javax.servlet.http.*;
import dori.jasper.engine.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class TestReport extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
Connection conn = null;
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah","sa", "sa");
ServletContext servletContext = this.getServletContext();
File reportFile = new File(servletContext.getRealPath("/reports/test1.jasper"));
Map parameters = new HashMap();
String myname = new String("lxd");
parameters.put("Name",myname);
System.out.println(myname);
System.out.println("hello");
byte[] bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
outputStream.close();
}catch(JRException jre){
System.out.println("JRException:"+jre.getMessage());
}catch(Exception e){
System.out.println("Exception:"+e.getMessage());
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doGet(request,response);
}
}
把报表直接输出到word
我认为这是采用web方式的OA做报表的好方式。制作简单,只要修改原jsp文件,
把输出方式该成调用word就行。
那么输出的报表直接调用word,运行是会弹出对话框问是否打开还是保存,选择打开,ie就直接调用word,
那客户就可以在word里直接编辑输出的报表了。
jsp文件修改的地方:〈%@ page contentType="application/msword;charset=gb2312" %> 就是修改contentType的值。
例子:mytest.jsp
〈%@ page contentType="application/msword;charset=gb2312" %>
〈%@ page import="java.sql.*" %>
〈html>
〈head>
〈title>报表>〈/title>
〈/head>
〈body bgcolor="#FFFFFF">
〈center>〈h1>报表〈/h1>〈/center>
〈table border=1 cellspacing=0 cellpadding=0 bordercolor=#000000 align=center>
〈tr>
〈td>用户名〈/td>
〈td>真实姓名〈/td>
〈td>性别〈/td>
〈/tr>
〈%
java.sql.Connection sqlCon; //数据库连接对象
java.lang.String strCon; //数据库连接字符串
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//连接user数据库
strCon ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=kenoah" ;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","sa");
Statement stmt=sqlCon.createStatement();
ResultSet rs=stmt.executeQuery("select * from kenoahuser ");
//查询user表
while(rs.next()){
%>
〈tr>
〈td>〈%= rs.getString("fullname") %>〈/td>
〈td>〈%= rs.getString("mobile") %>〈/td>
〈td>〈%= rs.getString("workemail") %>〈/td>
〈/tr>
〈%
}
%>
〈%
rs.close();
stmt.close();
sqlCon.close();
%>
〈/table>