工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了。下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作。说到链式操作,在jquery中可能经常用到,是不是也感觉到链式操作用起来很爽,我们也在这个类中实现下链式操作。
其实链式操作很简单的,就是在前一个类方法最后返回一个该类的对象($this),提供给下一个方法调用。
代码如下 | 复制代码 |
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('[email protected]','奔跑的Man1','奔跑的userman'), array('[email protected]','奔跑的Man2','奔跑的userman'), array('[email protected]','奔跑的Man3','奔跑的userman'), array('[email protected]','奔跑的Man4','奔跑的userman'), array('[email protected]','奔跑的Man5','奔跑的userman'), array('[email protected]','奔跑的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");
进行编码转换方可正常显示,下面是我的数据库信息和编码前后效果:
数据库信息
设置数据库编码前后的对比
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