1. 程式人生 > >PHPExcel與ajax結合進行檔案下載

PHPExcel與ajax結合進行檔案下載

        由於專案需要,今天用ajax結合PHPExcel進行檔案下載,從官網下載了PHPExcel的樣例程式碼並結合自己的實際需求加上資料庫程式碼後,執行可以下載excel,但是我加上ajax程式碼後請求返回用除錯工具檢視一直是一堆亂碼,返回也一直報error,又用$get直接請求傳入引數,excel也可正常下載,百思不得起解,翻牆google一番,stackoverflow上多位大神給出瞭解答,下面貼出我的程式碼。其中最下面的兩行程式碼非常關鍵,就是要生成該檔案並直接儲存於當前目錄,返回檔案的下載地址,前臺ajax成功返回後,通過返回的地址進行檔案下載,PHPexcel不可以通過ajax直接下載,否則就會出現我上面的情況,返回的一堆亂碼其實就是返回的excel。

<?php
error_reporting(E_ALL);
date_default_timezone_set('Asia/Shanghai');
include '../Classes/PHPExcel.php';
$conn = @mysql_connect(資料庫連線引數) or die("資料庫連線失敗!");
mysql_select_db("資料庫名稱",$conn);               //連線資料庫
mysql_set_charset("utf8",$conn);

$starttime = isset($_POST['starttime']) ? mysql_real_escape_string($_POST['starttime']) : '';
$endtime = isset($_POST['endtime']) ? mysql_real_escape_string($_POST['endtime']) : '';
$fbnum = isset($_POST['fbnum']) ? mysql_real_escape_string($_POST['fbnum']) : '';
$table="fubiaoold";
$where="日期時間 >'$starttime' and 日期時間 <'$endtime';

$sql = mysql_query("select * from ".$table." where ".$where);    //查詢sql語句



$objPHPExcel=new PHPExcel();
$objPHPExcel->getProperties()->setCreator('http://www.phpernote.com')
							 ->setLastModifiedBy('http://www.phpernote.com')
							 ->setTitle('Office 2007 XLSX Document')
							 ->setSubject('Office 2007 XLSX Document')
							 ->setDescription('Document for Office 2007 XLSX, generated using PHP classes.')
							 ->setKeywords('office 2007 openxml php')
							 ->setCategory('Result file');
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1','ID')
            ->setCellValue('B1','日期時間')
            ->setCellValue('C1','浮標號')
            ->setCellValue('D1','浮標電壓')
            ->setCellValue('E1','緯度')
            ->setCellValue('F1','經度')
            ->setCellValue('G1','安全')
            ->setCellValue('H1','能見度')
            ->setCellValue('I1','最大風速')
            ->setCellValue('J1','最大風向')
            ->setCellValue('K1','最大風時')
            ->setCellValue('L1','風速')
            ->setCellValue('M1','風向')
            ->setCellValue('N1','氣壓')
            ->setCellValue('O1','氣溫')
            ->setCellValue('P1','溼度')
            ->setCellValue('Q1','雨量')
            ->setCellValue('R1','水溫')
            ->setCellValue('S1','鹽度')
            ->setCellValue('T1','葉綠素')
            ->setCellValue('U1','濁度')
            ->setCellValue('V1','平均波高')
            ->setCellValue('W1','平均波週期')
            ->setCellValue('X1','最大波高')
            ->setCellValue('Y1','最大波週期')
            ->setCellValue('Z1','十分之一波高')
            ->setCellValue('AA1','十分之一波週期')
            ->setCellValue('AB1','有效波高')
            ->setCellValue('AC1','有效波週期')
            ->setCellValue('AD1','波個數')
            ->setCellValue('AE1','0度波向出現率')
            ->setCellValue('AF1','22.5度波向出現率')
            ->setCellValue('AG1','45度波向出現率')
            ->setCellValue('AH1','67.5度波向出現率')
            ->setCellValue('AI1','90度波向出現率')
            ->setCellValue('AJ1','112.5度波向出現率')
            ->setCellValue('AK1','135度波向出現率')
            ->setCellValue('AL1','157.5度波向出現率')
            ->setCellValue('AM1','180度波向出現率')
            ->setCellValue('AN1','202.5度波向出現率')
            ->setCellValue('AO1','225度波向出現率')
            ->setCellValue('AP1','247.5度波向出現率')
            ->setCellValue('AQ1','270度波向出現率')
            ->setCellValue('AR1','292.5度波向出現率')
            ->setCellValue('AS1','315度波向出現率')
            ->setCellValue('AT1','337.5度波向出現率')
            ->setCellValue('AU1','流速1')
            ->setCellValue('AV1','流向1')
            ->setCellValue('AW1','流速2')
            ->setCellValue('AX1','流向2')
            ->setCellValue('AY1','流速3')
            ->setCellValue('AZ1','流向3')
            ->setCellValue('BA1','流速4')
            ->setCellValue('BB1','流向4')
            ->setCellValue('BC1','流速5')
            ->setCellValue('BD1','流向5')
            ->setCellValue('BE1','流速6')
            ->setCellValue('BF1','流向6')
            ->setCellValue('BG1','流速7')
            ->setCellValue('BH1','流向7')
            ->setCellValue('BI1','流速8')
            ->setCellValue('BJ1','流向8')
            ->setCellValue('BK1','流速9')
            ->setCellValue('BL1','流向9')
            ->setCellValue('BM1','流速10')
            ->setCellValue('BN1','流向10')
            ->setCellValue('BO1','流速11')
            ->setCellValue('BP1','流向11')
            ->setCellValue('BQ1','流速12')
            ->setCellValue('BR1','流向12')
            ->setCellValue('BS1','流速13')
            ->setCellValue('BT1','流向13')
            ->setCellValue('BU1','流速14')
            ->setCellValue('BV1','流向14')
            ->setCellValue('BW1','流速15')
            ->setCellValue('BX1','流向15')
            ->setCellValue('BY1','流速16')
            ->setCellValue('BZ1','流向16')
            ->setCellValue('CA1','流速17')
            ->setCellValue('CB1','流向17')
            ->setCellValue('CC1','流速18')
            ->setCellValue('CD1','流向18')
            ->setCellValue('CE1','流速19')
            ->setCellValue('CF1','流向19')
            ->setCellValue('CG1','流速20')
            ->setCellValue('CH1','流向20')
            ->setCellValue('CI1','流速21')
            ->setCellValue('CJ1','流向21')
            ->setCellValue('CK1','流速22')
            ->setCellValue('CL1','流向22')
            ->setCellValue('CM1','流速23')
            ->setCellValue('CN1','流向23')
            ->setCellValue('CO1','流速24')
            ->setCellValue('CP1','流向24')
            ->setCellValue('CQ1','流速25')
            ->setCellValue('CR1','流向25');
      
			
