【问题标题】:How do you export a JasperReport to an Excel file with multiple worksheets?如何将 JasperReport 导出到具有多个工作表的 Excel 文件?
【发布时间】:2010-10-20 12:17:36
【问题描述】:

我们有一份报告,客户希望将其导出为具有多个工作表的 Excel 格式。本质上,这两个查询共享相同的参数,但其他一切都不同。

在 jasper-reports 中如何导出到具有多个工作表(最好来自不同数据源)的 excel 文件?

【问题讨论】:

    标签: excel export jasper-reports


    【解决方案1】:

    多亏了这个帖子,我确实更容易创建包含多个工作表的 Excel 导出。我发现您可以使用以下内容:

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

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

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

    【讨论】:

    • 我使用 JRXlsExporterParameter.SHEET_NAMES 命名工作表,但工作表选项卡上的名称不正确。使用上面的代码将名称与正确的工作表匹配。谢谢+1
    • 考虑更新您的答案 JRXlsExporter.setParameter 已弃用
    【解决方案2】:

    感谢 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,以便将每个页面拆分为单独的工作表。

    【讨论】:

      【解决方案3】:

      根据当前版本 6.1.1,JRXlsExporter.setParameter 已弃用。它应该替换为JRXlsExporter.setExporterInput。因此,更新后的代码将是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        相关资源
        最近更新 更多