工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了。下面是我的一个输出简单的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");

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

数据库信息

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

send Me~

PHP链式操作输出excel(csv)的更多相关文章

  1. ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作

    查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...

  2. php链式调用(链式操作)

    2017年6月28日 10:41:19 星期三 情景: 在多次处理数组的时候, 要自定义好多个临时变量, 起名字特别麻烦 于是, 就想到利用PHP的 1.魔法方法__call 2.不定参数, 参数自动 ...

  3. C++中的链式操作

    代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...

  4. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

  5. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  6. jQuery链式操作[转]

    用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...

  7. php类自动装载、链式操作、魔术方法

    1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...

  8. PHP 设计模式 笔记与总结(4)PHP 链式操作的实现

    PHP 链式操作的实现 $db->where()->limit()->order(); 在 Common 下创建 Database.php. 链式操作最核心的地方在于:在方法的最后 ...

  9. PHP 链式操作

    所谓链式操作最简单的理解就是 操作完毕之后再返回对象$this 想必大家工作中基本都快用烂了得东西. 下面就是一个链式操作MYSQL数据库类. 最常见的链式操作 每一个方法操作之后,返回一个对象,直到 ...

随机推荐

  1. 利用performance属性查看网页性能

    一般我们可以通过浏览器的调试工具-网络面板,或者代理工具查看网页加载过程中的各个阶段的耗时.而利用window.performance属性则可以获得更为精确的原始数据,以毫秒为单位,精确到微秒. pe ...

  2. 跟我学习Storm_Storm简介

    Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...

  3. Vue系列: 如何通过组件的属性props设置样式

    比如我们要在vue中显示百度地图,然后将相关的代码包装成组件,然后需要由外部来设置组件的高度,关于props的介绍,可以参考: http://cn.vuejs.org/guide/components ...

  4. win7下IIS配置以及域名映射方法

    win7下IIS配置以及域名映射方法 第一步:打开控制面板,选择程序与功能,如下图: 第二步:双击打开程序与功能面板,如下图: 第三步:打开”打开或关闭windows功能”(红线圈起来的地方),如下图 ...

  5. C# StopWatch的使用

    在做项目的时候,需要输出数据库操作的耗时,自己写了个方法.老大看到后,奇怪我为什么不用现成的.才知道有StopWatch这个类. 属性       名称 说明 Elapsed 获取当前实例测量得出的总 ...

  6. (二十一)状态模式详解(DOTA版)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本次LZ给各位介绍状态模式, ...

  7. 【JavaEE企业应用实战学习记录】struts2实现登录并获取各个范围的数据

    package sanglp; import com.opensymphony.xwork2.*; /** * Created by Administrator on 2016/10/6. */ pu ...

  8. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  9. 对C语言中指针的一些新认识

    学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的    指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...

  10. SharedPrefernces使用实例讲解

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...