当使用连接到ajax的btn时,何时运行“headers”


When to run `headers` while using a btn connected to ajax

我用HTML创建了一个按钮
该按钮调用Jquery函数on('click')
现在,ajax被触发以从PHP中获取数据
PHP脚本应该输出一个excel文件,并打开一个save dialog供用户下载excel文件

所以我有三个文件:主PHP,JS和后端PHP
如果我把标题放在Main PHP中,save dialog就会在我进入页面时出现。(按下按钮时不会)
如果我把头放在"后端PHP"中,什么都不会发生

那么,我应该把"标题"放在哪里呢
我不能这样做吗

标题

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename='"file.xlsx'"");
header("Cache-Control: max-age=0");

主PHP中的HTML按钮

<button class="btn btn-default" id="btnExportElementdata"><span class="glyphicon glyphicon-save" title="Spara"></span></button>

JS

//Btn Save
$('#btnExportElementdata').on('click', function(){
    //Fetch selected ObjNr
    objNr = $('#selectObjekt').val();
    //Send objNr to php and fetch elementData
    $.ajax({
        url: '../phpexcel/php/exportElementData.php',
        method: 'POST',
        data: {objNr : objNr},
        success: function(result){
            $('#elementData').append(result);
        }
    })       
})

后端PHP

<?php
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename='"results.xlsx'"");
header("Cache-Control: max-age=0");
//Load db connection
require("conf.php");
//Check if usr is logged in
if(empty($_SESSION['user'])){
  header("Location: index.php");
  die("Redirecting to index.php"); 
}
//Check IF post
if(!empty($_POST['objNr'])){
  //Store post in var
  $objNr = $_POST['objNr'];

  /** Error reporting */
  error_reporting(E_ALL);
  //Load phpexcel includes    
  require '../Classes/PHPExcel.php';
  /** PHPExcel_Writer_Excel2007 */
  include '../Classes/PHPExcel/Writer/Excel2007.php';
  // Create new PHPExcel object
  $objPHPExcel = new PHPExcel();
  // Set properties
  $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
  $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
  $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
  $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
  $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");

  // Add some data
  $objPHPExcel->setActiveSheetIndex(0);
  $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Nr');
  $objPHPExcel->getActiveSheet()->SetCellValue('B1', 'Höjd');
  $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Typ');
  $objPHPExcel->getActiveSheet()->SetCellValue('D1', 'Längd');
  $objPHPExcel->getActiveSheet()->SetCellValue('E1', 'AV');
  $objPHPExcel->getActiveSheet()->SetCellValue('F1', 'Öppningar');
  $objPHPExcel->getActiveSheet()->SetCellValue('G1', 'Vikt');

  //Fetch data from DB
  $query = "SELECT * FROM element WHERE objekt_nr = '$objNr' ORDER BY length(element_nr), element_nr ASC";
  try{
    $stmt = $db->prepare($query);
    $result = $stmt->execute();
  }
  catch(PDOException $ex){
    die("Failed to run query: " . $ex->getMessage());
  }
  //Insert on first row after heading 
  $row = 2;
  while($value = $stmt->fetch()){
    //Set start Column
    $column = "A";
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['element_nr']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['hojd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['typ']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['langd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['avdrag']."");
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['oppningar']."");
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['vikt']);
    //INCREASE Row Nr
    $row++;
}
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle($objNr);
// Write file to the browser
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save('file.xlsx');
}
else{
  echo 'Välj objektnummer..';
}

除了save dialog之外的所有脚本都很好
如果我把文件保存在服务器上,它会完美工作
本期内容全部为headers

您需要从文件中删除这些标头。

如果需要,可以使用ajax,但必须只返回文件所在的链接并在浏览器中显示。当用户单击此链接时,将调用一个函数。您将在此函数中设置标题,这将强制下载保存的文件。我希望这对你有意义。