在thinkphp下面我们调用了类库PHPExcel,但是大家都知道 PHPExcel的执行效率实在不高。所以我测试的在导出超过3千行数据的时候,就会崩溃或者内存溢出。
这样的情况下我们可以采用php原生写法,这个写法效率会高很多,初步测试1万行应该没啥问题的。需要的人可以试试。
thinkphp3.1.3写法
function export($list, $params = array())
{
set_time_limit(0);
ini_set("memory_limit", "4096M");
Vendor('phpexcel.PHPExcel');
$excel = new PHPExcel();
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array( ' memoryCacheSize ' => '512MB' );
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$excel->getProperties()->setCreator("数据")->setLastModifiedBy("数据")->setTitle("Office 2007 XLSX Test Document")->setSubject("Office 2007 XLSX Test Document")->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")->setKeywords("office 2007 openxml php")->setCategory("report file");
$sheet = $excel->setActiveSheetIndex(0);
$rownum = 1;
foreach ($params['columns'] as $key => $column)
{
$sheet->setCellValue(column($key, $rownum), $column['title']);
if (!empty($column['width']))
{
$sheet->getColumnDimension(column_str($key))->setWidth($column['width']);
}
}
$rownum++;
foreach ($list as $row)
{
$len = count($row);
for ($i = 0; $i < $len; $i++)
{
$value = $row[$params['columns'][$i]['field']];
$sheet->setCellValue(column($i, $rownum), $value);
}
$rownum++;
}
$excel->getActiveSheet()->setTitle($params['title']);
$filename = urlencode($params['title'] . '-' . date('Y-m-d-H-i', time()));
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
header('Cache-Control: max-age=0');
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save('php://output');
exit;
}
php原生写法:
function export($data, $params = array())
{
set_time_limit(0);
ini_set("memory_limit", "1024M");
// 导出到本地
$filename = urlencode($params['title'] . '-' . date('Y-m-d-H-i', time()));
header ( "Content-type:application/vnd.ms-excel" );
header ( "Content-Disposition:filename=".$filename.".csv" );
header ('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a'); //打开PHP文件句柄,php://output 表示直接输出到浏览器
$head=$params['columns']; //定义标题
foreach ($head as $key => $column)
{
$head[$key] = iconv('utf-8', 'GB18030', $column['title']); //将中文标题转换编码,否则乱码
}
fputcsv($fp, $head); //将标题名称通过fputcsv写到文件句柄
foreach ($data as $k => $row) { //重组数组
$len = count($row);
for ($i = 0; $i < $len; $i++)
{
$rows[$k][$params['columns'][$i]['field']] = $row[$params['columns'][$i]['field']];
}
$rownum++;
}
$limit = 30000;
$num = 0; //计数器
foreach ( $rows as $v ) { //循环数据
$num++;
if($num == $limit){
ob_flush(); //释放内存
flush();
}
$rows = array();
foreach ( $v as $kk => $vv){
$rs[$kk] = iconv('utf-8', 'GB18030', $vv); //转译编码
}
fputcsv($fp, $rs);
}
exit;
}
调用方法:我把调用方法换行了这样看起来清楚一些当然你可以把上述2个函数设置为不一样的名字,随便调用哪个都可以
export($list, array("title" => "订单导出",
"columns" => array(
array('title' => '订单ID', 'field' => 'id', 'width' => 15),
array('title' => '会员编号', 'field' => 'username', 'width' => 12),
array('title' => '姓名', 'field' => 'name', 'width' => 12),
array('title' => '电话', 'field' => 'mobile', 'width' => 18),
array('title' => '订单金额', 'field' => 'pay_money', 'width' => 12),
array('title' => '加入时间', 'field' => 'shijian', 'width' => 20)
) ) );
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
请登录后发表评论
注册
社交帐号登录