xls下载php中的jasper报告问题

时间:2017-02-07 15:19:51

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

我已经在我的应用程序中使用版本6.3.1实现了jasper报告,使用This Link进行了php集成。所有内容都可以正常使用此代码,我可以导出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:异常]:" java.lang.Exception:调用失败:[[i:JRExporter]] - > exportReport。原因:php.java.bridge.NoSuchProcedureException:static exportReport()。候选人:[] VM:1.7.0_121@ {{}}}"于:

任何人都可以建议我解决此异常的问题请建议我,如果有任何遗漏,请在此处包含。

先谢谢。

1 个答案:

答案 0 :(得分:0)

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

因此,这不是缺少库的问题,但是当您使用'格式进行测试时可能会出现错字。参数(xls)......

一点解释:

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

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

所以我觉得NoSuchProcedureException至少在exportReport()调用$exporter时似乎不太可能......

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

如果$exporter参数不是' xls' (或交换机中涵盖的任何值),则会使用先前设置的$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; 。在这种情况下,本质上不应该工作(JRExporter接口)

请参阅代码段中的摘录:

// prompt to get bandwidth from user
// check for validity
// if invalid, prompt again
try{
    h = JOptionPane.showInputDialog("Enter bandwidth as a positive number");
        // loop until parsed string is a valid double
    while (Double.isNaN(Double.parseDouble(h)) || Double.parseDouble(h) <=0)  {
            h = JOptionPane.showInputDialog("Enter bandwidth as a positive number");
        }
        // h has been set to valid double, set it to bandwidth
        model.setBandwidth(Double.parseDouble(h));  
    }catch(NumberFormatException|NullPointerException NFE){
        System.err.println("Caught exception: " + NFE.getMessage());
    }

所以我的答案是:

检查您的$ _POST [&#39;格式&#39;]是否真的等于&#39; xls&#39; (不是xslx,xsl ......)

如果是问题,请考虑至少在您的交换机中抛出异常(不支持的格式)&#39;默认&#39;部分。

如果不是,请包含更多关于您的例外(堆栈跟踪)的信息,因为它很难做出猜测