Файл сохранения таблицы PHPS в недопустимом формате

Контекст:

Я планирую использовать PHPSpreadsheet для расширения плагина планировщика событий на wordpress для создания экспорта в wordpress. Я использую пакет PHPSpreadsheet, начиная с базового примера, приведенного на сайте PHP Spreadsheet Doc.

Это страница с самообработкой. Они нажимают кнопку экспорта, и страница снова запускается со строкой запроса, которая определяет, какие данные следует поместить в электронную таблицу.

Проблема:

В настоящее время скрипт не выполняет ничего, кроме простого примера PHPSpreadsheet. Загрузка запускается нормально, но когда я открываю файл, я получаю следующие ошибки.

Мы обнаружили проблему с некоторым содержимым в storage_report.xlsx. Вы хотите, чтобы мы постарались восстановить как можно больше?

Нажмите "Да".

Microsoft Excel пытался открыть и исправить файл. Чтобы начать этот процесс снова, выберите «Открыть и восстановить» в диалоговом окне «Открыть файл».

Щелкните ОК.

Затем открывается пустой документ. Вот код.

<?php

require dirname( __FILE__ ) . '/../../vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');}

add_action( 'admin_menu', 'registryExport::menu' );
add_action( 'init', 'registryExport::export' );

class registryExport
{
    /*
        TODO:
            - Display into submenu in WP Admin
            - Find and retrieve epl-data
     */

    /*
        Add button to plugin dropdown
        Clicking Export sidebar submenu item triggers admin_page()
     */
    public static function menu()
    {
        add_submenu_page('edit.php?post_type=epl_event', __('Export', 'epl_event_manager'), __('Export', 'epl_event_manager'), 'export', 'registryExport', 'registryExport::admin_page');
    }

    /*
        Display the page in WP Admin for selecting export options

        When button is clicked, export() is triggered
     */
    public static function admin_page()
    {
        ?>
            <h1>
                Export Registrations
            </h1>
            <hr>
            <p>
                <a class="button button-primary button-large" href="?post_type=epl_event&page=registryExport&type=all">
                    Export All
                </a>
            </p>

        <?
    }

    /*
        Checks URI for validity and export type

        Triggers data retrieval and download of export file
     */
    public static function export()
    {
        if ( self::isValidUri() )
        {
            $type = $_GET[ 'type' ];  // Type of export

            // Use switch to allow for more types to be added later on
            switch ( $type )
            {
                case( 'all' ):

                    $spreadsheet = new Spreadsheet();
                    $sheet = $spreadsheet->getActiveSheet();
                    $sheet->setCellValue('A1', 'Hello World !');

                    $writer = new Xlsx($spreadsheet);

                    try
                    {
                        $writer->save( "php://output" );
                    }

                    catch ( Exception $e )
                    {
                        self::pre( $e ); // just a print_r( $var ) wrapped in <pre>
                        die( "FAILED TO SAVE SPREADSHEET" );
                    }

                    // TODO: output headers so that the file is downloaded rather than displayed
                    header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //for Excel2007
                    header('Content-Disposition: attachment; filename="storage_report.xlsx"');

                    die( "Export Button Triggered" );
                    break;
                default:
                    die( 'Invalid Type selected' );
                    break;
            }

        }
    }

    /**
     * Check if GET query values are set and valid
     * @return boolean
     */
    public static function isValidUri()
    {
        return ( isset( $_GET[ 'page'] ) && $_GET[ 'page' ] == 'registryExport' && isset( $_GET[ 'type' ] ) )
            ? true
            : false;
    }

    /*
        Nicely output pre-formated text
     */
    public static function pre( $var )
    {
        if ( $var )
        {
            echo "<pre>";
            print_r( $var );
            echo "</pre>";
        }
    }
}

Решения, которые я пробовал:

  • Перемещение $writer->save() после смены заголовка.
  • Сохранение в имя файла, а не в php://output

person Dan    schedule 07.08.2018    source источник
comment
Длинный план, но удалите эхо на этой странице   -  person Mihai    schedule 07.08.2018
comment
Прежде всего, перед сохранением переместите заголовок. убедитесь, что вы не используете эхо в запросе. Заголовки должны идти до любого вывода   -  person Viktar Pryshchepa    schedule 07.08.2018
comment
@Mihai Это действительно сработало. Могу ли я вместо этого обернуть содержимое в буфер, чтобы обойти это? Я использую этот класс для других целей, поэтому было бы неплохо сохранить практику инкапсуляции и не отделять код. Изменить: На самом деле, это сделало только удаление текста из инструкции die. Больше ничего менять не нужно.   -  person Dan    schedule 07.08.2018
comment
Вместо того, чтобы редактировать решение в вопросе, оставьте в вопросе неработающий код и добавьте ответ. Прочтите о Как задавать вопросы здесь и Как ответить.   -  person elixenide    schedule 07.08.2018
comment
Любой вывод на странице с заголовками будет саботировать результаты, будь то die, echo или что-то еще. Буквально вчера я решил ту же проблему в PHPExcel.   -  person Mihai    schedule 07.08.2018


Ответы (1)


Просто удалите любой вывод на своей странице, эти заголовки будут натыкаться на него при выполнении.

die( "Export Button Triggered" );

die( 'Invalid Type selected' );
person Mihai    schedule 07.08.2018