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);
}
}