这几天本人专门对网络报表的设计及打印技术进行了调查研究,在网上收集了许多相关资料,其中ireport+jasperreport是许多相关人士的首推,因此本人对此进行了较详细的学习,下面是本人在学习ireport和jasperreport过程中碰到的一些问题及网上摘录的解决方法,希望大家阅读此文后会有所收获。
1.Jasperreport及ireport简介:
JasperReport 是一款报表打印组件,是开放源代码组织 sf.net 中的一个 java 报表打印工程,JasperReport 的最新版本是 0.5.2 版,最新版本可以从 http://jasperreports.sourceforge.net/index.html 下载得到。
iReport 也是开源组织 sf.net 中的一款免费软件,其主要作用是用来以可视化的方式设计生成 JasperReport 所使用的报表格式文件,因为 JasperReport 本身并未提供很好的可视化报表设计工具,iReport 的出现正好弥补了这个缺陷。iReport 的最新版本是 0.3.0,
iReport 可以从 http://ireport.sourceforge.net 下载得到。
2.Jasperreport及ireport的安装及配置:
Jasperreport不用另外进行安装,只需要下载JasperReport-x.x.x.jar 文件就可以了。JasperReport 的配置比较简单,直接将JasperReport-x.x.x.jar 文件添加到操作系统的环境变量 ClASSPATH 中即可完成 JasperReport 的配置。
iReport 在 Windows 平台也是以.zip 形式的文件提供的,直接解压缩后就算完成了安装。只有 2.x 版的iReport需要配置,3.0 版的iReport无需进行任何配置,直接启动时 ireport.bat 文件就可以了。
3.iReport中文显示的问题:
1)、当iReport中提示框输入中文不能正常显示时,直接将iReport下lib中的tinylaf.jar这个包删除即可。
2)、在iReport中运行报表时如果出现乱码问题时,将itext-1.02b.jar和iTextAsian.jar这两个包加到CLASSPATH即可。即加入到C:/iReport-0.3.0/lib目录中即可。
2)、在iReport中运行报表时如果出现乱码问题时,将itext-1.02b.jar和iTextAsian.jar这两个包加到CLASSPATH即可。即加入到C:/iReport-0.3.0/lib目录中即可。
3)、带有中文显示的报表:
任意画一文本框,双击它,在出现的对话框中选择 Static Text 项,修改 text 内容为汉字,如下所示:
同时,修改 FONT 项中的内容与下图相同
改动的地方有三项,一是 font name,二是 PDF font name 三是 PDF Encoding 再次预览报表即可显示中文报表。上面修改的第二和第三项在JRViewer中是看不出来效果的,如果选择报表的生成结果为PDF 格式则会体现出来。
4. 设置数据库连接
选择“data source”菜单中的“Connections/Datasources”,在打开的数据连接列表窗口中点击“new”以便新增一个数据源,JasperReport 可以使用多种数据源,可以是 JDBC 数据库连接,也可以是从 XML 文件中取数据等,以下是使用 ORACLE 中的 CH 数据库做为数据源的一个配置例子。
上例中是以 ORACLE 做为数据库的一个例子,我们还需要手工复制 ORACLE 的 JDBC 驱动文件到 iReport 的 lib 目录,复制 JDBC 驱动以外需要重新运行 iReport 才会生效。配置好数据源以后,点击“Test”按钮,如果配置没有错误,应该会出现如下所示的内容:
测试数据库连接成功后,点击“Save”按钮保存这个数据源以便完成数据源的配置。
5.JasperReport 在程序中的应用
在网上找到JasperReport 在程序中的应用的例子,现摘录如下:
1.) Servlet:
import javax.servlet.*;
import javax.servlet.http.*;
import dori.jasper.engine.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import dori.jasper.engine.*;
import java.io.*;
import java.util.*;
import java.sql.*;
/**
* @author Administrator
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class TestReport extends HttpServlet {
* @author Administrator
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class TestReport extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection conn = null;
throws ServletException, IOException {
Connection conn = null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn =
DriverManager.getConnection(
conn =
DriverManager.getConnection(
"jdbc:microsoft:sqlserver://192.168.0.10:1433;DatabaseName=am;user=sa;password=sa");
ServletContext servletContext =this.getServletContext();
File reportFile = new File(servletContext.getRealPath("test/iteminfo.jasper"));
Map parameters = new HashMap();
Integer i=new Integer(8);
parameters.put("pjId", i);
byte[] bytes =
JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
} catch (JRException jre) {
System.out.println("JRException:" + jre.getMessage());
} catch (Exception e) {
System.out.println("Exception:" + e.getMessage());
}
File reportFile = new File(servletContext.getRealPath("test/iteminfo.jasper"));
Map parameters = new HashMap();
Integer i=new Integer(8);
parameters.put("pjId", i);
byte[] bytes =
JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.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 {
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.) JSP:
<%@ page contentType="text/html;charset=GBK" %>
<%@ page import="dori.jasper.engine.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%
//数据库连接
Connection conn=null;
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://192.168.0.10:1433;DatabaseName=am;user=sa;password=
//数据库连接
Connection conn=null;
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://192.168.0.10:1433;DatabaseName=am;user=sa;password=
sa");
//取到编译后的jasper文件
File reportFile = new File(application.getRealPath("test/iteminfo.jasper"));
File reportFile = new File(application.getRealPath("test/iteminfo.jasper"));
//向报表中定义的参数赋值
Map parameters = new HashMap();
Integer i=new Integer(8);
parameters.put("pjId", i);
Map parameters = new HashMap();
Integer i=new Integer(8);
parameters.put("pjId", i);
byte[] bytes =
JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
conn
);
JasperRunManager.runReportToPdf(
reportFile.getPath(),
parameters,
conn
);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
%>
3.)如何将 PDF 格式报表结果直接输出到打印机
注:这段代码只能应用在JavaApplication中
public void print() throws UnsupportedFormatException
{
save("./tmp.pdf");
try
{
String osName = System.getProperty("os.name");
//FOR WINDOWS 95 AND 98 USE COMMAND.COM
if (osName.equals("Windows 95") || osName.equals("Windows 98"))
{
Runtime.getRuntime().exec("command.com /C start acrord32 /p " + "./tmp.pdf");
}
//FOR WINDOWS NT/XP/2000 USE CMD.EXE
else
{
Runtime.getRuntime().exec("cmd.exe /C Start acrord32 /p " + "./tmp.pdf");
}
}
catch (IOException IOE)
{
JOptionPane.showMessageDialog(null, IOE.getMessage(), "RuntimeException",
JOptionPane.ERROR_MESSAGE);
}
}
6. 以上是本人在学习Jasperreport及ireport中认为应该注意的及容易碰到的一些问题,许多解决方案是直接从网上摘录的,另外Jasperreport及ireport的软件及一些相关的学习资料,我已经将其COPY到公司的SERVER服务器暂存盘上我的个人目录下的网络报表设计子目录中,大家要是不想自己去下载,可直接到服务器上去COPY一份,同时也希望对大家有所帮助。