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. Windows + Eclipse 构建mahout运行环境

    mahout的完整运行还是需要hadoop的支持的,不过很多算法只需要能把hadoop的jar包加入到classpath之中就能正常运行. 比如我们在使用LogisticModelParameters ...

  2. pat 甲级 1009. Product of Polynomials (25)

    1009. Product of Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  3. [网络流24题] COGS 搭配飞行员

    14. [网络流24题] 搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队 ...

  4. 小型web项目的模块化(转)

    背景   目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...

  5. AC日记——青蛙的约会 poj 1061

    青蛙的约会 POJ - 1061   思路: 扩展欧几里得: 设青蛙们要跳k步,我们可以得出式子 m*k+a≡n*k+b(mod l) 式子变形得到 m*k+a-n*k-b=t*l (m-n)*k-t ...

  6. L1-8 外星人的一天

    L1-8 外星人的一天(15 point(s)) 地球上的一天是 24 小时.但地球上还有一些精力和勤奋度都远超一般人的大神级人物,他们的“一天”是以 48 小时为周期运转的,这种人被人们尊称为“外星 ...

  7. 2016集训测试赛(二十一)Problem C: 虫子

    题目大意 给你一棵树, 每个点有一个点权. 有两种操作: link / cut 修改某个点的点权 每次操作后, 你要输出以下答案: 在整棵树中任意选两个点, 这两个点的LCA的期望权值. Soluti ...

  8. jersey上传文件解决办法

    这两天在使用jersey 构建的jersey JAX-RS REST服务器,在通过POST方法上传文件的时候,如果根据example来操作的话会引发如下异常: SEVERE: Missing depe ...

  9. React 入门之路

    React React简介 是由Facebook公司推广的一套框架,已经应用instagram等产品 React就是为了提供应用程序性能而设计的一套框架 在angular中,对dom提供了一些指令,让 ...

  10. PROFILE - 库存:物料状态支持 控制【物料状态定义】禁止的事务处理

    PROFILE 库存:物料状态支持