$i=2;                //定義一個i變數,目的是在迴圈輸出資料是控制行數
 while($rs=mysql_fetch_array($sql)){
 
      $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue("A".$i, $rs[0])
            ->setCellValue("B".$i, $rs[1])
            ->setCellValue("C".$i, $rs[2])
            ->setCellValue("D".$i, $rs[3])          
            ->setCellValue("E".$i, $rs[4])          
            ->setCellValue("F".$i, $rs[5])          
            ->setCellValue("G".$i, $rs[6])          
            ->setCellValue("H".$i, $rs[7])          
            ->setCellValue("I".$i, $rs[8])          
            ->setCellValue("J".$i, $rs[9])          
            ->setCellValue("K".$i, $rs[10])          
            ->setCellValue("L".$i, $rs[11])          
            ->setCellValue("M".$i, $rs[12])          
            ->setCellValue("N".$i, $rs[13])          
            ->setCellValue("O".$i, $rs[14])          
            ->setCellValue("P".$i, $rs[15])          
            ->setCellValue("Q".$i, $rs[16])          
            ->setCellValue("R".$i, $rs[17])          
            ->setCellValue("S".$i, $rs[18])          
            ->setCellValue("T".$i, $rs[19])          
            ->setCellValue("U".$i, $rs[20])          
            ->setCellValue("V".$i, $rs[21])          
            ->setCellValue("W".$i, $rs[22])          
            ->setCellValue("X".$i, $rs[23])          
            ->setCellValue("Y".$i, $rs[24])          
            ->setCellValue("Z".$i, $rs[25])          
            ->setCellValue("AA".$i, $rs[26])          
            ->setCellValue("AB".$i, $rs[27])          
            ->setCellValue("AC".$i, $rs[28])          
            ->setCellValue("AD".$i, $rs[29])          
            ->setCellValue("AE".$i, $rs[30])          
            ->setCellValue("AF".$i, $rs[31])          
            ->setCellValue("AG".$i, $rs[32])          
            ->setCellValue("AH".$i, $rs[33])          
            ->setCellValue("AI".$i, $rs[34])          
            ->setCellValue("AJ".$i, $rs[35])          
            ->setCellValue("AK".$i, $rs[36])          
            ->setCellValue("AL".$i, $rs[37])          
            ->setCellValue("AM".$i, $rs[38])          
            ->setCellValue("AN".$i, $rs[39])          
            ->setCellValue("AO".$i, $rs[40])          
            ->setCellValue("AP".$i, $rs[41])          
            ->setCellValue("AQ".$i, $rs[42])          
            ->setCellValue("AR".$i, $rs[43])          
            ->setCellValue("AS".$i, $rs[44])          
            ->setCellValue("AT".$i, $rs[45])          
            ->setCellValue("AU".$i, $rs[46])          
            ->setCellValue("AV".$i, $rs[47])          
            ->setCellValue("AW".$i, $rs[48])          
            ->setCellValue("AX".$i, $rs[49])          
            ->setCellValue("AY".$i, $rs[50])          
            ->setCellValue("AZ".$i, $rs[51])          
            ->setCellValue("BA".$i, $rs[52])          
            ->setCellValue("BB".$i, $rs[53])          
            ->setCellValue("BC".$i, $rs[54])          
            ->setCellValue("BD".$i, $rs[55])          
            ->setCellValue("BE".$i, $rs[56])          
            ->setCellValue("BF".$i, $rs[57])          
            ->setCellValue("BG".$i, $rs[58])          
            ->setCellValue("BH".$i, $rs[59])          
            ->setCellValue("BI".$i, $rs[60])          
            ->setCellValue("BJ".$i, $rs[61])          
            ->setCellValue("BK".$i, $rs[62])          
            ->setCellValue("BL".$i, $rs[63])          
            ->setCellValue("BM".$i, $rs[64])          
            ->setCellValue("BN".$i, $rs[65])          
            ->setCellValue("BO".$i, $rs[66])          
            ->setCellValue("BP".$i, $rs[67])          
            ->setCellValue("BQ".$i, $rs[68])          
            ->setCellValue("BR".$i, $rs[69])          
            ->setCellValue("BS".$i, $rs[70])
            ->setCellValue("BT".$i, $rs[71])
            ->setCellValue("BU".$i, $rs[72])
            ->setCellValue("BV".$i, $rs[73])
            ->setCellValue("BW".$i, $rs[74])
            ->setCellValue("BX".$i, $rs[75])
            ->setCellValue("BY".$i, $rs[76])
            ->setCellValue("BZ".$i, $rs[77])
            ->setCellValue("CA".$i, $rs[78])
            ->setCellValue("CB".$i, $rs[79])
            ->setCellValue("CC".$i, $rs[80])
            ->setCellValue("CD".$i, $rs[81])
            ->setCellValue("CE".$i, $rs[82])
            ->setCellValue("CF".$i, $rs[83])
            ->setCellValue("CG".$i, $rs[84])
            ->setCellValue("CH".$i, $rs[85])
            ->setCellValue("CI".$i, $rs[86])
            ->setCellValue("CJ".$i, $rs[87])
            ->setCellValue("CK".$i, $rs[88])
            ->setCellValue("CL".$i, $rs[89])
            ->setCellValue("CM".$i, $rs[90])
            ->setCellValue("CN".$i, $rs[91])
            ->setCellValue("CO".$i, $rs[92])
            ->setCellValue("CP".$i, $rs[93])
            ->setCellValue("CQ".$i, $rs[94])
            ->setCellValue("CR".$i, $rs[95]);          
            $i++;
 }
 $objPHPExcel->getActiveSheet()->setTitle($table."_".$starttime."_".$endtime);
 $objPHPExcel->setActiveSheetIndex(0);
 $filename=urlencode($table."_".$starttime."_".$endtime);
