2

.jrxmlファイルを取得し、コンパイルしてから入力する単純なJavaプログラムがあります。レポートのデータはXMLファイルで提供されます。塗りつぶしが完了すると、データはPDFにエクスポートされます。

// Parse input document
Document document = JRXmlUtils.parse(new File(xmlFile));

// Set it as the data source in the parameters
parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);

// Create and set the virtualizer
JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "/tmp");
virtualizer.setReadOnly(true);
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

// Fill the report
String jasperFile = designFile.replaceAll(".jrxml",".jasper");
print = JasperFillManager.fillReport(jasperFile, parameters);

// Export the report to PDF
ArrayList<JasperPrint> jasperPrints = new ArrayList<JasperPrint>();
jasperPrints.add(print);
JRPdfExporter exp = new JRPdfExporter();
exp.setParameter (JRExporterParameter.JASPER_PRINT_LIST, jasperPrints);
exp.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileName );
exp.exportReport();

私の混乱は輸出についてです

上記の塗りつぶし行は小さなレポートには最適ですが、XMLソースファイルが1/2 MBに近づくと、ファイルバーチャライザーの設定(私が行う)に関係なく、1日以上スピンします。

と呼ばれる別の方法があるようfillReportToSteamです。私の混乱は、でfillReport、PDFにエクスポートするために追加の手順を実行する必要があるということです。どのような種類のストリームにfillReportToStream書き込んでいますか?それをどのように指定しますか?fillReportToStreamPDFファイルに書き込みますか?

例を見つけることができませんでした。ストリームを利用して、進行状況を測定し、これらのPDFを通常の時間内に完成させることができると期待していました。

4

2 に答える 2

2

呼び出しfillReportToStreamてもオブジェクトは生成されますが、JasperPrintオブジェクトを返すのではなく、出力ストリームに直接書き込みます。はJasperFillManager他の形式でレポートを出力できないため、エクスポート手順をスキップすることはできません。JRPdfExporterPDFを生成するには、出力ストリームが書き込まれた場所から、入力されたレポートを使用して読み取る必要があります。

ここでの問題はファイルバーチャライザーだと思います。「ファイルバーチャライザーの設定に関係なく、1日以上スピンします」とおっしゃっていますが、バーチャライザーを使用すると、実際にはプロセスに時間がかかります。メモリ不足エラーを回避することは基本的な時間とメモリのトレードオフですが、充填がはるかに遅くなります。私が見たベンチマークでは、ファイルバーチャライザーを追加すると、充填時間が4倍になりました。

仮想化機能が本当に必要な場合は、渡すmaxSizeパラメーターを増やしてみてください。2はひどく低いようです。JRSwapFileVirtualizerパフォーマンスがはるかに優れていると聞いているので、に切り替えてみることもできます。

于 2012-11-05T11:46:04.733 に答える
1

使用例:

    public class ExporterReport {
    private byte[] report = null;
    private String reportName = "myreport";
    protected Collection<? extends Object> getData() {
        //TODO: return your collection
    }
    protected String getReportPath() {
        return "/report/myreport.jasper";
    }   
    public final void buildReportXLS() {        
        Map<String, Object> params = new HashMap<String, Object>();
        try {
            params.put("text", "sametext");
            String reportUrl = getReportPath();
            Collection<? extends Object> collection = getData();
            if (!collection.isEmpty()) {
                URL urlJasper  = FacesContext.getCurrentInstance().getExternalContext().getResource(reportUrl);
                JRDataSource data = new JRBeanCollectionDataSource(collection);
                JasperPrint jasperPrint = null;
                try {
                     jasperPrint = JasperFillManager.fillReport(urlJasper.getPath(), params, data);
                     if (jasperPrint != null) {
                        /**
                         * 1- export to PDF sample
                         */
                        //JasperExportManager.exportReportToPdfFile(jasperPrint, "C://sample_report.pdf");

                        /**
                         * 2- export to HTML Sample
                         */
                        //JasperExportManager.exportReportToHtmlFile(jasperPrint,"C://sample_report.html");

                        /**
                         * 3- export to Excel sheet
                         */
                        JRXlsExporter exporter = new JRXlsExporter();

                        ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
                        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsReport);
                        exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
                        exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
                        exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
                        exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS,Boolean.FALSE);
                        exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
                        exporter.exportReport();
                        xlsReport.flush();
                        xlsReport.close();
                        this.setReport(xlsReport.toByteArray());
                     }
                  } catch (JRException e) {
                     e.printStackTrace();
                  }             

                if (log.isInfoEnabled()) {
                    log.info("Report build successful", reportName);
                }
        } catch (Exception e) {
                log.error("has a error {0} in {1}: {2} [{3}]", e, reportName, new Date(), e.getMessage(), "information");
        }
    }

    public void downloadReportXLS() {
        if (this.getReport() != null) {
            this.downloadFile(this.getReport(), reportName + ".xls");
        }
    }

    private void downloadFile(byte[] bytes, String fileName) {
        try {
            String contentType = null;
            FacesContext facesContext = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

            if (fileName.lastIndexOf('.') != -1) {
                contentType = URLConnection.getFileNameMap().getContentTypeFor(fileName);
            }

            if (StringUtil.isStringEmpty(contentType)) {
                contentType = "application/octet-stream";
            }

            response.setContentType(contentType);
            response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
            response.addHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);  
            response.setContentLength(bytes.length);

            ServletOutputStream os = response.getOutputStream();
            os.write(bytes);
            os.flush();
            os.close();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   
}

あなたのxhtmlにこれを置くことができます:

<h:commandButton value="Export to sheet" actionListener="#{exportReport.buildReportXLS()}" action="#{exportReport.downloadReportXLS()}" />
于 2014-10-01T13:48:13.027 に答える