• 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文件
    ";
            $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."
    ";
            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."
    ";
            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."
    ";
                }
            }
            return $this;
        }
    }
    
    
    $test = new Array2csv('test');
    $arr = array(
        array('luluyrt@163.com','奔跑的Man1','奔跑的userman'),
        array('luluyrt@163.com','奔跑的Man2','奔跑的userman'),
        array('luluyrt@163.com','奔跑的Man3','奔跑的userman'),
        array('luluyrt@163.com','奔跑的Man4','奔跑的userman'),
        array('luluyrt@163.com','奔跑的Man5','奔跑的userman'),
        array('luluyrt@163.com','奔跑的Man6','奔跑的userman')
    );
    $test->title(array('测试','呵呵','哈哈'))->body(array('100,sadkl','sdsas','sdvsvdd分'))->multiBody($arr);

    输出的csv如下图所示:

    2014-12-08_223954

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

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

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

    2014-12-08_225332

    数据库信息

    2014-12-08_225430 2014-12-08_225359

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

    send Me~

  • 相关阅读:
    [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载
    [JavaEE] WEB-INF有关的目录路径总结
    网站标题分隔符
    [Windows] 解决kmplayer播放rmvb文件音视不同步
    [MySQL] 数据统计 —— 按周,按月,按日分组统计数据
    [Java] JSTL格式化时间计算时差
    [C.Sharp] TimeSpan的用法,获取测试程序运行时间
    [设计模式] .NET设计模式笔记
    Spring Boot使用redis做数据缓存
    Spring Boot使用redis做数据缓存
  • 原文地址:https://www.cnblogs.com/iforever/p/4152177.html
Copyright © 2020-2023  润新知