PHPExcel與ajax結合進行檔案下載
阿新 • • 發佈:2019-02-12
由於專案需要,今天用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"); }, });