iconv用法:https://www.php.net/manual/zh/function.iconv.php
iconv
(PHP 4 >= 4.0.5, PHP 5, PHP 7)
iconv — 字符串按要求的字符编码来转换
说明
iconv ( string $in_charset
, string $out_charset
, string $str
) : string
将字符串 str
从 in_charset
转换编码到 out_charset
。
参数
in_charset
输入的字符集。
out_charset
输出的字符集。
如果你在 out_charset
后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达。 如果你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 否则,会导致一个 E_NOTICE
并返回 FALSE
。
Caution
//TRANSLIT 运行细节高度依赖于系统的 iconv() 实现(参见 ICONV_IMPL
)。 据悉,某些系统上的实现会直接忽略 //TRANSLIT,所以转换也有可能失败,out_charset
会是不合格的。
str
要转换的字符串。
注:运用//TRANSLIT 的话,空格是不能识别的,转换会报错。
-----------------------------------------------------------------------------------------------------------------------------------------------
public function downloadPushRecord() { $oData = \App\Models\MedlivePushRecord::orderBy('id', 'DESA')->get(); $aData = []; foreach ($oData as $k => $v) { if ($v->medical_editor) { $medical_editor = implode(json_decode($v->medical_editor, true), '、'); } else { $medical_editor = ''; } $aData[] = [ $v->id, $v->project_code, $v->project_name, $v->sales_person, $v->project_manager, $v->push_time, $v->push_platform, $v->push_department, $v->push_position, data_get(\App\Models\MedlivePushRecord::STATUS_MAP, $v->status, ''), $v->advertorial_title, $v->url, $v->standard_price, $v->sales_price, $v->drug_company, $medical_editor, $v->editor_email, $v->push_category, $v->remark, ]; } //注意CSV文件的头两个字不能是大写字母 $aHeaderInfo = array('id', '项目名称', '项目单号', '销售', '项目经理', '推送时间', '推送平台', '推送科室', '发布位置', '审核状态', '软文标题', '推文URL', '刊例标准价格', '销售价钱', '药企名称', '编辑人员', '编辑邮箱', '推送类别', '备注'); $this->putCsv($aHeaderInfo, $aData, "词库"); }
/** * 导出excel(csv) * @data 导出数据 * @headlist 第一行列名(注意前两个列名不能是大写!否则输出的扩展名不是cvs) * @fileName 输出Excel文件名 */ public static function putCsv($header_data = [],$data= [],$file_name='test') { //(默认30秒)set_time_limit(0)不对PHP执行时间做限制。 set_time_limit(0); header('Content-Type: application/vnd.ms-excel'); //注意 如果对文件名做了处理,文件名就不能带有特殊符号“——”等其他 // header("Content-Disposition:filename=" . iconv("UTF-8", "GB18030", "$file_name") . ".csv"); header('Content-Disposition: attachment;filename='.$file_name.'.csv'); header('Cache-Control: max-age=0'); $fp = fopen('php://output', 'w'); if (!empty($header_data)) { foreach ($header_data as $key => $value) { $header_data[$key] = iconv('utf-8', 'gbk', $value); } fputcsv($fp, $header_data); } $num = 0; //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小 $limit = 100000; //逐行取出数据,不浪费内存 $count = count($data); if ($count > 0) { for ($i = 0; $i < $count; $i++) { $num++; //刷新一下输出buffer,防止由于数据过多造成问题 if ($limit == $num) { ob_flush(); flush(); $num = 0; } $row = $data[$i]; foreach ($row as $key => $value) { try { $row[$key] = iconv("utf-8",'GBK//TRANSLIT',trim($value)); } catch (\Exception $e) { info('导出出错数据:'.$row[$key]); } } try { fputcsv($fp, $row); } catch (\Exception $e) { print $e->getMessage(); exit(); } } } fclose($fp); }
---------------------
作者:不二周助Rex
来源:CSDN
原文:https://blog.csdn.net/weixin_42188216/article/details/83899445
版权声明:本文为博主原创文章,转载请附上博文链接!