jasperreports+iReport+jatoolsPrinter制作報表筆記


此文章是基於  EasyUI+Knockout實現經典表單的查看、編輯

 

一. 准備工作

  1. 點擊此下載相關的文件,並把 ims 文件夾放到 ims 工程對應的路勁下

  2. 參考網址:傑創打印控件

 

二. 安裝ant  

  1. 解壓apache-ant-1.9.4-bin到任意地方  

  2. 配置環境變量ANT_HOME為apache-ant-1.9.4-bin解壓后的目錄地址,如D:\Download\apache-ant-1.9.4  

  3. 在環境變量CLASSPATH中加入%ANT_HOME%\lib;  

  4. 在環境變量Path中加入%ANT_HOME%\bin;  

  5. 在cmd下測試ant是否安裝正確,命令:ant -version     安裝成功顯示ant的版本號,出錯,自己網上查

 

三. 安裝iReport,制作報表的工具  

  1. 直接雙擊iReport-5.6.0-windows-installer.exe進行安裝

 

四. jasperreports源碼與例子  

  1. 解壓jasperreports-5.6.0-project.zip  

  2. 在含有build.xml文件的目錄執行ant -p 命令可查看可執行哪些ant命令  

  3. /jasperreports-5.6.0/src下是源碼,可在/jasperreports-5.6.0/目錄下執行ant jar來編譯源代碼,

    最后在/jasperreports-5.6.0/dist/下生成jasperreports-5.6.0.jar包

  4. /jasperreports-5.6.0/demo/samples/下是實例  

  5. /jasperreports-5.6.0/demo/samples/webapp/下是標准的實例,可在其目錄下執行ant war命令生成war包,可在tomcat下直接部署運行  

 

五. 制作一張報表  

      iReport設計報表應注意:在含有中文的地方,設置如下,防止pdf導出中文無法顯示:    

      Font  name:    宋體 (中文字體)        

      PDF font name:   STSong-Light        

      PDF  Encoding:  UniGB-UCS2-H(Chinese Siplified)        

      PDF   Embeded: √

 

六. 報表在項目中的應用  

  1. 將制作好的報表(以jrxml結尾的文件)拷貝到\WebContent\report\jasperreport\ 目錄下  

  2. jasperreports-5.6.0-project 的 lib 和 dist 目錄下可找到如下jar包:

groovy-all-2.0.1.jar
iText-2.1.7.js2.jar
iTextAsian.jar
jackson-annotations-2.1.4.jar
jackson-core-2.1.4.jar
jackson-databind-2.1.4.jar
jasperreports-5.6.0.jar
View Code

  3. 添加報表的數據源類

    BaseJRDataSource.java,數據源接口  

package com.ims.interfaces.report.datasource;

import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;

public interface BaseJRDataSource extends JRDataSource{
    public JRDataSource getInstance(Map parameters);
    public Map<String,Object> getReportParams(Map parameters);
}
View Code

    ReceiveDataSource.java,材料收料單報表的數據源類

package com.ims.interfaces.report.datasource.mms;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.ims.interfaces.report.datasource.BaseJRDataSource;
import com.ims.service.mms.ReceiveBS;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

public class ReceiveDataSource implements BaseJRDataSource{
    @Autowired
    private ReceiveBS receiveBS;
    
    private List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
    private int index = -1;
    
    @Override
    public Object getFieldValue(JRField field) throws JRException {
        Object value = null;        
        String fieldName = field.getName();
        
        if ("billNo".equals(fieldName)){
            value = data.get(index).get("billNo");
        }else if ("rownum".equals(fieldName)){
            value = index+1;
        }else if ("supplierName".equals(fieldName)){
            value = data.get(index).get("supplierName");
        }else if ("warehouseName".equals(fieldName)){
            value = data.get(index).get("warehouseName");
        }else if("receiveDate".equals(fieldName)){
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            value = (null!=data.get(index).get("receiveDate")?formatter.format(data.get(index).get("receiveDate")):"");
        }else if("totalMoney".equals(fieldName)){
            value = data.get(index).get("totalMoney");
        }
        
        return value;
    }

    @Override
    public boolean next() throws JRException {
        index++;
        return (index < data.size());
    }

    @Override
    public JRDataSource getInstance(Map parameters) {
        data = receiveBS.findPage(parameters).getRows();
        index = -1;
        return this;
    }

    @Override
    public Map<String, Object> getReportParams(Map parameters) {
        parameters.put("dataCount", data.size());
        return parameters;
    }

}
View Code

  4. applicationInterface.xml,在spring的配置文件中添加數據源類的bean  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">  
    
    <!-- jasperreport -->
    <bean id="mmsReceiveDataSource" class="com.ims.interfaces.report.datasource.mms.ReceiveDataSource" />
    <!-- jasperreport -->
</beans>
View Code

  5. showReport.jsp,報表顯示頁面;打印控件采用jatoolsPrinter.cab,需要tomcat服務以進程的方式啟動 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp" %>
