微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

下载生成的 excel 仅适用于本地 | WordPress

如何解决下载生成的 excel 仅适用于本地 | WordPress

我有一个 wordpress 页面,将报告显示为 html 表格,点击按钮后,该报告应下载为 xlsx 文件

问题是,虽然下载功能在我的本地机器上运行良好,但在服务器上,我在屏幕上出现这样的乱码,而不是文件下载:

PKǂ�RG�D�Z�[Content_Types].xml���N ...

相关代码如下:

  • page-export.PHP

    <?PHP
    
    require_once 'vendor/autoload.PHP';
    global $wpdb;
    
    use PHPOffice\PHPSpreadsheet\Spreadsheet;
    use PHPOffice\PHPSpreadsheet\Writer\Xlsx;
    use PHPOffice\PHPSpreadsheet\IOFactory;
    
    if ( !post_password_required() ):
    
      // fetching data
      $query = "SELECT *,(SELECT COUNT(*) FROM library_Votes
                      WHERE libraries.id = library_Votes.library_id) AS Votes
              FROM libraries ORDER BY Votes DESC";
      $libraries = $wpdb->get_results ( $query );
    
      // download on click
      if(isset($_GET['action']) && $_GET['action'] == 'download') {
        $header = ['Col1','Col2','ColN];
        $libArray = json_decode(json_encode($libraries),true);
        array_unshift($libArray,$header);
        array_columns_delete($libArray,['ID']);
    
        // BUILD EXCEL FILE!
        outputXlsx($libArray,'excel_filename','sheetname');
        exit();
      }
    ?>
    
    // download btn
    <a href="<?PHP echo esc_url(get_permalink())?>?action=download" class="btn btn-secondary btn-lg" tabindex="-1" role="button" aria-disabled="true">Download</a>
    
    // loop & html for table
    ...
    
    <?PHP 
    
    else:
      echo get_the_password_form();
    endif;
    ?>
    
  • functions.PHP

    function outputXlsx($array,$filename = 'zones',$title = 'Sheet',$debug = false) {
    
      if (!$debug) {
          header('Content-Type: application/vnd.ms-excel');
          header('Content-disposition: attachment;filename="'. $filename .'.xlsx"');
          header('Cache-Control: max-age=0');
      }
    
      $spreadsheet = new \PHPOffice\PHPSpreadsheet\Spreadsheet();
      $spreadsheet->setActiveSheetIndex(0);
      $spreadsheet->getActiveSheet()->fromArray($array,NULL,'A1');
      $spreadsheet->getActiveSheet()->setTitle($title);
    
      ob_end_clean();
      $writer = \PHPOffice\PHPSpreadsheet\IOFactory::createWriter($spreadsheet,'Xlsx');
      $writer->save('PHP://output');   
    }
    

我尝试在类似问题上添加额外的标题,切换 ob_end_clean(),在 outputXlsx 之后退出函数......等,但它仍然只能在本地工作。

提前致谢!

解决方法

我终于修好了!

在 wordpress 中启用调试模式给了我解决这两个警告的线索:

  • 警告:无法修改标头信息 - 标头已发送
  • ob_end_clean():删除缓冲区失败。没有要删除的缓冲区

事实证明,我所要做的就是将生成 excel 的代码放在页面顶部的 html 之前,并添加 ob_start()

页面导出.php:

//line 1 of the file
<?php
      ob_start(); // create buffer fo ob_end_clean()
      require_once 'vendor/autoload.php';
      global $wpdb;

      use PhpOffice\PhpSpreadsheet\Spreadsheet;
      use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
      use PhpOffice\PhpSpreadsheet\IOFactory;
      if ( !post_password_required() ):
      $query = "SELECT *,(SELECT COUNT(*) FROM library_votes
                        WHERE libraries.id = library_votes.library_id) AS votes
                FROM libraries ORDER BY votes DESC";
      $libraries = $wpdb->get_results ( $query );

      if(isset($_GET['action']) && $_GET['action'] == 'download') {
          $header = ['Col1','Col2','ColN'];
          $libArray = json_decode(json_encode($libraries),true);
          array_unshift($libArray,$header);
          array_columns_delete($libArray,['ID']);
          outputXlsx($libArray,'filename','sheetname');
          exit();
      }
?>

// html after
<html>...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。