ThinkPHP5 关于CSV文件的导入与导出 详细步骤

2-在thinkphp/library/think下新建Csv.php文件:

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018\7\24 0024
 * Time: 17:10
 */

namespace think;


class Csv
{
    //导出csv文件
    public function put_csv($list,$title)
    {
        $file_name = "exam".time().".csv";
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename='.$file_name );
        header('Cache-Control: max-age=0');
        $file = fopen('php://output',"a");
        $limit = 1000;
        $calc = 0;
        foreach ($title as $v){
            $tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);
        }
        fputcsv($file,$tit);
        foreach ($list as $v){
            $calc++;
            if($limit == $calc){
                ob_flush();
                flush();
                $calc = 0;
            }
            foreach($v as $t){
                $tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
            }
            fputcsv($file,$tarr);
            unset($tarr);
        }
        unset($list);
        fclose($file);
        exit();
    }

    // csv导入,此格式每次最多可以处理1000条数据
    public function input_csv($csv_file) {
        $result_arr = array ();
        $i = 0;
        while($data_line = fgetcsv($csv_file,10000)) {
            if ($i == 0) {
                $GLOBALS ['csv_key_name_arr'] = $data_line;
                $i ++;
                continue;
            }
            foreach($GLOBALS['csv_key_name_arr'] as $csv_key_num => $csv_key_name ) {
                $result_arr[$i][$csv_key_name] = $data_line[$csv_key_num];
            }
            $i++;
        }
        return $result_arr;
    }
}

2-对应的控制器

use think\Csv;  //此处是csv文件实现的关键



/*
     * 导出
     */
    public function down(){
        $csv = new Csv();
        $list = Db::name('users')->field("id,phone,username,nickname,is_vip,end_time,level")->select();
        $csv_title = array('id','手机号','姓名','昵称','是否是vip','结束的时间','等级');
        $csv->put_csv($list,$csv_title);
    }
    /*
     * 导入
     *
     */
    public function updown(){
        // 获取表单上传文件
        $file = request()->file('namefile');
        if(empty($file)) {
            $this->error('请选择上传文件');
        }
        // 移动到框架应用根目录/public/uploads/ 目录下
        $info = $file->move(ROOT_PATH.'public'.DS.'upload');
        //获取文件(日期/文件),$info->getFilename();
        $filename = ROOT_PATH.'public'.DS.'upload/'.$info->getSaveName();
        $handle = fopen($filename,'r');
        $csv = new Csv();
        $result = $csv->input_csv($handle); // 解析csv
        $len_result = count($result);
        if($len_result == 0){
            $this->error('此文件中没有数据!');
        }
        $data_values = '';
        for($i = 1;$i < $len_result+1;$i ++) { // 循环获取各字段值
            $arr = array_values($result[$i]);
            $id =$arr[0];
            $phone= iconv('gb2312','utf-8',$arr[1] ); // 中文转码
            $username = iconv('gb2312','utf-8',$arr[2]);
            $nickname = iconv('gb2312','utf-8',$arr[3]);
            $is_vip = $arr[4];
            $end_time = $arr[5];
            $level = $arr[6];

            $data_values .= "('$id','$phone','$username','$nickname','$is_vip','$end_time','$level'),";
        }
        $data_values = substr($data_values,0,- 1 ); // 去掉最后一个逗号
        fclose($handle); // 关闭指针
        // 批量插入数据表中
        $result = DB::execute("insert into cyh_users(id,phone,username,nickname,is_vip,end_time,level) values $data_values" );
        if($result){
            $this->success('文件上传成功,数据已经导入!','admin/user/index',3);
        }else{
            // 上传失败获取错误信息
            $this->error($file->getError());
        }
    }

3--html 代码

<form action="{:url('admin/user/updown')}" method="post" class="form form-horizontal" enctype="multipart/form-data">
    	<label class="form-label col-xs-4 col-sm-2">选择文件:</label>
	<div class="btn-upload form-group">
		<input type="file" name="namefile" class="input-file" multiple>			    
	</div>
		
</form>

4-本文多数代码参考

https://blog.csdn.net/qq_37682202/article/details/79426810

猜你喜欢

转载自blog.csdn.net/qq_37138818/article/details/81189240