PHP bulk import and export files in CSV format and inserted into the database

Due to business needs, the need for bulk import and export functions template web version of the module to achieve data import bulk data
renderings as follows:
Here Insert Picture Description
Here Insert Picture Description
old iron are
Here Insert Picture Description
the Internet has seen a lot of tutorials, finally fulfilled my functions hum
nonsense Bibi directly on the small main course:
Csv categories:

<?php

class Csv{
  /**
     * 导出csv文件
     * @param $list 数据源
     * @param $title 数据列表
     */
    public function put_csv($list,$title)
    {
        $file_name = "exam".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 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区,  a:写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
        $limit = 1000;
        $calc = 0;
        foreach ($title as $v){
            $tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);//转码
        }
        fputcsv($file,$tit);//将行格式化为 CSV 并写入一个打开的文件中。(标题)
        foreach ($list as $v){
            $calc++;
            //-------核心!!!清空缓存,将缓存上的数据写入到文件--------
            if($limit == $calc){
                ob_flush();//将本来存在输出缓存中的内容取出来,调用ob_flush()之后缓冲区内容将被丢弃。
                flush();   //待输出的内容立即发送。   具体查看:https://www.jb51.net/article/37822.htm
                $calc = 0;
            }//-------核心--------
            foreach($v as $t){
                $tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
            }
            fputcsv($file,$tarr);//将行格式化为 CSV 并写入一个打开的文件中。(内容)
            unset($tarr);//销毁指定的变量
        }
        unset($list);//销毁指定的变量
        fclose($file);//关闭打开的文件
        exit();
    }
    //批量导入数据的模板
    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;
       }

}
?>

Controller:

//导出模板的方法体:
  public function exportCsv(){

    $model=D('Tlibrary');
    $datalist = array();
         $csv_title = array('中文','英文','英文编写','西班牙','日文','俄文','备注','类型');
        //csv导出
         $csv = new Csv();  //实例化后才可以调用之前类文件定义好的方法
         $csv->put_csv($datalist, $csv_title);
    }



  //批量导入
    public function allinport(){
      $model = D('Tlibrary');
if($_FILES['inportfile']['error']!=4){
  $upload = new \Think\Upload();// 实例化上传类
  $upload->maxSize = 10485760 ;// 设置附件上传大小
  $upload->exts = array('csv');// 设置附件上传类型
  $upload->rootPath = 'Public/data/hr/xuelizhengshu/'; // 设置附件上传根目录
  // 上传文件
  $info = $upload->upload();
  if(!$info) {
    // 上传错误提示错误信息
    $this->error($upload->getError());
  }else{
    //上传成功 获取上传文件信息
    foreach($info as $file){
      $path='Public/data/hr/xuelizhengshu/'.$file['savepath'].$file['savename'];
        }
               $handle = fopen($path,'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];
                   $cn= iconv('gb2312','utf-8',$arr[0]); // 中文转码
                   $en = $arr[1];
                   $abben = $arr[2];
                   $sp = $arr[3];
                   $jp = $arr[4];
                   $ru = $arr[5];
                   $remarks = $arr[6];
                   $manager_id = session('manager_id');
                   $mdate = time();

                   if(iconv('gb2312','utf-8',$arr[7])=="办公"){
                     $flag = 0;
                     }else {
                       $flag = 1;
                     }

                   $data=array('cn'=>$cn,'en'=>$en,'abben'=>$abben,'sp'=>$sp,'jp'=>$jp,'ru'=>$ru,'remarks'=>$remarks,'manager_id'=>$manager_id,'mdate'=>$mdate,'flag'=>$flag);
                   $resultjs = $model ->add($data);
               }

               fclose($handle); // 关闭指针
               $this->success('文件上传成功,数据已经导入!');
  }
  }

}

Code logic according to the logic of your data table to add that change is complete

Published 43 original articles · won praise 60 · views 6735

Guess you like

Origin blog.csdn.net/yuhang01/article/details/103817557