php中jasper报告的xls下载问题



我已经在我的应用程序中使用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:Exception]:"java.lang.Exception:调用失败:[[i:JRExporter]]->exportReport。原因:PHP.java.bridge.NoSuchProcedureException:静态exportReport()。候选:[]VM:1.7.0_121@http://java.oracle.com/",网址:

有人能给我建议这个例外的解决方案吗?如果这里缺少任何东西,请建议我把包裹包括在内。

提前感谢。

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

因此,这不是缺少库的问题,而是在使用"format"参数(xls)进行测试时可能出现的拼写错误。。。


一点解释:

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

看看JRXlsExporter的api文档,该方法是很好的,应该是可用的。

因此,在我看来,NoSuchProcedureException不太可能被抛出调用exportReport(),至少如果…

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

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

请参阅代码片段摘录:

$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…)

如果是问题所在,请考虑至少在开关的"default"部分中抛出一个异常(不支持的格式)。

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

最新更新