搭建第一個web項目:jasperReports+ireport制作pdf報表


一:jasperReports介紹:

  在web應用中,必須面臨大量的報表問題,即將數據庫中的數據形成報表並進行打印。傳統開發只能使用html頁面設計報表,效率低且不支持別的格式。所以jasperReports因運而生。
  jasperReports是一款強大的靈活的報表生成工具,能夠生成pdf、html和xml格式的報表,是開源的,可以免費的使用她。並且完全使用java寫成,可以用在各種java程序中(她的文檔是收費的)。

二:jar說明:

  首先,需要往項目中添加的jar文件有:

    核心包:jasperreports.jar

    生成pdf組件包:iText.jar  中文字體包:iTextAsian.jar

    apache的commons組件包。

三:ireport介紹:

  iReport是一個能夠創建復雜報表的開源項目。它100%使用Java語言編寫。是目前全球最為流行的開源報表設計器。因為jasperReports本身沒有提供很好的可視化報表設計工具,所以iReport很好的彌補了這個問題。


  下圖是自己設計的報表:其中Field和Parameters都是動態獲取。

 

 

四:代碼:

  前台通過url訪問action中的方法:

    // pdf打印
    public String myprint() throws Exception {
        InputStream in = userService.genPdf();
        ActionContext.getContext().getValueStack().set("pdfStream", in);
        ActionContext.getContext().getValueStack().set("pdfName", "用戶名單.pdf");
        return "mypdf";
    }

  service中的實現方法:

@Override
    public InputStream genPdf() {
        List<User> userLs = this.retrieveAll(null, null, null);    
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("printDate", CommonUtil.getChineseDate());
        
        return JasperUtil.exportPdfDir("materialCost.jasper", map, userLs);
    }

  JasperUtil實現方法:

package cn.itcast.oa.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 * 打印工具類
 * 
 * @author haojiahong
 * 
 * @createtime:2015-8-13 下午4:40:27
 * 
 * 
 */
public class JasperUtil {
    public static InputStream exportPdfDir(String fileName,
            Map<String, Object> maps, List<?> ls) {
        try {
            JRDataSource ds = new JRBeanCollectionDataSource(ls, false);

            String filenurl = PathUtil.getWebPath() + "ireport/" + fileName;
            InputStream file = new FileInputStream(filenurl);

            JasperPrint jasperPrint = JasperFillManager.fillReport(file, maps,
                    ds);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, out);
            return new ByteArrayInputStream(out.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

  其中的pathUtil是為了獲取使用iReport工具設計的報表xml文件,我放在了項目中的這個位置:

  pathUtil:

package cn.itcast.oa.util;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;

public class PathUtil {
    public String getWebInfPath() {
        URL url = getClass().getProtectionDomain().getCodeSource()
                .getLocation();
        String path = url.toString();

        int index = path.indexOf("WEB-INF");

        if (index == -1) {
            index = path.indexOf("classes");
        }

        if (index == -1) {
            index = path.indexOf("bin");
        }

        path = path.substring(0, index);

        if (path.startsWith("zip")) {
            path = path.substring(4);
        } else if (path.startsWith("file")) {
            path = path.substring(6);
        } else if (path.startsWith("jar")) {
            path = path.substring(10);
        }
        try {
            path = URLDecoder.decode(path, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (path.indexOf(":") < 0) {
            path = System.getProperty("file.separator") + path;
        }
        return path;
    }

    public static String getWebPath() {
        return new PathUtil().getWebInfPath();
    }

}

五:最終實現效果:

報表中的3條數據都是通過數據庫動態獲取到的,這就實現了報表的打印功能。

 

最后自己遇到的問題:

easyUI前台的彈窗是在底層頁面上的div生成的,所以一開始使用easyUI的彈窗,生成展現出來的pdf亂碼,然后改成瀏覽器打開新窗口,生成正確。

字體問題用到了simfang.ttf文件,這個需要加入到項目中的classpath中。

 


免責聲明!

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



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