如何解决下载生成的 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 举报,一经查实,本站将立刻删除。