由于项目需要,今天用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");
},
});