Контекст:
Я планирую использовать 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