php:PHPExcel导出excel表格
2016-05-13 14:23 ZengGW 阅读(822) 评论(0) 编辑 收藏 举报一、动态生成的内容如何能当成文件来下载呢?
方法:1.将Content-Type设置成application/octet-stream就可以了,即【header('Content-Type: application/octet-stream'); 】
2.用Content-Disposition设置下载的文件名,即【header('Content-Disposition: attachment; filename=' . $filename);】
a.基本上的下载程序都是这么写的:
1 <?php 2 $filename = "document.txt"; 3 header('Content-Type: application/octet-stream'); 4 header('Content-Disposition: attachment; filename=' . $filename); 5 print "Hello!"; 6 ?>
b.平时我们也要考虑到浏览器的兼容性和中文文件名乱码的问题:
1 <?php 2 //获取user agent 3 $ua = $_SERVER["HTTP_USER_AGENT"]; 4 $filename = "文件名.txt"; 5 $encoded_filename = urlencode($filename); 6 $encoded_filename = str_replace("+", "%20", $encoded_filename); 7 8 header('Content-Type: application/octet-stream'); 9 10 //判断是否为IE浏览器(IE10以下可以用MSIE判断,以上不行) 11 if (preg_match("/MSIE/", $ua)) { 12 header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); 13 } else if (preg_match("/Firefox/", $ua)) { 14 header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"'); 15 } else { //其他 16 header('Content-Disposition: attachment; filename="' . $filename . '"'); 17 } 18 19 print 'ABC'; 20 ?>
二、原始一点的方法:发送header,用附件的表头发送到用户浏览器表示是要下载的,然后读出数据库中的数据,一条一条的解析,写入excel格式的文件中
1 <?php 2 /** 3 *\n软换行 4 *\r软空格 5 *\t挑格(跳到下一列) 6 */ 7 // 连接数据库 8 $db = @mysql_connect('localhost','root','root'); 9 10 if(!$db){ 11 die('Could not connect: ' . mysql_error()); 12 } 13 14 //设置字符集 15 mysql_query("set names utf8"); 16 //打开数据库 17 mysql_select_db("database"); 18 19 $sql = "SELECT * FROM table_name LIMIT 100"; 20 $result = mysql_query($sql); 21 22 header('Content-Type: application/octet-stream');//下载 23 header("Content-Disposition: attachment; filename=sql.xls");//文件 24 header("Pragma: no-cache"); //不缓存 25 26 $title = '数据库:vvt,数据表:vvt_user,备份日期:'.date('Y/m/d/H/i/s'); 27 //输出标题并换行(一个'\n'代表一行) 28 echo $title."\n"; 29 30 //mysql_num_fields返回结果集中字段的数量 31 $columns_num = mysql_num_fields($result); 32 33 //mysql_field_name返回结果集中的字段名, 34 for($i=0;$i<$columns_num;$i++){ 35 //输出字段名称(表头) 36 echo mysql_field_name($result,$i). "\t"; 37 } 38 39 //将字段输出到一行后,下面就是拼接显示每一行字段对应的value 40 print("\n"); 41 42 //添加内容(\t是跳列,跳到下一列) 43 $tab = "\t"; 44 //mysql_num_rows返回结果集行数 45 if($result && mysql_num_rows($result)){ 46 //得到关联数组mysql_fetch_assoc,mysql_fetch_row得到索引数组先循环数据 47 while($rows = mysql_fetch_row($result)){ 48 // var_dump($rows);die; 49 $table_data = ""; 50 //循环字段数,将每条数据对应的字段值填入对应的地方 51 for($j=0;$j<$columns_num;$j++){ 52 if(!isset($rows[$j])){ 53 //没值就使用'NULL'占位,并拼接"\t"跳到下一格 54 $table_data .= 'NULL'.$tab; 55 }elseif($rows[$j]){ 56 $table_data .= "{$rows[$j]}".$tab; 57 }else{ 58 $table_data .= "".$tab; 59 } 60 } 61 62 $table_data = str_replace($tab.'$',"",$table_data); 63 // $table_data .= "\t"; 64 print(trim($table_data)); 65 print("\n"); 66 $i++; 67 } 68 } 69 70 //关闭mysql连接 71 mysql_close($con); 72 ?>
三、PHPExcel库
可以到官网去下载:http://phpexcel.codeplex.com/,解压后里面有三个目录
Classes:此文件夹中是PHPExcel核心类库文件,我们对excel报表的处理都是通过此文件夹中的类文件来完成的,注意:所有的类名都是以PHPExcel_*开头的
Documentation:这个文件夹中存放的是PHPExcel类库的英文说明文档
Examples:是一些小的测试案例,这些小案例对于我们入门是非常有帮助的
拓展:当输出数字字符串到excel文件中时,可在数字字符串前面拼接一个空格即可(或者指定单元格的数据类型为文本类型)
1 <?php 2 //引入PHPExcel文件和Excel2007文件(用于输出.xls的)、Excel5(用于低版本的xls) 3 require_once './PHPExcel/Classes/PHPExcel.php'; 4 require_once './PHPExcel/Classes/PHPExcel/Writer/Excel2007.php'; 5 require_once './PHPExcel/Classes/PHPExcel/Writer/Excel5.php'; 6 7 //实例化PHPExcel对象 8 $objExcel = new PHPExcel(); 9 $objWriter = new PHPExcel_Writer_Excel2007($objExcel); 10 // $objWriter = new PHPExcel_Writer_Excel5($objExcel);非2007格式 11 12 //设置一个活动表(第一个工作表为活动表) 13 $objExcel->setActiveSheetIndex(0); 14 /*********************************************部分功能说明 start*********************************************/ 15 //设置单元格内容setCellValue(设置单元格的值)、setCellValueExplicit(设置单元格的值,并显示的指定数据的类型) 16 $objExcel->getActiveSheet()->setCellValueExplicit('A1','名字',PHPExcel_Cell_DataType::TYPE_STRING); 17 $objExcel->getActiveSheet()->setCellValue('A1','名字'); 18 19 //文字水平居中setHorizontal 20 $objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal($option); 21 //文字垂直居中setVertical 22 $objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical($option); 23 // 合并 24 $objExcel->getActiveSheet()->mergeCells('A1:B1'); 25 // 拆分 26 $objExcel->getActiveSheet()->unmergeCells('A1:B1'); 27 //设置单元格列setWidth(宽度)、setAutoSize(列的宽度刚好为字体内容的宽度) 28 $objExcel->getActiveSheet()->getColumnDimension('A')->setWidth('10')->setAutoSize(true); 29 //设置字体setName(字体)、setSize(大小)、setBold(粗体)、setUnderline(设置下划线)、setItalic(字体倾斜) 30 $objExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('黑体')->setSize(20) 31 ->setBold(true)->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE)->setItalic(); 32 //设置字体颜色 33 $objExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor() 34 ->setARGB(PHPExcel_Style_Color::COLOR_BLUE); 35 //设置单元格边框样式(getTop、getLeft、getRight、getBottom) 36 $objExcel->getActiveSheet()->getStyle('B4')->getBorders()->getLeft() 37 ->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN); 38 //设置单元格边背景 39 $objExcel->getActiveSheet()->getStyle('B5')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); 40 //设置工作表保护(导出的表格为只读,不能编辑) 41 $objExcel->getActiveSheet()->getProtection()->setSheet(true); 42 43 /*********************************************部分功能说明 end*********************************************/ 44 //输出到浏览器(文件名为中文时要转码使用iconv或mb_convert_encoding) 45 header("Content-Type: application/force-download"); 46 header("Content-Type: application/octet-stream"); 47 header("Content-Type: application/download"); 48 header('Content-Disposition:inline;filename="'.$filename.'.xls"'); 49 header("Content-Transfer-Encoding: binary"); 50 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 51 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 52 header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 53 header("Pragma: no-cache"); 54 $objWriter->save('php://output');exit; 55 56 ?>
下面是部分参数:
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(这是一种逗号分割值文件格式)
1 <?php 2 // 输出Excel文件头,可把excel.csv换成你要的文件名 3 header('Content-Type: application/vnd.ms-excel'); 4 header('Content-Disposition: attachment;filename="excel.csv"'); 5 header('Cache-Control: max-age=0'); 6 7 $db = @mysql_connect('localhost','root','root'); 8 9 if(!$db){ 10 die('Could not connect: ' . mysql_error()); 11 } 12 13 //设置字符集 14 mysql_query("set names utf8"); 15 //打开数据库 16 mysql_select_db("database"); 17 18 $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"; 19 $result = mysql_query($sql); 20 21 $head = array('id','活动名称','用户id','用户名','中奖额度','是否中奖','中奖类型','抽奖时间'); 22 23 //打开php文件句柄,php://output表示直接输出到浏览器,a表示写入方式打开 24 $fp = fopen('php://output', 'a'); 25 26 foreach($head as $key=>$val){ 27 $head[$key] = mb_convert_encoding($val,'GBK','UTF-8'); 28 } 29 30 //将数据通过fputcsv写到文件句柄 31 fputcsv($fp,$head); 32 33 //计数 34 $total = 0; 35 36 //每隔1000行刷新一下缓存buffer,不要太大,也不要太小 37 $limit = 1000; 38 39 if($result && mysql_num_rows($result)){ 40 while($rows = mysql_fetch_row($result)){ 41 $total++; 42 if($total == $limit){ 43 //送出缓冲区的内容 44 ob_flush(); 45 //刷新php程序的缓存 46 flush(); 47 48 $total = 0; 49 } 50 51 foreach($rows as $k=>$v){ 52 $rows[$k] = mb_convert_encoding($v,'GBK','UTF-8'); 53 } 54 55 fputcsv($fp,$rows); 56 57 }
62 die(); 58 } 59 60 ?>