自己封装的数据库导出数据到EXECL表格的类,详见下面代码:
这个类可以一次性写入大量的数据到CSV(此文件可以使用excel程序打开)文件中,
我试了一下,3秒钟大概写入了2W多条数据到CSV文件
<?php
Class DownloadCsv{
/**
* 实例化DownloadCsv类的时候初始化的句柄
* @param $fp
*/
private $fp = null;
/**
* 初始化类,打开php的输出流
*/
public function __construct()
{
$this->fp = fopen('php://output', 'a');
}
/**
* 设置浏览器输出流
* @param string $file 设置输出文件的名称
* @return void
*/
public function setHeader($file)
{
$csvFileName = rtrim($file,'.'). '.csv';
set_time_limit(0);
header('Content-Description: File Transfer');
header('Content-Type:text/csv');
header('Content-Disposition: attachment; filename="'. $csvFileName .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header("Content-Transfer-Encoding: binary");
}
/**
* 将浏览器中的缓冲区冲刷到浏览器
* @return void
*/
public function csvFlush()
{
ob_flush();
flush();
}
/**
* 设置表的头部信息
* @param array $columns 表头已为数组 例如:['姓名','性别','年龄',...]
* @return void
*/
public function setColumn($columns)
{
mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($this->fp, $columns);
unset($columns);
}
/**
* 将数据写入到csv的缓冲区
* @param array $data 一维或者二维数组
* @return void
*/
public function dataToCsv($data)
{
if(count($data)==count($data,1)){
mb_convert_variables('GBK', 'UTF-8', $data);
fputcsv($this->fp, $data);
}else{
foreach($data as $v){
mb_convert_variables('GBK', 'UTF-8', $v);
fputcsv($this->fp, $data);
}
}
unset($data);
}
/**
* 因为没有exit CSV文件会将页面Html代码也写入,为了
* 保证没有Html代码,所以添加exit
*/
public function notHtml()
{
exit(0);
}
/**
* 数据处理写入完成,关闭句柄
*/
public function closeHandle()
{
fclose($this->fp);
}
}
调用上面的类
$csv->dataToCsv($data)
中的$data
是一维或者二维数组
$header=['姓名','性别','年龄'];
$list = [
['张三','男','20'],
['韩梅梅','女','18'],
['李雷','男','19'],
];
$csv = new DownloadCsv();
$csv->setHeader('test');
$csv->setColumn($header);
foreach($list as $v){
//此处可以对数据进行处理
$csv->dataToCsv($v);
$csv->csvFlush();//当内存不够的时候可以调用此方法
}
$csv->closeHandle();
$csv->notHtml();
或者下面的调用方法
$header=['姓名','性别','年龄'];
$list = [
['张三','男','20'],
['韩梅梅','女','18'],
['李雷','男','19'],
];
$csv = new DownloadCsv();
$csv->setHeader('test');
$csv->setColumn($header);
$csv->dataToCsv($data);
$csv->csvFlush();
$csv->closeHandle();
$csv->notHtml();