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抽象类的更多相关文章

  1. JSON导出CSV中文乱码解决方案

    前言 以往datagrid导出数据全部在后台搞定,现在就想换中思路去解决,正常情况下使用easyui datagrid ajax获取数据源时都是json格式,那么此时需要导出数据时只要把该数据源扔出来 ...

  2. 导出csv文件示例

    导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...

  3. php使用ajax导出CSV或者EXCEl(thinkphp)方法

    首先我强烈推荐看到这篇文章的你将导出文件设置为csv格式的文件 实际测试导出csv文件的速度是excel文件的10几倍左右 首先我先介绍csv文件的导出的方法: 如果你单纯是在数据导出界面上通过用户点 ...

  4. Web端导出CSV

    前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端.但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端. 做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文 ...

  5. 解决PHP下导出csv乱码小记

    我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...

  6. C#导出csv文件 支持中文的解决方案

    #region 导出CSV下载 string exportFileName = "Export" + DateTime.Now.ToString("yyyyMMddHHm ...

  7. OAF_文件系列2_实现OAF导出CSV格式文件ExportButton(案例)

    20150727 Created By BaoXinjian

  8. 使用PHP导入和导出CSV文件

    我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE `student` ( ...

  9. Magcodes.WeiChat——通过CsvFileResult以及DataAnnotations实现导出CSV文件

    我们先来看看效果图: 从上图中可以看出,导出的文件中列名与表格名称保持一致,并且忽略了某些字段. 相关代码实现 我们来看相关代码: 页面代码: @using (Html.BeginForm(" ...

随机推荐

  1. 在npm当中发布自己的包的方法

    首先需要一个注册一个npm账号,注意,必须验证邮箱,不然是无法发布包的!下面是当时的报错 接着在你需要发布的包的文件夹下面打开你的cmd或者其他的命令行输入工具  输入  npm init 初始化你的 ...

  2. pat 甲级 1098. Insertion or Heap Sort (25)

    1098. Insertion or Heap Sort (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  3. EasyUI-Accordion

    EasyUI-Accordion Accordion英文翻译就是 手风琴活 或者 可折叠的 参考效果图: 从图中我们其实也可以将这种组件理解为手风琴式的组件. 该组件方便对数据进行分类管理,在有限空间 ...

  4. Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法

    Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法跟Ubuntu 12.04 - 13.10 以及jellybean编译环境配置没多大区别, 顺便记录下而已: Ub ...

  5. Python学习杂记_5_列表常用操作

    列表操作 列表时用方括号括起来的一组元素值,是可变变量,可通过下表取值,也可以通过下表来修改值,列表中的元素是有序的,可以是不同的基本数据类型,如: names=[1, 2, 3, “abc”, “d ...

  6. LeetCode OJ-- Valid Sudoku

    https://oj.leetcode.com/problems/valid-sudoku/ 给出数独的一部分来,验证给出的这一部分是否为 valid 行上无重复的,且是从 ‘1’ 到‘9’ 列上无重 ...

  7. PHP中的stristr(),strstr(),strpos()速度比较

    测速代码: <?php function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); ret ...

  8. 手游LTV(用户终生价值)计算公式

    在承接APP推广项目中,手游价值变现最直接,核心是获取更多的充值,其中LTV(Lifetime-Value生命周期价值)是一个重要参考指标,可以理解为玩家在其生命周期内对游戏的平均贡献值,为什么要计算 ...

  9. vim display line number

    cd /etc/vim sudo chmod 777 vimrc add :ser number to vimrc, then save and quit

  10. quick-coco2d下的事件

    qucik下的事件机制很简洁,也很简单,能够处理大多数的自定义时间,我们新建一个类型,然后用扩展的方式实现事件,之前quick的文档上很详细,但是很悲哀,傻逼的的网站现在是404,记下来,怕到时候忘记 ...