【问题标题】:JasperReport: how to download generated report?JasperReport:如何下载生成的报告?
【发布时间】:2015-08-24 02:30:02
【问题描述】:

我正在开发一个网络应用程序,用户可以在该应用程序上生成一些数据的报告。我正在使用 JasperReport 执行此操作。这是我第一次使用 JasperReport。所以我关注了这个tutorial。

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

不胜感激,谢谢。

【问题讨论】:

  • 看看 JasperReports 服务器。您可以使用它,因为它能够保存和下载报告。或者,您可以了解需要在自己的应用程序中实现的内容。

标签: java jsp jasper-reports


【解决方案1】:

您的代码应如下所示:

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);
        }
    }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      要么:

      1. 将文件保存到客户端可直接访问的位置,或
      2. 从文件(或其他字节流)流回字节。

      要执行 #1,您要么必须将其保存在 Web 应用程序“内部”,这在部署战争时是不可能的,而在部署爆炸战争时则很脆弱。符号链接和容器游戏可以解决这个问题。

      要执行 #2,将其保存在任何地方,并创建一个 servlet,该 servlet 可以采用映射到生成的文件(或其他任何内容)的请求参数并将其流回——搜索“下载 servlet”会提供大量实现。

      大多数框架都提供类似的功能,而无需编写纯 servlet。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多