JasperReports导出多个报表并打包zip文件

配置文件baobiao.properties:

#export file path
basePath=D:\\zip\\
#single report file name
reportName1=\u5168\u6C11\u4ED8\u5BA2\u6237\u7AEF\u7EDF\u8BA1\u8868.html
reportName2=\u5168\u6C11\u4ED8\u5F53\u65E5\u4EA4\u6613\u6D41\u6C34.html
#report file path
reportFilePath1=reports\\baobiaozsorder.jasper
reportFilePath2=reports\\qmfDayTransaction.jasper

读取配置文件类PropertiesReader:

public static Properties getPropertyFileContent(){
        Properties props = new Properties();
        try {
            prop.load(PropertiesReader.class.getClassLoader().getResourceAsStream("baobiao.properties"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return props;
    }

controller方法:

    @RequestMapping(value = "/download.do", method = RequestMethod.POST)
    public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Properties props = PropertiesReader.getPropertyFileContent();
        Set<Entry<Object, Object>> set = props.entrySet();
        //计数,生成报表数量
        int count = 0;
        //单个报表名称
        //String reportName1 = "全民付客户端统计表.html", reportName2 = "全民付当日交易流水.html";
        List<String> reportNames = new ArrayList<String>();
        //报表模板文件存放目录
        //String reportFilePath1 = "reports\\baobiaozsorder.jasper", reportFilePath2 = "reports\\qmfDayTransaction.jasper";
        List<String> reportFilePaths = new ArrayList<String>();
        for (Entry<Object, Object> entry : set) {
            String key = entry.getKey().toString();
            String value = entry.getValue().toString();
            if(key.contains("reportName")){
                reportNames.add(value);
                count++;
            }
            if(key.contains("reportFilePath")){
                reportFilePaths.add(value);
            }
        }
        // 设置压缩包名称
        String fileName = "报表-" + CommonUtil.getTodayStr() + ".zip";
        //检查是否已下载
        //报表压缩文件存放目录
        String basePath = props.getProperty("basePath");
                //"D:\\zip\\";
        String filePath = basePath + fileName;
        File file = new File(filePath);
        if(!file.exists()){
            List<OutputStream> oss = new ArrayList<OutputStream>();
            Connection con = null;
            try {
                con = dataSource.getConnection();
                for (int i = 0; i < count; i++) {
                    OutputStream os = GenerateReport.baobiao(reportFilePaths.get(i), con);
                    oss.add(os);
                }
            } catch (Exception e1) {
                logger.error("报表生成出现错误", e1);
            } finally{
                try {
                    for (int i = 0; i < oss.size(); i++) oss.get(i).flush();
                    con.close();
                } catch (Exception e) {}
            }
            OutputStream os = null;
            CheckedOutputStream cos = null;
            ZipOutputStream zipOut = null;
            try {
                os = response.getOutputStream();
                response.setContentType("application/octet-stream;charset=UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                        + new String(fileName.getBytes("gb2312"), "iso8859-1"));
                // 对输出文件做CRC32校验
                cos = new CheckedOutputStream(os, new CRC32());
                zipOut = new ZipOutputStream(cos);
                // 设置编码
                zipOut.setEncoding("UTF-8");
                // 将单个文件的流添加到压缩文件中
                for (int i = 0; i < count; i++) {
                    GenerateReport.compressFile(oss.get(i), zipOut, reportNames.get(i));
                }
                /**
                 * zip写入磁盘
                 */
                zipOut.flush();zipOut.close();
                os.flush();
                os = new FileOutputStream(new File(filePath));
                zipOut = new ZipOutputStream(os);
                // 设置编码
                zipOut.setEncoding("UTF-8");
                // 将单个文件的流添加到压缩文件中
                for (int i = 0; i < count; i++) GenerateReport.compressFile(oss.get(i), zipOut, reportNames.get(i));
            } catch (Exception e) {
                logger.error("报表打包出现错误", e);
            } finally {
                try {
                    zipOut.flush();zipOut.close();
                    cos.close();
                    os.close();
                    for (int i = 0; i < oss.size(); i++) oss.get(i).close();
                } catch (IOException e) {}
            }
        }else{
            FileInputStream is = null;
            OutputStream os = null;
            int buffer = 1024 * 2;
            try {
                os = response.getOutputStream();
                response.setContentType("application/octet-stream;charset=UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                        + new String(fileName.getBytes("gb2312"), "iso8859-1"));
                is = new FileInputStream(file);
                byte[] data = new byte[buffer];
                int len = -1;
                while ((len = is.read(data, 0, buffer)) != -1) {
                    os.write(data, 0, len);
                }
            }catch (Exception e) {
                logger.error("报表打包出现错误", e);
            } finally {
                try {
                    os.close();
                    is.close();
                } catch (IOException e) {}
            }
        }
    }

辅助工具类GenerateReport:

package com.buybal.ums.mgr.util;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class GenerateReport {

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static Log log = LogFactory.getLog(GenerateReport.class);

    /**
     * 使用jspaer文件创建报表
     * @param reportFilePath    模板位置
     * @param con    数据源连接
     * @return    返回流
     * @throws JRException
     * @throws ClassNotFoundException
     * @throws SQLException
     * @throws IOException
     */
    public static OutputStream baobiao(String reportFilePath, Connection con) throws JRException,
            ClassNotFoundException, SQLException, IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintWriter writer = new PrintWriter(os);
        JRHtmlExporter exporter = new JRHtmlExporter();
        JasperPrint jasperPrint = null;
        InputStream inputStream = GenerateReport.class.getClassLoader()
                .getResourceAsStream(reportFilePath);
        Map<String, Object> parameters = new HashMap<String, Object>();// 传入参数
        parameters.put("reportTitle", "我的第一个程序");
        jasperPrint = JasperFillManager
                .fillReport(inputStream, parameters, con);
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, writer);
        exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,Boolean.FALSE);
        exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "GBK");
        exporter.exportReport();
        /*
         * JasperExportManager.exportReportToHtmlFile( jasperPrint,
         * "D:\\baobiaozsorderJasperReport" + simpleDateFormat.format(new
         * Date()) + ".html");
         */
        return os;
    }

    /**
     * 打包zip
     * @param os    单个文件输出流,只能是ByteArrayOutputStream类型,便于转输入流
     * @param out    zip输出流
     * @param fileName    zip文件名
     * @throws IOException 
     */
    public static void compressFile(OutputStream os, ZipOutputStream out, String fileName) throws IOException {
        int buffer = 1024 * 2;
        // 输出流转换为输入流
        ByteArrayOutputStream bos = (ByteArrayOutputStream) os;
        InputStream is = new ByteArrayInputStream(bos.toByteArray());
        BufferedInputStream bis = new BufferedInputStream(is);
        ZipEntry entry = new ZipEntry(fileName);
        out.putNextEntry(entry);
        int count;
        byte data[] = new byte[buffer];
        while ((count = bis.read(data, 0, buffer)) != -1) {
            out.write(data, 0, count);
        }
        bis.close();
    }
}


注:打包zip需要ant.jar


你可能感兴趣的:(jasperreports,打包zip)