PHPExcel简单列表导出

    PHPExcel是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。下面主要介绍的是:PHPExcel简单列表导出。


    生成Excel表的思路对照

    首先我们需要到官网上,下载PHPExcel的包,包里我们把classes单独提取出来,classes里面有一个文件使PHPExcel.php这个是我们主要用到的,在下面的例子中,我把classes文件夹重命名为了PHPExcel。下面这张图对比了我们平常创建一个excel需要做什么和我们用代码创建一个excel的相同的地方,我们应该看到他们非常相似:


    生成Excel表基本代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
    //获取当前路径
    $dir = dirname(__FILE__);
    //包含PHPExcel文件
    require_once("./PHPExcel/PHPExcel.php");
    //创建了一个表格
    $phpExcelObj = new PHPExcel();
    //获取当前活动sheet
    $activeSheet = $phpExcelObj->getActiveSheet();
    //var_dump($activeSheet);
    $activeSheet->setTitle("demo");
    //给当前的表格填充数据
    $activeSheet->setCellValue("A1","姓名")->setCellValue("B1","分数");
    $activeSheet->setCellValue("A2","Seven")->setCellValue("B2","75");
    //按照指定格式生成excel文件
    $objWriter = PHPExcel_IOFactory::createWriter($phpExcelObj,"Excel2007");
    //保存文档
    $objWriter->save($dir."/demo.xlsx");
    ?>

    就可以在当前目录下生成一个demo.xlsx,里面的内容:

    先前可以试着打印下$phpExcelObj对象,如果看到下面的可以说明引入成功:

    还有下面这样的一种方式,以数组来填充:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    $dir = dirname(__FILE__); //string 'D:\wamp\wamp\www\phpexcel' (length=25)
    require_once("./PHPExcel/PHPExcel.php");
    $phpExcelObj = new PHPExcel(); //创建了一个表格
    $activeSheet = $phpExcelObj->getActiveSheet();
    //var_dump($activeSheet);//获取当前活动sheet
    $activeSheet->setTitle("demo");
    //给当前的表格填充数据
    $array = array(
    array(),
    array("","姓名","分数"),
    array("","李四","60"),
    array("","王五","90")
    );
    $activeSheet->fromArray($array);
    $objWriter = PHPExcel_IOFactory::createWriter($phpExcelObj,"Excel2007");
    $objWriter->save($dir."/demo1.xlsx");
    ?>

    这种方法肯定和上面的比有优点,比如设置起来比较方便,但是也有不好的地方,比较耗内存。


    把数据库的数据录入excel中

    刚刚我们的是直接手动录入,这种情况在项目中是使用比较少的,下面这种我们把数据从数据库录入excel中是最常见的。比如我们在生成订单表的时候,生成excel对卖家来说会是经常需要的。

    比如我们在数据库中有这样一张表:

    我们需要按照年级把成绩分出来,并得到下面的结果,如果我们手动录入肯定会很麻烦,看看下面的PHPExcel方法:

    首先我们有一个数据库配置文件:config.php,在这里面要设置数据库,字符集等信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $config = array(
    'host'=>'127.0.0.1',
    'username'=>'root',
    'password'=>'****',
    'database'=>'test',
    'charset'=>'utf8'
    );
    ?>

    然后我们需要一个db类,用于我们从数据库取出数据,我们命名为db.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    require_once('./config.php');
    class db{
    public $conn = null;
    public function __construct($config){
    $this->conn = mysql_connect($config['host'],$config['username'],$config['password']) or die(mysql_error());
    mysql_select_db($config['database']) or die(mysql_error());
    mysql_query("set names ".$config['charset']) or die(mysql_error());
    }
    public function getResult($sql){
    $res = mysql_query($sql);
    $arr = array();
    while($row = mysql_fetch_assoc($res)){
    $arr[] = $row;
    }
    return $arr;
    }
    public function getDataByGrade($grade){
    $sql = "select * from student where grade = ".$grade." order by score desc";
    $res = self::getResult($sql);
    return $res;
    }
    }
    ?>

    下面是我们的主文件,我们把上面的文件都包含进来,这里注意因为我们在db里已经require了config.php,所以这里不用再包含config.php了,或者我们用require_once也可以。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    $dir = dirname(__FILE__);
    require $dir."/db.php";
    require $dir."/PHPExcel/PHPExcel.php";
    $db = new db($config);
    $objPHPExcel = new PHPExcel();
    for ($i=1; $i <= 3; $i++) {
    if($i>1){
    $objPHPExcel->createSheet();
    }
    $objPHPExcel->setActiveSheetIndex($i-1);
    $objSheet = $objPHPExcel->getActiveSheet();
    $objSheet->setTitle($i."年级");
    $data = $db->getDataByGrade($i);
    $objSheet->setCellValue("A1","姓名")->setCellValue("B1","年级")->setCellValue("C1","成绩");
    $j=2;
    foreach ($data as $key => $value) {
    $objSheet->setCellValue("A".$j,$value['name'])->setCellValue("B".$j,$value['grade'])->setCellValue("C".$j,$value['name']);
    $j++;
    }
    }
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
    $objWriter->save($dir."/export_1.xls");
    ?>

    主要的思路就是我们按照先前我们的步骤新建表,创建sheet,这里不同的是,我们要把三个年级的放到不同的sheet里,所以不能只create一个sheet,要根据grade有多少个循环创建,并且把相应的数据放进去。


    将excel输出到浏览器

    我们也可以吧excel保存到浏览器,这个时候我们只用改动一点代码就行了,比如这里我们设置header头,告诉浏览器生成的类型。注意这里save方法发生了变化的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    $dir = dirname(__FILE__);
    require $dir."/db.php";
    require $dir."/PHPExcel/PHPExcel.php";
    $db = new db($config);
    $objPHPExcel = new PHPExcel();
    for ($i=1; $i <= 3; $i++) {
    if($i>1){
    $objPHPExcel->createSheet();
    }
    $objPHPExcel->setActiveSheetIndex($i-1);
    $objSheet = $objPHPExcel->getActiveSheet();
    $objSheet->setTitle($i."年级");
    $data = $db->getDataByGrade($i);
    $objSheet->setCellValue("A1","姓名")->setCellValue("B1","年级")->setCellValue("C1","成绩");
    $j=2;
    foreach ($data as $key => $value) {
    $objSheet->setCellValue("A".$j,$value['name'])->setCellValue("B".$j,$value['grade'])->setCellValue("C".$j,$value['name']);
    $j++;
    }
    }
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
    //$objWriter->save($dir."/export_1.xls");
    browser_export("Excel5",'browser_export01.xls');
    $objWriter->save("php://output");
    function browser_export($type,$filename){
    if($type=="Excel5"){
    header('Content-Type: application/vnd.ms-excel');//告诉浏览器将要输出excel03文件
    }else{
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器数据excel07文件
    }
    header('Content-Disposition: attachment;filename="'.$filename.'"');//告诉浏览器将输出文件的名称
    header('Cache-Control: max-age=0');//禁止缓存
    }
    ?>

    如果不告诉浏览器名称的话,就会把当前文本的名称当成输出excel的名称。header就是告诉浏览器文件类型。必须有。

    最后的结果,就是我一刷新就出来了下载这个:


    总结

    这个还有很多方法我没有写到,比如我们怎么样设置居中,怎么样添加线性表,怎么样导入Excel表,这个我会回头有时间再写一篇博客的。还有很多设置样式的,我们其实要做的就是调用它的接口就行。因为这样的东西我觉得不是经常用就会忘,所以做一次大概知道是什么思路和样子就行了,以后要用的时候再查一查文档,看看以前做的例子,应该能很快就想起来的,那些函数的调用也没有太大的必要记住。