自己封裝的數據庫導出數據到EXECL表格的類,詳見下面代碼:
這個類可以一次性寫入大量的數據到CSV(此文件可以使用excel程序打開)文件中,
我試了一下,3秒鐘大概寫入了2W多條數據到CSV文件
<?php
Class DownloadCsv{
/**
* 實例化DownloadCsv類的時候初始化的句柄
* @param $fp
*/
protected $fp = null;
/**
* 初始化類,打開php的輸出流
*/
public function __construct()
{
$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()
{
pclose($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->hotHtml();
或者下面的調用方法
$header=['姓名','性別','年齡'];
$list = [
['張三','男','20'],
['韓梅梅','女','18'],
['李雷','男','19'],
];
$csv = new DownloadCsv();
$csv->setHeader('test');
$csv->setColumn($header);
$csv->dataToCsv($data);
$csv->csvFlush();
$csv->closeHandle();
$csv->hotHtml();