之前到做数据导出这个功能的时候,发现如果使用PHPExcel进行数据导出的吧,数据量过大,就没有办法导出了,后来使用导出的文件后缀格式为.csv就没有问题了。下面写一下我的方法总结吧:
<?php
namespace Home\Controller;
use Think\Controller;
class CheckController extends PublicController
{
/*
* 封装的csv导出数据的方法
* 文件名$fileName
* $headArr 字段名
* 需要导出的数据数据 $data
* */
private function getCSV($fileName,$headArr,$data){
$date = date("Y_m_d",time());
$fileName .= "_{$date}.csv";
$fileName = iconv("utf-8", "gb2312", $fileName);
header('Content-Type: Content-type:text/csv');
header("Content-Disposition: attachment;filename=\"$fileName\"");
header('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a');
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);
fputcsv($fp, $headArr);
// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;
$count = count($data);
for($t=0;$t<$count;$t++) {
$cnt ++;
if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
ob_flush();
flush();
$cnt = 0;
}
$row = $data[$t];
foreach ($row as $i => $v) {
$row[$i] = iconv('utf-8', 'gbk', $v);
}//
fputcsv($fp, $row);
unset($row);
}
//下面使用案例
//导出用户数据数据方法
public function epiexport()
{
$Model = M('userinfo');
$map['Status']=1;
$userinfolist = $Model->where($map)->select();
//用户表数据
$alldata = array();
foreach ($userinfolist as $k=>$val) {
$alldata[$k]['Number'] = $val['number'];
$alldata[$k]['DocuDate'] = $val['docudate'];
$alldata[$k]['Name'] = $val['name'];
$alldata[$k]['Sex'] = $val['sex'] == 1 ? '男' : '女';
$alldata[$k]['Birth'] = $val['birth'];
$alldata[$k]['Nation'] = $val['nation'];
$alldata[$k]['FatherName'] = $val['fathername'];
$alldata[$k]['FatherPhoneNo'] = $val['fatherphoneno'];
$alldata[$k]['MotherName'] = $val['mothername'];
$alldata[$k]['MotherPhoneNo'] = $val['motherphoneno'];
$alldata[$k]['Address'] = $val['address'];
$alldata[$k]['School'] = $val['school'];
$alldata[$k]['SchoolType'] = $val['schooltype'];
$alldata[$k]['ClassName'] = $val['classname'];
$alldata[$k]['AddTime'] =date('Y-m-d',$val['addtime']);
$alldata[$k]['Lost']=$val['lost'];
$alldata[$k]['inquiryopen'] = $val['inquiryopen'];
}
$headArr=array_keys($alldata[$k]);
$filename="epidata";
$this->getCSV($filename,$headArr,$alldata);
}
}