<%@ page import="com.ims.common.ServiceLocator" %>
<%@ page import="com.ims.interfaces.report.datasource.BaseJRDataSource" %>
<%@ page import="net.sf.jasperreports.engine.*" %>
<%@ page import="net.sf.jasperreports.engine.util.*" %>
<%@ page import="net.sf.jasperreports.engine.export.*" %>
<%@ page import="net.sf.jasperreports.j2ee.servlets.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="com.alibaba.fastjson.JSONObject" %>
<%
    String report = request.getParameter("jasper");
    String dataSource = request.getParameter("ds");
    String args = request.getParameter("args");
    String fileName = new String(request.getParameter("fileName").replaceAll(" ", "").getBytes("utf-8"),"iso8859-1");
    Map parameters = new HashMap();
    
    JSONObject jsonMap = JSONObject.parseObject(args);  
    Iterator<String> it = jsonMap.keySet().iterator();  
    while(it.hasNext()) {  
        String key = (String)it.next();   
        parameters.put(key, jsonMap.get(key));
    }  

    String appmap = request.getContextPath();

    File reportFile = new File(application.getRealPath("/report/jasperreport/"+report+".jasper"));
    if (!reportFile.exists()){
        JasperCompileManager.compileReportToFile(application.getRealPath("/report/jasperreport/"+report+".jrxml"));
        reportFile = new File(application.getRealPath("/report/jasperreport/"+report+".jasper"));
    }

    JasperReport jasperReport = (JasperReport)JRLoader.loadObjectFromFile(reportFile.getPath());
    BaseJRDataSource  baseJRDataSource=    ((BaseJRDataSource)ServiceLocator.getService(dataSource));
    JRDataSource jRDataSource = baseJRDataSource.getInstance(parameters);
    JasperPrint jasperPrint = 
            JasperFillManager.fillReport(
                jasperReport, 
                baseJRDataSource.getReportParams(parameters), 
                jRDataSource
            );
    
    session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
    
    int pageIndex = 0;
    int lastPageIndex = 0;
    if (jasperPrint.getPages() != null){
        lastPageIndex = jasperPrint.getPages().size() - 1;
    }

    String pageStr = request.getParameter("page");
    try{
        pageIndex = Integer.parseInt(pageStr);
    }
    catch(Exception e){}
    
    if (pageIndex < 0){
        pageIndex = 0;
    }

    if (pageIndex > lastPageIndex){
        pageIndex = lastPageIndex;
    }
    
    HtmlExporter exporter = new HtmlExporter();    
    StringBuffer sbuffer = new StringBuffer();

    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sbuffer);
    exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "../servlets/image?image=");
    //exporter.setParameter(JRExporterParameter.PAGE_INDEX, Integer.valueOf(pageIndex));
    exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, "");
    exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
    exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, "");

    exporter.exportReport();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title>報表</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <%@ include file="/common/basePath.jsp"%>
  <style type="text/css">
    a {text-decoration: none}
  </style>
  <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0" width="0" height="0"></OBJECT>
</head>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<table id=titleTable width=100% cellspacing=0 cellpadding=0 border=0 ><tr>
    <td height="25" width=100% valign="middle"  style="font-size:13px" background="content/images/toolbar/toolbar-bg.gif">
        <table width="100%">
            <tr >                
                <td width="100%" align="right" valign="middle"   style="font-size:12px; line-height:12px; margin:3px 0 0 0 ;" >&nbsp;
                <span style=" margin:0 10px 0 0 ; padding:5px 0 0 0 ; background: url('content/images/toolbar/toolbar-line.gif') no-repeat right top;">
                <a href="#" onClick="doPrint('printPreview');return false;"><img src='content/images/icon/icon/printer.png' border=no ></a>
                <!--  
                <a href="<%=appmap%>/servlets/xls?fileName=<%=fileName %>" target="_blank"><img src='content/images/icon/doc/xls.gif' border=no ></a>
                -->
                <a href="<%=appmap%>/servlets/pdf" target="_blank"><img src='content/images/icon/doc/pdf.gif' border=no ></a>
                <a href="<%=appmap%>/servlets/docx?fileName=<%=fileName %>" target="_blank"><img src='content/images/icon/doc/doc.gif' border=no ></a>
                </span>
                <!-- 
                <%
                    if (pageIndex > 0){
                %>
                <a href='showReport.jsp?page=0&jasper=<%= report%>&ds=<%= dataSource%>&args=<%= args%>'><img src="../resource/image/common/firstpage.gif" border="0"></a>
                <a href='showReport.jsp?page=<%=pageIndex - 1%>&jasper=<%= report%>&ds=<%= dataSource%>&args=<%= args%>'><img src="../resource/image/common/prevpage.gif" border="0"></a>
                <%
                    }else{
                %>
                <img src="../resource/image/common/firstpage.gif" border="0">
                <img src="../resource/image/common/prevpage.gif" border="0">
                <%
                    }
                    if (pageIndex < lastPageIndex){
                %>
                <a href='showReport.jsp?page=<%=pageIndex + 1%>&jasper=<%= report%>&ds=<%= dataSource%>&args=<%= args%>'><img src="../resource/image/common/nextpage.gif" border="0"></a>
                <a href='showReport.jsp?page=<%=lastPageIndex%>&jasper=<%= report%>&ds=<%= dataSource%>&args=<%= args%>'><img src="../resource/image/common/lastpage.gif" border="0"></a>
                <%
                    }else{
                %>
                <img src="../resource/image/common/nextpage.gif" border="0">
                <img src="../resource/image/common/lastpage.gif" border="0">
                <%
                    }
                %>
                &nbsp;&nbsp;第<%=pageIndex+1 %>頁/共<%=jasperPrint.getPages().size() %>頁
                 -->
                </td>
            </tr>
      </table>
    </td>
