自己封裝的資料庫導出資料到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();