【发布时间】:2010-10-20 12:17:36
【问题描述】:
我们有一份报告,客户希望将其导出为具有多个工作表的 Excel 格式。本质上,这两个查询共享相同的参数,但其他一切都不同。
在 jasper-reports 中如何导出到具有多个工作表(最好来自不同数据源)的 excel 文件?
【问题讨论】:
标签: excel export jasper-reports
我们有一份报告,客户希望将其导出为具有多个工作表的 Excel 格式。本质上,这两个查询共享相同的参数,但其他一切都不同。
在 jasper-reports 中如何导出到具有多个工作表(最好来自不同数据源)的 excel 文件?
【问题讨论】:
标签: excel export jasper-reports
多亏了这个帖子,我确实更容易创建包含多个工作表的 Excel 导出。我发现您可以使用以下内容:
ArrayList<JasperPrint> list = new ArrayList<JasperPrint>();
list.add(jp1); list.add(jp2);
exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT_LIST, list);
并且导出器将自动使用每个 JasperPrint 对象来构造每个工作表; Jasper 报告的名称(在 jrxml 文件中指定)也用作每个工作表的名称。
目前这个解决方案适用于我的本地项目,所以我只是想让你知道。
【讨论】:
感谢 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 中当前的页数(应该是1)。然后循环遍历secondWorkSheet 中的页面并将它们添加到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.setExporterInput。因此,更新后的代码将是:
ArrayList<JasperPrint> sheets = new ArrayList<JasperPrint>();
sheets.add(sheet1);
sheets.add(sheet2);
exporter.setExporterInput(SimpleExporterInput.getInstance(sheets));
【讨论】: