thinkphp csv格式导入导出

封装成函数:

class Csv{
    /**
     * 导出csv文件
     */
    public function export_csv($list, $title){
        $file_name = "export" . time() . ".csv"; // 文件名
        header('Content-Type: application/vnd.ms-excel'); // 设置内容类型为Excel
        header('Content-Disposition: attachment;filename=' . $file_name); // 下载文件
        header('Cache-Control: max-age=0'); // 表示当访问此网页后的0秒内再次访问不会去服务器
        $file = fopen('php://output', "a");// 打开文件或者 URL,  php://output 是一个只写的数据流,  a:写入方式打开,将文件指针指向文件末尾。
        $limit = 1000;
        $num = 0;
        foreach ($title as $v) {
            $tle[] = iconv('UTF-8', 'GB2312//IGNORE', $v); // 转码
        }
        fputcsv($file, $tle);// 将行格式化为 CSV 并写入一个打开的文件中。(标题)
        foreach ($list as $v) {
            $num++;
            // 清空缓存,将缓存上的数据写入到文件
            if ($limit == $num) {
                ob_flush(); // 将本来存在输出缓存中的内容取出来,调用ob_flush()之后缓冲区内容将被丢弃。
                flush();    // 待输出的内容立即发送。
                $num = 0;
            }
            foreach ($v as $t) {
                $cArr[] = iconv('UTF-8', 'GB2312//IGNORE', $t);
            }
            fputcsv($file, $cArr); // 将行格式化为 CSV 并写入一个打开的文件中。(内容)
            unset($cArr); // 销毁指定的变量
        }
        unset($list);  // 销毁指定的变量
        fclose($file); // 关闭打开的文件
        exit();
    }

    // csv导入
    public function import_csv($dirName){
        $csv_file = $handle = fopen($dirName, 'r');//只读方式打开,将文件指针指向文件头]
        $result = array();
        $i = 0;
        // 读入一行并解析 CSV 字段(规定的是读取一行的最大长度)
        while ($data_line = fgetcsv($csv_file, 1000)) {
            // 跳过第一行标题读取
            if ($i == 0) {
                $GLOBALS ['key_name'] = $data_line; // 将标题存储起来
                $i++;
                continue;
            }
            // 读取内容
            foreach ($GLOBALS['key_name'] as $key_num => $key_name) {
                $key_name = iconv('gb2312', 'utf-8', $key_name); // 标题
                if (empty($data_line[$key_num])) {
                    $result[$i][$key_name] = '';
                } else {
                    // 标题对应的内容
                    $value = iconv('gb2312', 'utf-8', $data_line[$key_num]); 
                    $result[$i][$key_name] = $value;
                }
            }
            $i++;
        }
        fclose($handle); // 关闭指针
        return $result;
    }
}

在控制器中的使用:

/**
 * 大数据改 导出
 */
public function exportData(){
//        set_time_limit(0);
    $data = Db::name('table') -> order('create_time desc')-> select();
    $csv_title = array('编号','名称','手机号','邮件',);
    $csv = new Csv();  // 实例化后才可以调用之前类文件定义好的方法
    $csv->put_csv($data, $csv_title);
}


/**
 * 大数据改 导入
 */
public function importData(){
    if (request() -> isPost()){
        // 获取表单上传文件
        $file = request()->file('examfile');
        if(empty($file)) {
            $this->error('请选择上传文件');
        }
        $dirName = "public/uploads/csv";
        if(!file_exists($dirName)){
            mkdir(app()->getRootPath().$dirName,0777,true);
        }
        $info = $file->move($dirName);
        //获取文件(日期/文件),$info->getFilename();
        $filename = $dirName.'/'.$info->getSaveName();
//            $handle = fopen($filename,'r');// 只读方式打开,将文件指针指向文件头]
        $csv = new Csv();
        $result = $csv->input_csv($filename); // 解析csv
        $len_result = count($result);//返回数目
        if($len_result == 0){
            $this->error('此文件中没有数据!');
        }
        dump($result);
//            fclose($handle); // 关闭指针
        return;
    }
    return $this -> fetch();
}

后续看看是否有后续

你可能感兴趣的:(php,csv)