我正在开发一个jrxml模板来生成求职者的简历。候选人在我的数据库中。
我需要为1条记录(按职业候选人)生成一个Word文件(.docx),如下图所示:
如何让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();
答案 0 :(得分:0)
问题解决方案
我通过在每个页面的页脚中插入一个变量来解决问题,该变量带有以下表达式:$ V {REPORT_COUNT},其中记录计数位于Detail Band中:
之后,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());
}
这是一项测试,我的代码未经过优化。如果有人有任何建议或更好的想法,请在这里发布。谢谢。