HP通过链式操作将数据输出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.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如下图所示:

 

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

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

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

数据库信息

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

时间: 2024-11-13 08:21:22

HP通过链式操作将数据输出excel(csv)格式的相关文章

PHP对象链式操作实现原理分析_php技巧

本文实例讲述了PHP对象链式操作实现原理.分享给大家供大家参考,具体如下: 什么是链式操作呢?使用jQuery的同学印象应该会很深刻.在jQuery中,我们经常会这样的来操作DOM元素: $("p").css("color").addClass("selected"); 连贯操作看起来的确很酷,也非常的方便代码的阅读.那么在PHP里面是否可以实现呢?答案是肯定的,当然了必须是在OOP中用才行,在过程化的程序中,就没有必要用这种方法了. 在PHP中

jQuery对象的链式操作用法分析_jquery

本文实例讲述了jQuery对象的链式操作用法.分享给大家供大家参考,具体如下: jQuery对象的链式操作 首先来看一个例子: 复制代码 代码如下: $("#myphoto").css("border","solid 2px#FF0000").attr("alt"," good"); 对一个jQuery对象先调用了css()函数修改样式,然后使用attr()函数修改属性,这种调用方式象链一样,所以称为&qu

PHP简单数据库操作类实例【支持增删改查及链式操作】_php技巧

本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类(模型Model),供大家使用.支持增.删.改.查,支持链式操作,代码不到100行,非常小巧方便,很适合小项目的快速部署使用. /** * * @Authot: summer * * @E-mail: wenghang1228@me.com * * @Data: 2015-02-06 * * @Pr

jQuery链式操作的问题

两个问题 1.jQuery的链式操作是如何实现的? 2.为什么要用链式操作? 大家认为这两个问题哪个好回答一点呢? 链式操作 原理相信百度一下一大把,实际上链式操作仅仅是通过对象上的方法最后 return this 把对象再返回回来,对象当然可以继续调用方法啦,所以就可以链式操作了.那么,简单实现一个: //定义一个JS类 function Demo() { } //扩展它的prototype Demo.prototype ={ setName:function (name) { this.na

PHP实现链式操作的核心思想

  这篇文章主要介绍了PHP实现链式操作的核心思想,本文着重讲解它的核心思想,比较直观明子,需要的朋友可以参考下 PHP 链式操作的实现 代码如下: $db->where()->limit()->order(); 在 Common 下创建 Database.php. 链式操作最核心的地方在于:在方法的最后 return $this; Database.php: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php namespace Common;  

让JavaScript中setTimeout支持链式操作的方法

  这篇文章主要介绍了让JavaScript中setTimeout支持链式操作的方法,本文直接给出代码实例,需要的朋友可以参考下 修改很简单,通过参数判断,然后返回下promise对象 代码如下: (function() { var timeout = setTimeout; window.setTimeout = function(fn, time) { if (!time) { time = fn; return $.Deferred(function(dfd) { timeout(func

jquery链式操作的正确使用方法

 jQuery实现方法的链式操作是非常容易的.这里给出正确的使用方法 糟糕的使用方法   代码如下: $second.html(value); $second.on('click',function(){ alert('hello everybody'); }); $second.fadeIn('slow'); $second.animate({height:'120px'},500);     建议使用方法    代码如下: $second.html(value); $second.on('c

PHP实现链式操作的原理详解_php实例

在一个类中有多个方法,当你实例化这个类,并调用方法时只能一个一个调用,类似: db.php <?php class db { public function where() { //code here } public function order() { //code here } public function limit() { //code here } } index.php <?php $db = new db(); $db->where(); $db->order()

jQuery链式操作实例分析_jquery

本文实例讲述了jQuery链式操作.分享给大家供大家参考,具体如下: 从过去的实例中,我们知道jQuery语句可以链接在一起,这不仅可以缩短代码长度,而且很多时候可以实现特殊的效果. <script type="text/javascript"> $(function() { $("div").addClass("css1").filter(function(index) { return index == 1 || $(this).