记录下方法,日后Ctrl+c Ctrl+v 做一个好的工程师~
<?php
//导出csv 提交报告
public function contentDataExport(Request $request){
$sql = 'SELECT q.title,t.content,t.created_at,u.truename FROM hy_questions_text t
LEFT JOIN hy_questions q on t.qid = q.id
LEFT JOIN hy_user u on t.uid = u.id
WHERE t.del_status = 1';
$list = DB::select($sql);
$columnList = [
['width' => 30, 'name_str' => '调研问题', 'name' => 'title'],
['width' => 30, 'name_str' => '提交者姓名', 'name' => 'truename'],
['width' => 30, 'name_str' => '提交内容', 'name' => 'content'],
['width' => 30, 'name_str' => '提交时间', 'name' => 'created_at'],
];
$results = [];
for ($i=0; $i < count($list); $i++) {
$results[$i]['title'] = $list[$i]->title;
$results[$i]['truename'] = $list[$i]->truename;
$results[$i]['content'] = $list[$i]->content;
$results[$i]['created_at'] = date('Y-m-d H:i:s',$list[$i]->created_at);
}
$tableList[] = [
'title' => 'sheet1',
'columnList' => $columnList,
'dataList' => $results,
];
$fileName = '痣在四方';
$this->exportCsv($tableList,$fileName);
}
//生成csv方法
public function exportCsv($tableList, $fileName)
{
try {
set_time_limit(0);
ini_set('memory_limit', '1024M');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="'.$fileName.'.csv"');
header('Expires: 0');
header('Cache-Control: must-revalidate,post-check=0,pre-check=0');
header('Pragma: public');
print(chr(0xEF).chr(0xBB).chr(0xBF));//设置utf-8 + bom ,处理汉字显示的乱码
//fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM
$fp = fopen('php://output', 'a');//打开output流
//写入文件头
$columns = collect($tableList[0]['columnList'])->pluck("name_str")->all();
//mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中
//获取总数,分页循环处理
$accessNum = collect($tableList[0]['dataList'])->count();
$perSize = 1000;
$pages = ceil($accessNum / $perSize);
for($i = 1; $i <= $pages; $i++) {
$db_data = collect($tableList[0]['dataList'])->forPage($i,$perSize)->all();
foreach($db_data as $key => $value) {
$rowData = [];
//获取每列数据,转换处理成需要导出的数据
foreach ($tableList[0]['columnList'] as $item){
$keyName = $item['name'];
$rowData[] = @$value[$keyName];
}
//需要格式转换,否则会乱码
//mb_convert_variables('GBK', 'UTF-8', $rowData);
fputcsv($fp, $rowData);
} //释放变量的内存
unset($db_data); //刷新输出缓冲到浏览器
ob_flush(); //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
flush();
}
fclose($fp);
exit;
}catch (\Exception $e){
// \Log::DEBUG('[common/excel]'.$e->getMessage());
return '';
}
}
两个function配合使用,contentDataExport作为访问方法, 直接生成文件 输出到浏览器~
C + V 即用,妈妈再也不用担心我百度三方导出excel插件了~