2010-10-20 248 views

回答

19

感谢这个线程,我真的更容易创建一个带有多个工作表的Excel导出。我发现了什么是你可以使用以下命令:

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

商和出口商将自动使用每JasperPrint对象构造每个片; Jasper报告的名称(如jrxml文件中指定的)用作每张表的名称。

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

+0

我使用JRXlsExporterParameter.SHEET_NAMES命名表单,但名称在表单选项卡上不合适。使用上面的代码将名称与正确的工作表相匹配。谢谢+1 – 2012-01-06 19:14:30

+0

+1不错的答案。谢谢 – Addicted 2012-07-10 11:10:53

+0

考虑更新您的答案JRXlsExporter.setParameter已弃用 – 2015-12-02 17:16:37

10

感谢belisarius链接,我们似乎已经想通了。如何做到这一点的基础知识就是像平常一样为每张纸创建您的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页面(这应该是一个)的数量。然后循环使用secondWorkSheet中的页面,并将它们添加到firstWorkSheet中。

请确保您在jasperReport中设置为打印为每个工作表jrxml文件的一个页面,并且您应该很好。如果有任何更改,我会更新此内容,但这应该起作用。

UPDATE:

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

代替

net.sf.jasperreports.engine.export.JRXlsExporter

因为似乎出口到多个工作表时是一个问题。

也为isIgnorePagination在JRXML文件中的设置必须是:

isIgnorePagination="true"

使每个JRXML文件导出为单页。

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

+0

+1为了让您的时间帮助其他人 – 2010-10-20 14:47:11

+0

+1对我有帮助谢谢。 – Addicted 2012-07-11 12:05:44

2

根据当前版本6.1.1,不推荐使用JRXlsExporter.setParameter。它应该被JRXlsExporter.setExporterInput取代。所以,更新后的代码应该是:

ArrayList<JasperPrint> sheets = new ArrayList<JasperPrint>(); 
sheets.add(sheet1); 
sheets.add(sheet2); 

exporter.setExporterInput(SimpleExporterInput.getInstance(sheets)); 
相关问题