Проблема загрузки 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 Status 500 - java.lang.RuntimeException: PHP Неустранимая ошибка: Uncaught [[o:Exception]:"java.lang.Exception: Ошибка вызова: [[i:JRExporter]]->exportReport. Причина: php.java.bridge.NoSuchProcedureException: статический exportReport(). Кандидаты: [] VM: 1.7.0_121 @ http://java.oracle.com/"по адресу:

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

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

1 ответ

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

Так что проблема не в отсутствующей библиотеке, а, скорее всего, в опечатке при тестировании с параметром 'format' (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...)

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

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

Другие вопросы по тегам