PHPExcel導出excel表格
一、動態生成的內容如何能當成文件來下載呢?
方法:1.將Content-Type設置成application/octet-stream就可以了,即【header('Content-Type: application/octet-stream'); 】
2.用Content-Disposition設置下載的文件名,即【header('Content-Disposition: attachment; filename=' . $filename);】
a.基本上的下載程序都是這么寫的:
<?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
b.平時我們也要考慮到瀏覽器的兼容性和中文文件名亂碼的問題:<?php
//獲取user agent
$ua = $_SERVER["HTTP_USER_AGENT"];
$filename = "文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
//判斷是否為IE瀏覽器(IE10以下可以用MSIE判斷,以上不行)
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else { //其他
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
print 'ABC';
?>
二、原始一點的方法:發送header,用附件的表頭發送到用戶瀏覽器表示是要下載的,然后讀出數據庫中的數據,一條一條的解析,寫入excel格式的文件中
<?php
/**
*\n軟換行
*\r軟空格
*\t挑格(跳到下一列)
*/
// 連接數據庫
$db = @mysql_connect('localhost','root','root');
if(!$db){
die('Could not connect: ' . mysql_error());
}
//設置字符集
mysql_query("set names utf8");
//打開數據庫
mysql_select_db("database");
$sql = "SELECT * FROM table_name LIMIT 100";
$result = mysql_query($sql);
header('Content-Type: application/octet-stream');//下載
header("Content-Disposition: attachment; filename=sql.xls");//文件
header("Pragma: no-cache"); //不緩存
$title = '數據庫:vvt,數據表:vvt_user,備份日期:'.date('Y/m/d/H/i/s');
//輸出標題并換行(一個'\n'代表一行)
echo $title."\n";
//mysql_num_fields返回結果集中字段的數量
$columns_num = mysql_num_fields($result);
//mysql_field_name返回結果集中的字段名,
for($i=0;$i<$columns_num;$i++){
//輸出字段名稱(表頭)
echo mysql_field_name($result,$i). "\t";
}
//將字段輸出到一行后,下面就是拼接顯示每一行字段對應的value
print("\n");
//添加內容(\t是跳列,跳到下一列)
$tab = "\t";
//mysql_num_rows返回結果集行數
if($result && mysql_num_rows($result)){
//得到關聯數組mysql_fetch_assoc,mysql_fetch_row得到索引數組先循環數據
while($rows = mysql_fetch_row($result)){
// var_dump($rows);die;
$table_data = "";
//循環字段數,將每條數據對應的字段值填入對應的地方
for($j=0;$j<$columns_num;$j++){
if(!isset($rows[$j])){
//沒值就使用'NULL'占位,并拼接"\t"跳到下一格
$table_data .= 'NULL'.$tab;
}elseif($rows[$j]){
$table_data .= "{$rows[$j]}".$tab;
}else{
$table_data .= "".$tab;
}
}
$table_data = str_replace($tab.'$',"",$table_data);
// $table_data .= "\t";
print(trim($table_data));
print("\n");
$i++;
}
}
//關閉mysql連接
mysql_close($con);
?>
三、PHPExcel庫
可以到官網去下載:http://phpexcel.codeplex.com/,解壓后里面有三個目錄
Classes:此文件夾中是PHPExcel核心類庫文件,我們對excel報表的處理都是通過此文件夾中的類文件來完成的,注意:所有的類名都是以PHPExcel_*開頭的
Documentation:這個文件夾中存放的是PHPExcel類庫的英文說明文檔
Examples:是一些小的測試案例,這些小案例對于我們入門是非常有幫助的
拓展:當輸出數字字符串到excel文件中時,可在數字字符串前面拼接一個空格即可(或者指定單元格的數據類型為文本類型)
<?php
//引入PHPExcel文件和Excel2007文件(用于輸出.xls的)、Excel5(用于低版本的xls)
require_once './PHPExcel/Classes/PHPExcel.php';
require_once './PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
require_once './PHPExcel/Classes/PHPExcel/Writer/Excel5.php';
//實例化PHPExcel對象
$objExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel2007($objExcel);
// $objWriter = new PHPExcel_Writer_Excel5($objExcel);非2007格式
//設置一個活動表(第一個工作表為活動表)
$objExcel->setActiveSheetIndex(0);
/*********************************************部分功能說明 start*********************************************/
//設置單元格內容setCellValue(設置單元格的值)、setCellValueExplicit(設置單元格的值,并顯示的指定數據的類型)
$objExcel->getActiveSheet()->setCellValueExplicit('A1','名字',PHPExcel_Cell_DataType::TYPE_STRING);
$objExcel->getActiveSheet()->setCellValue('A1','名字');
//文字水平居中setHorizontal
$objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal($option);
//文字垂直居中setVertical
$objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical($option);
// 合并
$objExcel->getActiveSheet()->mergeCells('A1:B1');
// 拆分
$objExcel->getActiveSheet()->unmergeCells('A1:B1');
//設置單元格列setWidth(寬度)、setAutoSize(列的寬度剛好為字體內容的寬度)
$objExcel->getActiveSheet()->getColumnDimension('A')->setWidth('10')->setAutoSize(true);
//設置字體setName(字體)、setSize(大小)、setBold(粗體)、setUnderline(設置下劃線)、setItalic(字體傾斜)
$objExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('黑體')->setSize(20)
->setBold(true)->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE)->setItalic();
//設置字體顏色
$objExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor()
->setARGB(PHPExcel_Style_Color::COLOR_BLUE);
//設置單元格邊框樣式(getTop、getLeft、getRight、getBottom)
$objExcel->getActiveSheet()->getStyle('B4')->getBorders()->getLeft()
->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
//設置單元格邊背景
$objExcel->getActiveSheet()->getStyle('B5')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
//設置工作表保護(導出的表格為只讀,不能編輯)
$objExcel->getActiveSheet()->getProtection()->setSheet(true);
/*********************************************部分功能說明 end*********************************************/
//輸出到瀏覽器(文件名為中文時要轉碼使用iconv或mb_convert_encoding)
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$filename.'.xls"');
header("Content-Transfer-Encoding: binary");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$objWriter->save('php://output');exit;
?>
下面是部分參數:
setUnderline的部分參數:
PHPExcel_Style_Font::UNDERLINE_NONE
PHPExcel_Style_Font::UNDERLINE_DOUBLE(雙下劃線)
PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING(雙下劃線)
PHPExcel_Style_Font::UNDERLINE_SINGLE(下劃線)
PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING(下劃線)
setVertical參數:
PHPExcel_Style_Alignment::VERTICAL_TOP(頂部)
PHPExcel_Style_Alignment::VERTICAL_CENTER(垂直居中)
PHPExcel_Style_Alignment::VERTICAL_BOTTOM(底部)
PHPExcel_Style_Alignment::VERTICAL_JUSTIFY
setHorizontal參數:
PHPExcel_Style_Alignment::HORIZONTAL_GENERAL
PHPExcel_Style_Alignment::HORIZONTAL_LE
PHPExcel_Style_Alignment::HORIZONTAL_CENTER(水平居中)
PHPExcel_Style_Alignment::HORIZONTAL_RIGHT(右對齊)
PHPExcel_Style_Alignment::HORIZONTAL_FILL
PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY
PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS
四、使用PHPExcel庫對于大數據的支持度不是很好,很容易達到php內存上限,這里利用fputcsv寫CSV(這是一種逗號分割值文件格式)
<?php
// 輸出Excel文件頭,可把excel.csv換成你要的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="excel.csv"');
header('Cache-Control: max-age=0');
$db = @mysql_connect('localhost','root','root');
if(!$db){
die('Could not connect: ' . mysql_error());
}
//設置字符集
mysql_query("set names utf8");
//打開數據庫
mysql_select_db("database");
$sql = "SELECT id,'活動名稱',user_id,u_name,reward,CASE r_level WHEN 1 THEN '中獎' WHEN 0 THEN '未中獎' END,CASE type WHEN 1 THEN '獎勵1' WHEN '2' THEN '獎勵2' WHEN 3 THEN '獎勵3' END,add_time FROM tablename";
$result = mysql_query($sql);
$head = array('id','活動名稱','用戶id','用戶名','中獎額度','是否中獎','中獎類型','抽獎時間');
//打開php文件句柄,php://output表示直接輸出到瀏覽器,a表示寫入方式打開
$fp = fopen('php://output', 'a');
foreach($head as $key=>$val){
$head[$key] = mb_convert_encoding($val,'GBK','UTF-8');
}
//將數據通過fputcsv寫到文件句柄
fputcsv($fp,$head);
//計數
$total = 0;
//每隔1000行刷新一下緩存buffer,不要太大,也不要太小
$limit = 1000;
if($result && mysql_num_rows($result)){
while($rows = mysql_fetch_row($result)){
$total++;
if($total == $limit){
//送出緩沖區的內容
ob_flush();
//刷新php程序的緩存
flush();
$total = 0;
}
foreach($rows as $k=>$v){
$rows[$k] = mb_convert_encoding($v,'GBK','UTF-8');
}
fputcsv($fp,$rows);
}
die();
}
?>

掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流