php 大數據量導入並下載CSV文件
下面是實現代碼:
代碼解析:
頁面中的form表單提交到downExcel()
這個方法中,然後這個方法調用setHeader()
和dataToCsv()
這兩個方法將從數據庫中讀取的數據通過瀏覽器下載到客戶端
其中dataToCsv()
的最後exit()是必須的,否則會將頁面的代碼也下載到csv文件中
Class DownloadCsv{
protected $tHead = [
'ID',
'測試1',
'測試2',
'測試3',
'測試4',
];
/**
* 下載成csv文件,數據量大,所以不適用phpExcel
* @return void
*/
public function downExcel()
{
if($_POST) {
$_POST['start'] && $_POST['end'] && $map['menu.loginTime']=['between',[strtotime($_POST['start']),strtotime($_POST['end'])]];
!$_POST['start'] && $_POST['end'] && $map['menu.loginTime']=['<=',strtotime($_POST['end'])];
$_POST['start'] && !$_POST['end'] && $map['menu.loginTime']=['>=',strtotime($_POST['start'])];
$_POST['username'] && $map['user.username']=['=',$_POST['username']];
}
$map['menu.projectid'] = Session::get("project_id");
$this->setHeader('ceshi');
$this->dataToCsv($map,$this->tHead);
}
/**
* 數據直接輸出到網頁下載
* @param string $file csv文件的名稱
* @return void
*/
protected 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");
}
/**
* 從數據庫中循環查詢數據,並且需要處理的數據,
* 可以在這裏驚醒替換等操作,然後寫入到瀏覽器中
* 此方法是每次從數據庫中查詢500條信息,直到查詢到的數據
* 小於500
* @param array $map 數據庫搜索的條件
* @param array $columns 設置的表頭信息
* @return void
*/
protected function dataToCsv($map,$columns)
{
$record = new RecordModel();//實例化模型類
$fp = fopen('php://output', 'a');
mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($fp, $columns);
$i = 0;
do
{
$list = $record -> record($map,$i*500);//每次從數據庫中查詢500條信息
$num = count($list);
foreach($list as $v) {
$v['loginTime'] = date("Y-m-d H:i:s",$v['loginTime']);
$v['status'] = $v['status']==1?'已完成':'未完成';
mb_convert_variables('GBK', 'UTF-8', $v);
fputcsv($fp, $v);
}
unset($list);
$i++;
ob_flush();
flush();
}while($num);
fclose($fp);
unset();
exit(0);
}
}