如何在PHP的同一页面上下载在ajax请求上创建的excel文件

问题描述

我有一个用户点击按钮,它会在同一页面上发送一个ajax请求

$("#Export").on('click',function() { 
      $.ajax({
        type: "POST",data: { 
           export:"excel",headers : tableHeaders,columns : columnsValues,where : whereConditions },success: function() { alert("done"); }
      });
});

在我的 PHP 页面顶部,我检查发布请求是否存在,然后我从数据库获取数据并使用 PHPspreadsheet 库将其粘贴到一个 excel 文件中,如下所示:

 if( isset($_POST['export']) ){

require 'PHPspreadsheet/vendor/autoload.PHP';

use PHPOffice\PHPSpreadsheet\IOFactory;
use PHPOffice\PHPSpreadsheet\Spreadsheet;
use PHPOffice\PHPSpreadsheet\Writer\Xlsx;

require 'config/dbConnection.PHP';

// create my query and fetch the data from database
$sql = 'SELECT '. $_POST['columns'] .' FROM mytable WHERE '. $_POST['where'];
$stmt = $conn->query($sql);
$data = [];
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

$dataHeader = explode(',',$_POST['headers']);

// create my excel file
$spreadsheet = new Spreadsheet();

// rename sheet
$spreadsheet->getActiveSheet()->setTitle('data');

// set sheet first line header
$spreadsheet->getActiveSheet()
->fromArray(
  $dataHeader,NULL,'A1');

// paste fetched data after header
$spreadsheet->getActiveSheet()
->fromArray(
  $data,'A2');

  // customize the file,bold header,autofit,zoom level,file name...
  $sheet = $spreadsheet->getActiveSheet();
  $highestColumn = $sheet->getHighestColumn();
  $sheet->getStyle('A1:'. $highestColumn .'1')->getFont()->setBold(true);
  $sheet->getSheetView()->setZoomScale(80);
  $sheet->setAutoFilter('A1:'. $highestColumn .'1');
  foreach( $sheet->getColumnIterator() as $col ) { $sheet->getColumnDimension( $col->getColumnIndex() )->setAutosize( true ); }
  $filename = 'exportedData.xlsx';
  
  // download the file on browser
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  header('Content-disposition: attachment;filename="'. $filename .'"');
  header('Cache-Control: max-age=0');

  $writer = IOFactory::createWriter($spreadsheet,'Xlsx');
  $writer->save('PHP://output'); }

我看到文件是在ajax调用完成后创建的,但没有下载到浏览器上。我尝试添加 $file = fopen('PHP://output','w');readfile('PHP://output');,但没有用。

我知道可以在 ajax 调用中将 url 设置为另一个 PHP 文件,然后成功后我可以调用 window.open('myURL','_blank' ); 并且文件将下载到新打开的选项卡中,但我不想要那样。

任何建议请我的代码中缺少在同一页面上进行ajax调用并在同一页面上下载文件内容?谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)