JasperReport:如何下载生成的报告?

时间:2012-01-23 14:33:57

标签: java jsp jasper-reports

我正在开发一个Web应用程序,用户可以在其上生成某些数据的报告。我正在使用JasperReport做到这一点。这是我第一次使用JasperReport。所以我跟着这个tutorial

那里描述的方法可以在服务器上保存报告,但我需要在生成后下载该报告。

可以感谢一些帮助,谢谢。

3 个答案:

答案 0 :(得分:3)

您的代码应如下所示:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            String path = getServletContext().getRealPath("/reports/report1.jrxml");
            jasReport = JasperCompileManager.compileReport(path);
            System.out.println("Jasper Report : " + jasReport);

            Connection con = MyConnFactory.getConnection();
            System.out.println(con);

            jasPrint = JasperFillManager.fillReport(jasReport,null,con);//, mapParam, con);
            System.out.println("Jasper Print : " + jasPrint);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

//        JasperExportManager.exportReportToPdfFile(jasPrint, "f:/nn.pdf");
//            JasperExportManager.exportReportToPdfStream(jasPrint, baos);
//            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
//            inputStream = bais;

            ServletOutputStream sos=resp.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasPrint, sos);

            try {
                MyConnFactory.getConnection().close();
                sos.close();
            } catch (SQLException ex) {
                Logger.getLogger(MyReport.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (JRException ex) {
            Logger.getLogger(MyReport.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

答案 1 :(得分:1)

尝试下载生成的文件时,需要在servlet代码中设置这些内容。可能需要根据特定情况的文件格式更改一些参数。

response.setContentType("APPLICATION/OCTET-STREAM");
String disHeader = "Attachment;Filename=\"ReportFile.csv" + "\"";
response.setHeader("Content-Disposition", disHeader);

答案 2 :(得分:0)

或者:

  1. 将文件保存到客户端可直接访问的位置,或
  2. 从文件(或其他字节流)中回流字节。
  3. 要做#1,你要么必须将它保存在网络应用程序内部,这在部署战争时是不可能的,如果部署爆炸战争则是脆弱的。符号链接和容器游戏可以解决这个问题。

    要做#2,将它保存在任何地方,并创建一个servlet,它可以获取映射到生成的文件(或其他)的请求参数并将其流回 - 搜索“download servlet”提供了大量的实现。

    大多数框架在不编写纯servlet的情况下提供类似的功能。