Jasper Reports:将报告导出为多个文件

时间:2016-09-23 18:03:38

标签: jasper-reports

我正在开发一个jrxml模板来生成求职者的简历。候选人在我的数据库中。

我需要为1条记录(按职业候选人)生成一个Word文件(.docx),如下图所示:

Word file with individual candidate resume

如何让Jasper为我的SQL查询的每条记录生成一个文件?并将这些文件导出到Word?

我看到有一个名为 PAGE_INDEX 导出器的参数。但我没有找到如何使用它......

有人能帮助我吗?

注1:我的报告不是由JasperServer生成的。我开发了一个Java程序来生成它们并通过电子邮件发送报告。

注2:每位候选人的页数可能不同。

更新状态

我设法为每个文件生成一条记录。但我只能生成第一条记录的文件。 我需要为剩余的记录生成其他文件。 我还有另一个问题:如果每个记录(候选实体)的页数可以改变,如何分成单独的文件?

final JRDocxExporter exporter = new JRDocxExporter();
        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(new java.io.File("/home/admin/resume candidate.docx")));
        SimpleDocxReportConfiguration configuration = new SimpleDocxReportConfiguration();
        configuration.setPageIndex(0);
        exporter.setConfiguration(configuration);
        exporter.exportReport();

1 个答案:

答案 0 :(得分:0)

问题解决方案

我通过在每个页面的页脚中插入一个变量来解决问题,该变量带有以下表达式:$ V {REPORT_COUNT},其中记录计数位于Detail Band中: enter image description here

之后,Java程序在JasperPrint对象的页面之间循环。 所以,我找到了那个告诉我哪个页面属于候选人的元素。 基于此信息并存储候选索引数据及其页面(在 HashMap> mapCandPage 中),我可以确定每个候选者的页面开始和页面结束。这样我就可以为每个候选记录导出一个文档。

public static void main(String args[]) throws Exception {

        File relJasperArqFile = new File("Candidate Resume Template.jasper");
        Connection conn = ConnectionFactory.getNewConnectionSQLDRIVER();

        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(relJasperArqFile);

        JasperPrint jasperPrint
                = JasperFillManager.fillReport(jasperReport,
                        null,
                        conn);

        final JRDocxExporter exporter = new JRDocxExporter();
        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));

        List<JRPrintPage> listPrintPage = jasperPrint.getPages();

        int candIdx = 0;
        int fileIdx = 0;
        int lastCandIdx = 0;
        HashMap<Integer, List<Integer>> mapCandPage = new HashMap<>();
        for (int pageIdx = 0; pageIdx < listPrintPage.size(); pageIdx++) {
            JRPrintPage page = listPrintPage.get(pageIdx);
            candIdx = getCandIdx(page);

            if (!mapCandPage.containsKey(candIdx)) {
                mapCandPage.put(candIdx, (new ArrayList<>()));
            }
            mapCandPage.get(candIdx).add(pageIdx);

            if (pageIdx > 0 && candIdx != lastCandIdx) {
                fileIdx++;
                exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(new File(String.format("Candidate Resume %d.docx", fileIdx))));
                SimpleDocxReportConfiguration configuration = new SimpleDocxReportConfiguration();
                configuration.setStartPageIndex(mapCandPage.get(lastCandIdx).get(0));
                configuration.setEndPageIndex(mapCandPage.get(lastCandIdx).get(mapCandPage.get(lastCandIdx).size() - 1));
                exporter.setConfiguration(configuration);
                exporter.exportReport();

            }

            lastCandIdx = candIdx;

        }
        fileIdx++;
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(new File(String.format("Candidate Resume %d.docx", fileIdx))));
        SimpleDocxReportConfiguration configuration = new SimpleDocxReportConfiguration();
        configuration.setStartPageIndex(mapCandPage.get(lastCandIdx).get(0));
        configuration.setEndPageIndex(mapCandPage.get(lastCandIdx).get(mapCandPage.get(lastCandIdx).size() - 1));
        exporter.setConfiguration(configuration);
        exporter.exportReport();

    }

    public static Integer getCandIdx(JRPrintPage page) {
        JRPrintElement lastRowNumber = page.getElements().get(page.getElements().size() - 1);
        return Integer.parseInt(((JRTemplatePrintText) lastRowNumber).getFullText());
    }

这是一项测试,我的代码未经过优化。如果有人有任何建议或更好的想法,请在这里发布。谢谢。