代码改变世界

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 ?>