【问题标题】:xls download issue with jasper reports in phpphp中jasper报告的xls下载问题
【发布时间】:2017-06-24 21:50:39
【问题描述】:

我已经在我的应用程序中使用 6.3.1 版通过使用 This Link 与 php 集成实现了 jasper 报告,并且使用此代码一切正常,我可以导出 pdf 和 csv 文件。但是我在导出 xls 文件时遇到了问题。

Xls 文件导出代码

    try {
        $exporter = new java("net.sf.jasperreports.engine.export.JRXlsExporter");
        $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_ONE_PAGE_PER_SHEET, java("java.lang.Boolean")->TRUE);
        $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_WHITE_PAGE_BACKGROUND, java("java.lang.Boolean")->FALSE);
        $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, java("java.lang.Boolean")->TRUE);
        $exporter->setParameter(java("net.sf.jasperreports.engine.JRExporterParameter")->JASPER_PRINT, $jasperPrint);
        $exporter->setParameter(java("net.sf.jasperreports.engine.JRExporterParameter")->OUTPUT_FILE_NAME, $outputPath);
    } catch (JavaException $ex) {
        echo $ex;
    }

它会抛出一个异常

HTTP 状态 500 - java.lang.RuntimeException: PHP 致命错误:未捕获 [[o:Exception]:"java.lang.Exception: Invoke failed: [[i:JRExporter]]->exportReport。原因:php。 java.bridge.NoSuchProcedureException:静态exportReport()。候选人:[] VM:1.7.0_121@http://java.oracle.com/" at:

谁能给我建议这个异常的解决方案如果这里缺少任何东西,请建议我这个包。

提前致谢。

【问题讨论】:

    标签: php jasper-reports php-java-bridge


    【解决方案1】:

    (已编辑)从异常消息 [[i:JRExporter]]->exportReport 中,您实际上不是在您认为的对象 (net.sf.jasperreports.engine.export.JRXlsExporter) 上调用 $exporter->exportReport() 方法,而是在 net.sf.jasperreports.engine.JRExporter 上。

    所以这不是缺少库的问题,而是当您使用“格式”参数(xls)进行测试时可能是一个错字......


    一点解释:

    调用 exportReport() 方法时抛出的NoSuchProcedureException 表明它不存在于$exporter 对象上。

    查看JRXlsExporter api doc,该方法很好,应该可以使用。

    所以在我看来,NoSuchProcedureException 至少在...的情况下不太可能被调用 exportReport()

    ...我的猜测,我可能错了,$exporter 对象不是你想的那个。如果我查看您提供的链接,这种情况可能是可能的,因为$exporter 默认为net.sf.jasperreports.engine.JRExporter(实际上是interface

    如果$_POST['format'] 参数不是'xls'(或开关中涵盖的任何值),则将使用先前设置的$exporter。而在这种情况下,本质上不应该工作(JRExporter接口)

    查看您的代码 sn-p 的摘录:

    $exporter = new java("net.sf.jasperreports.engine.JRExporter");
    switch ($_POST['format']) {
        case 'xls':
            $outputPath = realpath(".") . "\\" . "output.xls";
            try {
                $exporter = new java("net.sf.jasperreports.engine.export.JRXlsExporter");
            $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_ONE_PAGE_PER_SHEET, java("java.lang.Boolean")->TRUE);
            $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_WHITE_PAGE_BACKGROUND, java("java.lang.Boolean")->FALSE);
            $exporter->setParameter(java("net.sf.jasperreports.engine.export.JRXlsExporterParameter")->IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, java("java.lang.Boolean")->TRUE);
            $exporter->setParameter(java("net.sf.jasperreports.engine.JRExporterParameter")->JASPER_PRINT, $jasperPrint);
            $exporter->setParameter(java("net.sf.jasperreports.engine.JRExporterParameter")->OUTPUT_FILE_NAME, $outputPath);
        } catch (JavaException $ex) {
            echo $ex;
        }
        header("Content-type: application/vnd.ms-excel");
        header("Content-Disposition: attachment; filename=output.xls");
        break;
    

    所以我的答案是:

    检查您的 $_POST['format'] 是否真的等于 'xls'(不是 xslx、xsl...)

    如果是问题所在,请考虑至少在您的开关“默认”部分抛出异常(不支持的格式)。

    如果不是,请提供有关您的异常的更多信息(堆栈跟踪),因为猜测时间很短

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多