【问题标题】:How to set Excel sheet name dynamically via JasperReports 6.x?如何通过 JasperReports 6.x 动态设置 Excel 工作表名称?
【发布时间】:2018-03-30 05:14:12
【问题描述】:

我必须将 jasperreport-4.0.2 升级到 jasperreport-6.5.1 我发现将报告导出为 excel 格式存在一些差异

net.sf.jasperreports.engine.export.JExcelApiExporter

已弃用并替换为

net.sf.jasperreports.engine.export.JRXlsExporter

还有许多其他事情也发生了变化。 在 jasperreport-4.0.2 中,我可以通过此代码更改 excel 工作表名称

JRAbstractExporter exporter = new net.sf.jasperreports.engine.export.JExcelApiExporter();
exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);

在 jasperreport-6.5.1 中命名 excel 工作表的替代方法是什么?

【问题讨论】:

  • 我已经成功更改了其他属性,例如 exporter.getPropertiesUtil().setProperty(XlsReportConfiguration.PROPERTY_IGNORE_CELL_BORDER, "true"); exporter.getPropertiesUtil().setProperty(XlsReportConfiguration.PROPERTY_DETECT_CELL_TYPE, "true"); exporter.getPropertiesUtil().setProperty(XlsReportConfiguration.PROPERTY_COLLAPSE_ROW_SPAN, "true");但工作表名称仍然是个谜

标签: java jasper-reports export-to-excel


【解决方案1】:

根据新的 API(与 4.x 版本相比),您可以通过多种方式解决任务。

使用 ReportExportConfiguration

我们可以使用SimpleXlsxReportConfiguration设置工作表名称,在这种情况下我们应该重写getSheetNames()方法。

Java 代码:

Map<String, Object> params = new HashMap<>();
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params);

JRXlsxExporter exporter = new JRXlsxExporter();

exporter.setConfiguration(new SimpleXlsxReportConfiguration() {

    @Override
    public String[] getSheetNames() {
        return new String[]{"MyName"};
    }
});
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimpleOutputStreamExporterOutput exporterOutput = null;
try (OutputStream outputStream = new FileOutputStream(file)) {
    exporterOutput = new SimpleOutputStreamExporterOutput(outputStream);
    exporter.setExporterOutput(exporterOutput);
    exporter.exportReport();
} finally {
    if (exporterOutput != null) {
        exporterOutput.close();
    }
}

报告模板:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Set sheet name via exporter's configuration" pageWidth="595" pageHeight="200" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <title>
        <band height="30">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30"/>
                <text><![CDATA[Set sheet name via exporter's configuration]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

生成的结果将是:

使用报告的参数和 net.sf.jasperreports.export.xls.sheet.name 属性

工作表名称可以在 net.sf.jasperreports.export.xls.sheet.name 属性的帮助下设置。如果我们想动态设置这个名称,我们可以使用报告的参数来传递名称。

Java 代码:

Map<String, Object> params = new HashMap<>();
params.put("stringParam", "ZZZ");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params);

JRXlsxExporter exporter = new JRXlsxExporter();

exporter.setConfiguration(new SimpleXlsxReportConfiguration());
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimpleOutputStreamExporterOutput exporterOutput = null;
try (OutputStream outputStream = new FileOutputStream(file)) {
    exporterOutput = new SimpleOutputStreamExporterOutput(outputStream);
    exporter.setExporterOutput(exporterOutput);
    exporter.exportReport();
} finally {
    if (exporterOutput != null) {
        exporterOutput.close();
    }
}

报告的模板:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Set sheet name via parameter" pageWidth="595" pageHeight="200" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="name" class="java.lang.String"/>
    <title>
        <band height="30">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30">
                    <propertyExpression name="net.sf.jasperreports.export.xls.sheet.name"><![CDATA[$P{name}]]></propertyExpression>
                </reportElement>
                <text><![CDATA[Set sheet name via parameter]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

结果将是:


有关使用 xls/xlsx 导出器的更多信息:

【讨论】:

  • SimpleReportExportConfiguration simpleReportExportConfiguration = new SimpleReportExportConfiguration(); simpleReportExportConfiguration.setOffsetX(0); simpleReportExportConfiguration.setOffsetY(0); exporter.setConfiguration(simpleReportExportConfiguration);
  • Caused by: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring clas
  • 您在使用泛型时出错了。我没有设置你的代码(这应该是你的代码和堆栈跟踪的一个新问题),但在我看来你正在使用JRXlsxExporter。它被声明为public class JRXlsxExporter extends JRXlsAbstractExporter&lt;XlsxReportConfiguration, XlsxExporterConfiguration, JRXlsxExporterContext&gt;SimpleReportExportConfiguration 不是 XlsxReportConfiguration 的子类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多