好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP链式操作输出excel(csv)

工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了。下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作。说到链式操作,在jquery中可能经常用到,是不是也感觉到链式操作用起来很爽,我们也在这个类中实现下链式操作。

其实链式操作很简单的,就是在前一个类方法最后返回一个该类的对象($this),提供给下一个方法调用。

 

<? php
  class   Array2csv{
      /*  
     *@var string $ext 扩展名 
       */ 
     private   $ext  = 'csv' ;

      /*  * 
     * @desc构造方法
     * @param string $filename 要输出的文件名
     * @param string $ext 扩展名
       */ 
     public   function  __construct( $filename , $ext = null  ){
          ob_start  ();
          header ("Content-type: text/html;charset=utf-8" );
          header ("Content-type: application/x-csv" );
          if (PHP_SAPI == 'cli')  echo  "CLI模式下不能导出csv文件\r" ;
          $this ->ext =  $ext  ===  null  ?  $this ->ext :  $ext  ;
          header ("Content-Disposition: attachment;filename=". $filename .".". $this -> ext);
          ob_flush  ();
          return   $this  ;
    }

      /*  * 
     * @desc 打印excel标题
     * @param array $title 要输出的标题行
     * @param object Array2csv 对象本身
       */     
     public   function  title( $title  ){
          $title  =  implode (",",  $title  );
          echo   $title ."\n" ;
          return   $this  ;
    }

      /*  * 
     * @desc 打印一行excel内容
     * @param array $body 要输出的内容
     * @param object Array2csv 对象本身
       */     
     public   function  body( $body  ){
          if (! is_array ( $body ) ||  empty ( $body  )) {
              return   false  ;
        }
          $body  =  implode (",",  $body  );
          echo   $body ."\n" ;
          return   $this  ;
    }

      /*  * 
     * @desc 打印多行excel内容
     * @param array $bodyArr 要输出的多行内容
     * @param object Array2csv 对象本身
       */     
     public   function  multiBody( $bodyArr  ){
          if (! is_array ( $bodyArr ) ||  empty ( $bodyArr ))  return   false  ;

          foreach  ( $bodyArr   as   $key  =>  $value  ) {
              if ( is_array ( $value  )){
                  $value  =  implode (",",  $value  );
                  echo   $value ."\n" ;
            }
        }
          return   $this  ;
    }
}


  $test  =  new  Array2csv('test' );
  $arr  =  array  (
      array ('luluyrt@163测试数据','奔跑的Man1','奔跑的userman'),
     array ('luluyrt@163测试数据','奔跑的Man2','奔跑的userman'),
     array ('luluyrt@163测试数据','奔跑的Man3','奔跑的userman'),
     array ('luluyrt@163测试数据','奔跑的Man4','奔跑的userman'),
     array ('luluyrt@163测试数据','奔跑的Man5','奔跑的userman'),
     array ('luluyrt@163测试数据','奔跑的Man6','奔跑的userman' )
);
  $test ->title( array ('测试','呵呵','哈哈'))->body( array ('100,sadkl','sdsas','sdvsvdd分'))->multiBody( $arr );

输出的csv如下图所示:

但是这里面有个问题,从编码是utf-8的数据库中取出来的汉字输出excel(csv)会乱码,这个时候你要注意,要在获取数据之前设置数据库的编码,比如说我的需要的是utf-8进行输出,这个时候就要

 $link  =  mysqli_connect ( $host ,  $user ,  $passwd ,  $db  );
  mysqli_query ( $link , "set names utf8");

 

进行编码转换方可正常显示,下面是我的数据库信息和编码前后效果:

数据库信息

 

设置数据库编码前后的对比

查看更多关于PHP链式操作输出excel(csv)的详细内容...

  阅读:39次