代码之家  ›  专栏  ›  技术社区  ›  Dan Micah Johnson

PHPSpreadsheet以无效格式保存文件

  •  1
  • Dan Micah Johnson  · 技术社区  · 7 年前

    上下文:

    我计划使用PHPSpreadsheet扩展wordpress上的事件规划器插件,以在wordpress中创建导出。我使用PHPSpreadsheet包,从 PHP Spreadsheet Doc site.

    这是一个自我处理页面。他们单击一个导出按钮,它会再次触发一个查询字符串,该字符串决定将哪些数据放入电子表格。

    问题是:

    除了遵循简单的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
    1 回复  |  直到 7 年前
        1
  •  1
  •   Mihai    7 年前

    只要删除页面上的任何输出,这些标题就会在执行时偶然发现它。

    die( "Export Button Triggered" );
    
    die( 'Invalid Type selected' );
    
    推荐文章