我已经在我的应用程序中使用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"部分中抛出一个异常(不支持的格式)。
如果不是,请包括更多关于异常(堆栈跟踪)的信息,因为猜测的时间很短