php 导出CSV抽象类
php 导出CSV抽象类,依据总记录数与每批次记录数,计算总批次。循环导出。避免内存不足的问题。
ExportCSV.class.php
<? php
/** php Export CSV abstract class,依据总记录数与每批次记录数,计算总批次,循环导出。
* Date: 2014-05-16
* Author: fdipzone
* Ver: 1.0
*
* Func:
* public setPageSize 设置每批次导出的记录条数
* public setExportName 设置导出的文件名称
* public setSeparator 设置分隔符
* public setDelimiter 设置定界符
* public export 运行导出
* private getPageCount 计算导出总批次
* private setHeader 设置导出文件header
* private formatCSV 将数据格式化为csv格式
* private escape 转义字符串
* abstract getExportTotal 获取总记录条数,抽象方法,需继承类实现
* abstract getExportFields 获取导出的列名,抽象方法,需继承类实现
* abstract getExportData 获取每页记录,抽象方法,需继承类实现
*/ abstract class ExportCSV{ // class start // 定义子类必需要实现的方法 /** 获取总记录条数
* @return int
*/
abstract protected function getExportTotal(); /** 获取导出的列名
* @return Array
*/
abstract protected function getExportFields(); /** 获取每批次数据
* @param int $offset 偏移量
* @param int $limit 获取的记录条数
* @return Array
*/
abstract protected function getExportData($offset, $limit); // 定义类属性
protected $total = 0; // 总记录数
protected $pagesize = 500; // 每批次导出的记录数
protected $exportName = 'export.csv'; // 导出的文件名称
protected $separator = ','; // 设置分隔符
protected $delimiter = '"'; // 设置定界符 /** 设置每次导出的记录条数
* @param int $pagesize 每次导出的记录条数
*/
public function setPageSize($pagesize=0){
if(is_numeric($pagesize) && $pagesize>0){
$this->pagesize = $pagesize;
}
} /** 设置导出的文件名称
* @param String $filename 导出的文件名称
*/
public function setExportName($filename){
if($filename!=''){
$this->exportName = $filename;
}
} /** 设置分隔符
* @param String $separator 分隔符
*/
public function setSeparator($separator){
if($separator!=''){
$this->separator = $separator;
}
} /** 设置定界符
* @param String $delimiter 定界符
*/
public function setDelimiter($delimiter){
if($delimiter!=''){
$this->delimiter = $delimiter;
}
} /** 导出csv */
public function export(){ // 获取总记录数
$this->total = $this->getExportTotal(); // 没有记录
if(!$this->total){
return false;
} // 计算导出总批次
$pagecount = $this->getPageCount(); // 获取导出的列名
$fields = $this->getExportFields(); // 设置导出文件header
$this->setHeader(); // 循环导出
for($i=0; $i<$pagecount; $i++){ $exportData = ''; if($i==0){ // 第一条记录前先导出列名
$exportData .= $this->formatCSV($fields);
} // 设置偏移值
$offset = $i*$this->pagesize; // 获取每页数据
$data = $this->getExportData($offset, $this->pagesize); // 将每页数据转换为csv格式
if($data){
foreach($data as $row){
$exportData .= $this->formatCSV($row);
}
} // 导出数据
echo $exportData;
} } /** 计算总批次 */
private function getPageCount(){
$pagecount = (int)(($this->total-1)/$this->pagesize)+1;
return $pagecount;
} /** 设置导出文件header */
private function setHeader(){
header('content-type:application/x-msexcel'); $ua = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/MSIE/", $ua)){
header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');
}elseif(preg_match("/Firefox/", $ua)){
header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');
}else{
header('content-disposition:attachment; filename="'.$this->exportName.'"');
} ob_end_flush();
ob_implicit_flush(true);
} /** 格式化为csv格式数据
* @param Array $data 要转换为csv格式的数组
*/
private function formatCSV($data=array()){
// 对数组每一个元素进行转义
$data = array_map(array($this,'escape'), $data);
return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n";
} /** 转义字符串
* @param String $str
* @return String
*/
private function escape($str){
return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str);
} } // class end ?>
demo
<? php // ExportCSV abstract class
require "ExportCSV.class.php"; // 定义继承类
class myexport extends ExportCSV{ // 要导出的数据,实际情况会从db读取
protected $data = array(
array('1','傲雪星枫"','男'),
array('2','傲雪星枫","','男'),
array('3','傲雪星枫","','男'),
array('4',"傲雪星枫\"\"\r\n换行",'男'),
array('5','傲雪星枫,,','男'),
array('6','傲雪星枫"','男'),
array('7','傲雪星枫','男'),
array('8','傲雪星枫','男'),
array('9','傲雪星枫','男'),
array('10','傲雪星枫','男')
); /* 返回总导出记录数
* @return int
*/
protected function getExportTotal(){
return count($this->data);
} /** 返回导出的列名
* @return Array
*/
protected function getExportFields(){
$title = array('id','name','gender');
return $title;
} /* 返回每批次的记录
* @param int $offset 偏移量
* @param int $limit 获取的记录条数
* @return Array
*/
protected function getExportData($offset, $limit){
return array_slice($this->data, $offset, $limit);
} } // 导出
$obj = new myexport();
$obj->setPageSize(1);
$obj->setExportName('myexport.csv');
$obj->setSeparator(',');
$obj->setDelimiter('"');
$obj->export(); ?>
源代码下载地址:点击查看
php 导出CSV抽象类的更多相关文章
- JSON导出CSV中文乱码解决方案
前言 以往datagrid导出数据全部在后台搞定,现在就想换中思路去解决,正常情况下使用easyui datagrid ajax获取数据源时都是json格式,那么此时需要导出数据时只要把该数据源扔出来 ...
- 导出csv文件示例
导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...
- php使用ajax导出CSV或者EXCEl(thinkphp)方法
首先我强烈推荐看到这篇文章的你将导出文件设置为csv格式的文件 实际测试导出csv文件的速度是excel文件的10几倍左右 首先我先介绍csv文件的导出的方法: 如果你单纯是在数据导出界面上通过用户点 ...
- Web端导出CSV
前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端.但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端. 做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文 ...
- 解决PHP下导出csv乱码小记
我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...
- C#导出csv文件 支持中文的解决方案
#region 导出CSV下载 string exportFileName = "Export" + DateTime.Now.ToString("yyyyMMddHHm ...
- OAF_文件系列2_实现OAF导出CSV格式文件ExportButton(案例)
20150727 Created By BaoXinjian
- 使用PHP导入和导出CSV文件
我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE `student` ( ...
- Magcodes.WeiChat——通过CsvFileResult以及DataAnnotations实现导出CSV文件
我们先来看看效果图: 从上图中可以看出,导出的文件中列名与表格名称保持一致,并且忽略了某些字段. 相关代码实现 我们来看相关代码: 页面代码: @using (Html.BeginForm(" ...
随机推荐
- jackson 的UnrecognizedPropertyException错误
阅读更多 前段时间,使用jackson封装了json字符串转换为javabean的方法,代码如下: public static <T> T renderJson2Object(String ...
- Mongoose 表实例
/********** 用户表 BY Jaysir 2015.6.21 *********** *********** 可搜索以下关键词来查看未实现功能 *********** *********** ...
- MMU介绍【转】
转自:http://blog.csdn.net/martree/article/details/3321578 虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前 ...
- 获取网页是手机端还是PC端访问
C#方式: /// <summary> /// 是否手机访问 /// </summary> /// <returns></returns> public ...
- Linux 中/etc/profile、~/.bash_profile 环境变量配置及执行过程
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell.对于UNIX,可能是CShelll.环境变量是通过 ...
- HDU 5242 Game(树上贪心)
题目链接 Game 题目的意思很简单, 就是要找一棵树权值最大等等前K条链. 在本题中,走的次数等于min(叶子结点个数,k) tree[i].sum意为从i号结点出发走到某个叶子结点能得到的最大总价 ...
- encodeURI 解码 编码
var uriStr = "http://www.baidu.com?name=张三&num=001 zs"; var uriec = encodeURI(uriStr); ...
- advanced-performance-troubleshooting-waits-latches-spinlocks
https://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/
- ArcGIS 开发时,解决__类型“XX”同时存在于“”和“”中__的错误
错误提示:类型“ESRI.ArcGIS.ADF.BaseClasses.BaseCommand”同时存在于“e:\Program Files\ArcGIS\DeveloperKit10.2\DotNe ...
- Docker 限制容器资源
默认情况下,容器没有资源的限制,它可以使用整个主机的所有资源.Dcoker提供了控制资源的方法, 多少内存,CPU,IO,都可以在docker run使用标志符来设置. 内存 Docker可以 ...