</table>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<td align="center">
<%=sbuffer.toString()%>
</td>
<script type="text/javascript">
function doPrint(how)
{   
    //打印文檔對象
    var myDoc ={ 
        documents: document,    // 打印頁面(div)們在本文檔中
        copyrights :    '傑創軟件擁有版權  www.jatools.com'      // 版權聲明,必須 
    };
         
    // 調用打印方法
    if(how == 'printPreview')
        jatoolsPrinter.printPreview(myDoc);  // 打印預覽                
    else if(how == 'printDialog')
        jatoolsPrinter.print(myDoc ,true);   // 打印前彈出打印設置對話框              
    else
        jatoolsPrinter.print(myDoc ,false);  // 不彈出對話框打印
}
</script>

</table>
</body>
</html>
View Code

  6. web.xml,若要支持pdf、img、excel、doc導出,需添加servlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 3     xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" 
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 5     version="2.4">
 6 
 7   <servlet>
 8     <servlet-name>PdfServlet</servlet-name>
 9     <servlet-class>net.sf.jasperreports.j2ee.servlets.PdfServlet</servlet-class>
10   </servlet>
11   <servlet>
12     <servlet-name>ImageServlet</servlet-name>
13     <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
14   </servlet>
15   <servlet>
16     <servlet-name>XlsServlet</servlet-name>
17     <servlet-class>net.sf.jasperreports.j2ee.servlets.XlsServlet</servlet-class>
18   </servlet>
19   <servlet>
20     <servlet-name>DocxServlet</servlet-name>
21     <servlet-class>net.sf.jasperreports.j2ee.servlets.DocxServlet</servlet-class>
22   </servlet>
23 
24   <servlet-mapping>
25     <servlet-name>PdfServlet</servlet-name>
26     <url-pattern>/servlets/pdf</url-pattern>
27   </servlet-mapping>
28   <servlet-mapping>
29     <servlet-name>ImageServlet</servlet-name>
30     <url-pattern>/servlets/image</url-pattern>
31   </servlet-mapping>
32   <servlet-mapping>
33     <servlet-name>XlsServlet</servlet-name>
34     <url-pattern>/servlets/xls</url-pattern>
35   </servlet-mapping>
36   <servlet-mapping>
37     <servlet-name>DocxServlet</servlet-name>
38     <url-pattern>/servlets/docx</url-pattern>
39   </servlet-mapping>
40 
41 </web-app>
View Code

  7. report.js

/***
 * 參數說明:{jasper:"report01.jasper",args:arr}
 * param.jasper:jasper文件名稱,最好不要用中文
 * param.ds:dataSource文件名稱,最好不要用中文
 * param.args:*格式待定*,暫時用數組,以后看使用什么格式方便可以再改
 * author: suxy.
 */
function openReport(win, param){
    var strFullPath = window.document.location.href;
    var strPath = window.document.location.pathname;
    var pos = strFullPath.indexOf(strPath);
    var prePath = strFullPath.substring(0, pos);
    var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1);
    var url = postPath;

       if(!param.jasper){
           alert("jasper參數為空!");
           return false;
       }
       
    //彈出報表展示窗口,可選擇更多的功能,不只是打印,還有導出excel等等
    url+="/report/common/showReport.jsp?jasper="+param.jasper+"&ds="+param.ds+"&args="+param.args;
    url=encodeURI(url);
    //打開新窗口
//    var win=window.open("about:blank");
    win.document.write("報表加載中,請稍候..");
    //創建form對象
    var win_form=win.document.createElement("form");
    win_form.action=url;
    win_form.method="POST";
    win.document.body.appendChild(win_form);
    //參數設置(創建input對象)
    var win_form_input=win.document.createElement("input");
    win_form_input.type="hidden";
    win_form_input.name='fileName';
    win_form_input.value=param.fileName;
    win_form.appendChild(win_form_input);
    //提交表單
    win_form.submit();
}
View Code

 

七. 效果展示

  訪問:http://localhost:8080/ims/mms/receive.do,點擊 打印 按鈕

  右上角的按鈕可以實現打印、pdf導出、word導出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM