我已经在我的应用程序中使用版本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@ {{}}}"于:
任何人都可以建议我解决此异常的问题请建议我,如果有任何遗漏,请在此处包含。
先谢谢。
答案 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;部分。
如果不是,请包含更多关于您的例外(堆栈跟踪)的信息,因为它很难做出猜测