Проблема с загрузкой xls с отчетами jasper в php

Я реализовал отчеты jasper, используя версию 6.3.1 в своем приложении с интеграцией 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: static exportReport() Кандидаты: [] VM: 1.7.0_121@http://java.oracle.com/" по адресу:

Может ли кто-нибудь предложить мне решение для этого исключения? И, пожалуйста, предложите мне включить пакет, если здесь чего-то не хватает.

Заранее спасибо.


person Hareesh    schedule 07.02.2017    source источник


Ответы (1)


(Отредактировано) Из сообщения об исключении [[i:JRExporter]]->exportReport вы на самом деле вызываете метод $exporter->exportReport() не для объекта, который вы думаете (net.sf.jasperreports.engine.export.JRXlsExporter), а для net.sf.jasperreports.engine.JRExporter.

Так что это не проблема отсутствия библиотеки, а, вероятно, опечатка при тестировании с параметром «формат» (xls)...


небольшое пояснение:

NoSuchProcedureException, выдаваемый при вызове метода exportReport(), указывает, что он не существует в объекте $exporter.

Глядя на документ API JRXlsExporter метод хорошо представлен и должен быть пригоден для использования.

Так что мне кажется очень маловероятным, что 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...)

Если это было проблемой, подумайте хотя бы о том, чтобы создать исключение (неподдерживаемый формат) в разделе «по умолчанию» вашего переключателя.

Если это не так, пожалуйста, включите больше информации о вашем исключении (трассировка стека), потому что это довольно коротко, чтобы сделать предположение

person Sébastien Vanvelthem    schedule 07.02.2017