PHP 导出cvs文件

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

将字符串 strin_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
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值