如何将JasperReport导出到具有多个工作表的Excel文件?

我们有一个报告,客户希望导出到Excel格式,它有多个工作表。 基本上这两个查询共享相同的参数,但一切都是不同的。

在jasper-reports中,如何导出到具有多个工作表(理想情况下来自不同数据源)的excel文件?

多亏了这个线程,我真的更容易创build一个Excel导出多个工作表。 我发现,你可以使用以下内容:

ArrayList<JasperPrint> list = new ArrayList<JasperPrint>(); list.add(jp1); list.add(jp2); exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT_LIST, list); 

出口商将自动使用每个JasperPrint对象来构造每个工作表; Jasper报告的名称(在jrxml文件中指定)也被用作每个表的名称。

目前这个解决scheme适用于我的本地项目,所以我只是想让你知道。

由于belisarius链接,我们似乎已经弄清楚了。 如何做到这一点的基础是创build你的JasperPrint对象为每个工作表,通常会。 所以你有了:

 JasperPrint firstWorkSheet = ...; JasperPrint secondWorkSheet = ...; 

JasperPrint对象此时已经被数据源填充了。 那你做:

 List<JRPrintPage> pages = new ArrayList<JRPrintPage>(secondWorkSheet.getPages()); int i = firstWorkSheet.getPages().size(); for (int count = 0; count < pages.size(); count++) { firstWorkSheet.addPage(i, (JRPrintPage) pages.get(count)); i++; } 

这是什么它将i设置为当前在firstWorkSheet (这应该是一个)的页面数量。 然后循环使用第二个工作表中的页面,并将它们添加到第一个工作表中。

确保在你jasperReport你已经设置为每个工作表jrxml文件打印为一个页面,你应该很好去。 如果有什么变化,我会更新这个,但这应该工作。

更新:

发现你需要使用net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter

代替

net.sf.jasperreports.engine.export.JRXlsExporter

因为导出到多个工作表时似乎存在问题。

jrxml文件中isIgnorePagination的设置也需要:

isIgnorePagination="true"

这样每个jrxml文件就会作为一个页面被导出。

然后,您需要将JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET参数设置为true,以便将每个页面分解为单独的工作表。

按照当前版本6.1.1,不推荐使用JRXlsExporter.setParameter 。 它应该被JRXlsExporter.setExporterInputreplace。 所以,更新的代码将是:

 ArrayList<JasperPrint> sheets = new ArrayList<JasperPrint>(); sheets.add(sheet1); sheets.add(sheet2); exporter.setExporterInput(SimpleExporterInput.getInstance(sheets));