//  $objPHPExcel->getActiveSheet()->setTitle('三年級2班');
//  $objPHPExcel->setActiveSheetIndex(0);
//  $filename=date('Y-m-dHis');
//生成xlsx檔案

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'.xlsx"');
header('Cache-Control: max-age=0');
$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');


//生成xls檔案
//  header('Content-Type: application/vnd.ms-excel');
//  header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
//  header('Cache-Control: max-age=0');
//  $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//生成xlsx檔案並存入當前檔案目錄
 function saveExcelToLocalFile($objWriter,$filename){
    // make sure you have permission to write to directory
    $filePath = 'tmp/'.$filename.'.xlsx';
    $objWriter->save($filePath);
    return $filePath;
}
//返回已經存好的檔案目錄地址提供下載
 $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
 $response = array(
     'success' => true,
     'url' => saveExcelToLocalFile($objWriter,$filename)
 );
 echo json_encode($response);
exit();

前臺ajax程式碼部分

 $.ajax({  
    	  	
	      url: 'data/tianjinexcel.php',  
	      dataType:"json",  
	      data:{starttime: $('#starttime').datebox('getValue').replace(/-/g,"").substring(2),
	     	endtime: $('#endtime').datebox('getValue').replace(/-/g,"").substring(2),	
	    		},
	      type:'POST',
	      async:true,
	      beforeSend:function(){
                
                  $("body").showLoading();
    	      },//下面就是獲取到的下載地址,直接通過document.location函式獲取下載
	      success:function(output){
    	      
	    	  $("body").hideLoading();
	    	  alert(output.url);
	    	  document.location.href =("data/"+output.url);
	  
	  },  
	      error: function(){
	    	  $("body").hideLoading();
    	      sweetAlert("錯誤", "匯出excel出錯!", "error");
    	      },  
    	      
	  });