天天看點

Jasper6 導出Excle,PDF,World檔案

  最近一直在弄Jasper的報表,整理了一個工具類,拿來分享下

package yjkj.hospital.util;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.SimpleJasperReportsContext;
import net.sf.jasperreports.engine.export.HtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.DocxReportConfiguration;
import net.sf.jasperreports.export.PdfReportConfiguration;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleHtmlExporterConfiguration;
import net.sf.jasperreports.export.SimpleHtmlExporterOutput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.XlsxReportConfiguration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import yjkj.hospital.util.UtilKeyWord.ReportFileType;

/**
 * 報表工具類
 * @author XIONG SHIXIN
 * @since 2017年4月18日
 */
public class UtilReport {
    
    private static final Logger LOG = LoggerFactory.getLogger(UtilReport.class);
    
    /**
     * 報表檔案導出(PDF,Excle,World)
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 模闆檔案的絕對路徑<p>
     * <p>@param fileName 輸出檔案名<p>
     * <p>@param suffix 檔案字尾名<p>
     * @throws JRException +--+-************
     * @throws IOException 
     */
    public static void reportExport(HttpServletResponse response, Map<String, Object> params, String filePath, String fileName, ReportFileType suffix) throws JRException, IOException{
        try {
            switch (suffix){
            case PDF:
                pdfExport(response, params, filePath, fileName, suffix, null);
                break;
            case WORLD:
                worldExport(response, params, filePath, fileName, suffix, null);
                break;
            case EXCEL:
                excleExport(response, params, filePath, fileName, suffix, null);
                break;
            default:
                LOG.error("不支援導出此類檔案!");
                throw new JRException("不支援導出此類檔案!");
             }
        } catch (JRException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
        
    }
    
    /**
     * pdf導出方法
     * <p>@param response <p>
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 模闆檔案的絕對路徑<p>
     * <p>@param fileName 輸出檔案名<p>
     * <p>@param suffix 檔案字尾名<p>
     * <p>@param pr 輸出配置資訊<p>
     * @throws JRException
     * @throws IOException
     */
    public static void pdfExport(HttpServletResponse response, Map<String, Object> params, String filePath, String fileName, 
            ReportFileType suffix, PdfReportConfiguration pr) throws JRException, IOException{
        JasperPrint jasperPrint;
        try {
            File jasperFile = new File(filePath);
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            jasperPrint = JasperFillManager.fillReport(jasperReport, params, 
                    UtilPersistence.getConnection());
            response.setCharacterEncoding("utf-8");
            fileName = fileName + "." + suffix.toString();
            response.setHeader("Content-Disposition","attachment;" + "filename=" + 
            new String(fileName.getBytes(), "ISO-8859-1"));
            response.setContentType("application/pdf");
            JRPdfExporter pdfExporter = new JRPdfExporter();
            pdfExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            pdfExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
            if(!UvUtil.isNull(pr)){
                pdfExporter.setConfiguration(pr);
            }
            pdfExporter.exportReport();
        } catch (JRException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }
    
    /**
     * World導出方法
     * <p>@param response <p>
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 模闆檔案的絕對路徑<p>
     * <p>@param fileName 輸出檔案名<p>
     * <p>@param suffix 檔案字尾名<p>
     * <p>@param dr 輸出配置資訊<p>
     * @throws JRException
     * @throws IOException
     */
    public static void worldExport(HttpServletResponse response, Map<String, Object> params, String filePath, String fileName, 
            ReportFileType suffix, DocxReportConfiguration dr) throws JRException, IOException{
        JasperPrint jasperPrint;
        try {
            File jasperFile = new File(filePath);
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            jasperPrint = JasperFillManager.fillReport(jasperReport, params, 
                    UtilPersistence.getConnection());
            response.setCharacterEncoding("utf-8");
            fileName = fileName + "." + suffix.toString();
            response.setHeader("Content-Disposition","attachment;" + "filename=" + 
            new String(fileName.getBytes(), "ISO-8859-1"));
            response.addHeader("Content-Type", "application/x-msword");
            JRDocxExporter worldExporter = new JRDocxExporter();
            worldExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            worldExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
            if(!UvUtil.isNull(dr)){
                worldExporter.setConfiguration(dr);
            }
            worldExporter.exportReport();
        } catch (JRException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }
    
    /**
     * Excle導出方法
     * <p>@param response <p>
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 模闆檔案的絕對路徑<p>
     * <p>@param fileName 輸出檔案名<p>
     * <p>@param suffix 檔案字尾名<p>
     * <p>@param xs 輸出配置資訊<p>
     * @throws JRException
     * @throws IOException
     */
    public static void excleExport(HttpServletResponse response, Map<String, Object> params, String filePath, String fileName, 
            ReportFileType suffix, XlsxReportConfiguration xs) throws JRException, IOException{
        JasperPrint jasperPrint;
        try {
            File jasperFile = new File(filePath);
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            jasperPrint = JasperFillManager.fillReport(jasperReport, params, 
                    UtilPersistence.getConnection());
            response.setCharacterEncoding("utf-8");
            fileName = fileName + "." + suffix.toString();
            response.setHeader("Content-Disposition","attachment;" + "filename=" + 
            new String(fileName.getBytes(), "ISO-8859-1"));
            response.setContentType("application/vnd_ms-excel");
            JRXlsxExporter xlsxExporter = new JRXlsxExporter();
            xlsxExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            xlsxExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
            if(!UvUtil.isNull(xs)){
                xlsxExporter.setConfiguration(xs);
            }
            xlsxExporter.exportReport();
        } catch (JRException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }
    
    /**
     * 以HTML渲染報表
     * <p>@param response<p> 
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 檔案的絕對路徑<p>
     * <p>@param exporterConfig 輸出配置資訊<p>
     * @throws JRException 
     * @throws IOException 
     */
    public static void reportShow(HttpServletResponse response, Map<String, Object> params, String filePath, 
            SimpleHtmlExporterConfiguration exporterConfig) throws JRException, IOException{
        JasperPrint jasperPrint;
        try {
            // 設定reponse的輸出格式
            response.setCharacterEncoding("utf-8");
            File jasperFile = new File(filePath);
            // 建立JasperReport對象
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            // 填充JasperReport
            jasperPrint = JasperFillManager.fillReport(jasperReport, params,
                    UtilPersistence.getConnection());
            HtmlExporter exporter = new HtmlExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            // 設定導出類型為response.getWriter()
            exporter.setExporterOutput(new SimpleHtmlExporterOutput(response.getWriter()));
            if(!UvUtil.isNull(exporterConfig)){
                exporter.setConfiguration(exporterConfig);
            }
            exporter.exportReport();
        } catch (JRException e) {
            LOG.error("渲染報表檔案: " + filePath + "出現異常!");
            throw e;
        } catch (IOException e) {
            LOG.error("渲染報表檔案: " + filePath + "出現異常!");
            throw e;
        }
        
    }
    
    /**
     * 以HTML渲染報表
     * <p>@param response<p> 
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 檔案的絕對路徑<p>
     */
    public static void reportShow(HttpServletResponse response,
            Map<String, Object> params, String filePath) throws JRException, IOException{
        reportShow(response, params, filePath, null);
    }
    
    /**
     * 報表列印
     * <p>@param response<p> 
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 輸入檔案的絕對路徑<p>
     * <p>@param jr 輸出配置資訊<p>
     * @throws JRException 
     * @throws IOException 
     */
    public static void reportPrint(HttpServletResponse response, Map<String, Object> params,
            String filePath, JasperReportsContext jr) throws JRException{
        JasperPrint jasperPrint;
        try {
            File jasperFile = new File(filePath);
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            jasperPrint = JasperFillManager.fillReport(jasperReport, params, 
                    UtilPersistence.getConnection());
            response.setCharacterEncoding("utf-8");
            JasperReportsContext jasperReportsContext = null;
            JasperPrintManager jasperPrintManager = null;
            if(UvUtil.isNull(jr)){
                jasperReportsContext = new SimpleJasperReportsContext();
                jasperPrintManager = JasperPrintManager.getInstance(jasperReportsContext);
            }else {
                jasperPrintManager = JasperPrintManager.getInstance(jr);
            }
            jasperPrintManager.print(jasperPrint, true);
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 報表列印
     * <p>@param response<p>
     * <p>@param params 報表需要的參數<p>
     * <p>@param filePath 輸入檔案的絕對路徑<p>
     * <p>@param jr 輸出配置資訊<p>
     * @throws JRException 
     * @throws IOException 
     */
    public static void reportPrint(HttpServletResponse response, 
            Map<String, Object> params, String filePath) throws JRException{
        try {
            reportPrint(response, params, filePath, null);
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
}