zoukankan      html  css  js  c++  java
  • phpoffice php操作excel表格的导入和导出

    https://packagist.org/packages/phpoffice/phpexcel

    使用:

    composer require phpoffice/phpexcel

    控制器引入

    //引入phpoffice
    use PHPExcel;
    use PHPExcel_IOFactory;

    导出代码:

    复制代码
    //execl模板下载
        public function template_download()
        {
            $objExcel = new PHPExcel();
            $objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
            $objActSheet = $objExcel->getActiveSheet(0);
            $objActSheet->setTitle('会员批量导入模板'); //设置excel的标题
            $objActSheet->setCellValue('A1', '用户id');
            $objActSheet->setCellValue('B1', '昵称');
            $objActSheet->setCellValue('C1', '手机号');
    
            $baseRow = 2; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
            //默认数据
            $explame_data = array(
                array(
                    'user_id' => '1',
                    'nickname' => '小明',
                    'phone' => '15012345678',
                ),
            );
    
            foreach ($explame_data as $key => $value) {
                $i = $baseRow + $key;
                $objExcel->getActiveSheet()->setCellValue('A' . $i, $value['user_id']);
                $objExcel->getActiveSheet()->setCellValue('B' . $i, $value['nickname']);
                $objExcel->getActiveSheet()->setCellValue('C' . $i, $value['phone']);
            }
    
    
            $objExcel->setActiveSheetIndex(0);
            //4、输出
            $objExcel->setActiveSheetIndex();
            header('Content-Type: applicationnd.ms-excel');
            $time = date('Y-m-d');
            header("Content-Disposition: attachment;filename=会员批量导入模板" . $time . ".xls");
            header('Cache-Control: max-age=0');
            $objWriter->save('php://output');
        }
    复制代码

    导入代码:

    复制代码
        public function import_batch_send()
        {
            header("content-type:text/html;charset=utf-8");
    
            //上传excel文件
            $file = request()->file('file');
            //将文件保存到public/uploads目录下面
            $info = $file->validate(['size' => 1048576, 'ext' => 'xls,xlsx'])->move('./uploads');
            if ($info) {
                //获取上传到后台的文件名
                $fileName = $info->getSaveName();
                //获取文件路径
                $filePath = Env::get('root_path') . 'public' . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . $fileName;
                //获取文件后缀
                $suffix = $info->getExtension();
                //判断哪种类型
                if ($suffix == "xlsx") {
                    $reader = PHPExcel_IOFactory::createReader('Excel2007');
                } else {
                    $reader = PHPExcel_IOFactory::createReader('Excel5');
                }
            } else {
                return json(['status' => '1', 'message' => '文件过大或格式不正确导致上传失败-_-!']);
            }
            //载入excel文件
            $excel = $reader->load($filePath, $encode = 'utf-8');
            //读取第一张表
            $sheet = $excel->getSheet(0);
            //获取总行数
            $row_num = $sheet->getHighestRow();
            //获取总列数
            $col_num = $sheet->getHighestColumn();
    
            $import_data = []; //数组形式获取表格数据
            for ($i = 2; $i <= $row_num; $i++) {
                $import_data[$i]['nickname']  = $sheet->getCell("B" . $i)->getValue();
                $import_data[$i]['phone']  = $sheet->getCell("C" . $i)->getValue();
            }
    
            if (empty($import_data)) {
                return json(['status' => '1', 'message' => '数据解析失败']);
            }
    
            //校验手机号是否重复
            $phone_array = array_column($import_data, 'phone');
            $phone_ids = implode(',', $phone_array);
            $result_phone = db('user')
                ->field('phone')
                ->where('phone', 'in', $phone_ids)
                ->select();
            if (!empty($result_phone)) {
                $result_phone_array = array_column($result_phone, 'phone');
                $result_phone_ids = implode(',', $result_phone_array);
                return json(['status' => '3', 'message' => '数据重复', 'result' => $result_phone_ids]);
            }
    
            //将数据保存到数据库
            $res = db('user')->insertAll($import_data);
            if ($res) {
                return json(['status' => '2', 'message' => '导入成功']);
            } else {
                return json(['status' => '1', 'message' => '提交失败,请刷新重试']);
            }
        }
    附征前端代码

    <!DOCTYPE html>
    <html>
    <head>
    <title>导入</title>
    </head>
    <body>
    <form action="{:url('xxxx')}" enctype="multipart/form-data" method="post" >
    上传文件:<input type="file" name="excel">
    <input type='hidden' name="competition_id" value="{$competition_id}"/>
    <input type='hidden' name="group_id" value="{$group_id}"/>
    <input type="submit" value="提交文件">
    </form>
    <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
    </body>
    </html>

    public function imports()
    {
    set_time_limit(0);
    if ($file = request()->file('excel')) {
    $data1 = $this->request->post();
    $info = $file->validate(['ext' => 'xls,xlsx,csv'])->move('../public/uploads/files/');
    if ($info) {
    $filename = $info->getFilename();
    $exts = explode('.', $filename)[1];
    $file_root = ROOT_PATH . '/public/uploads/files/' . date('Ymd') . '/' . $filename;
    header("content-type:text/html; charset=utf-8");
    $file_root = iconv('utf-8', 'gbk', $file_root);
    if (file_exists($file_root)) {//如果文件存在
    if ($exts == 'xls') {
    $PHPReader = new PHPExcel_Reader_Excel5();
    } else if ($exts == 'xlsx') {
    $PHPReader = new PHPExcel_Reader_Excel2007();
    }
    $PHPExcel = $PHPReader->load($file_root);
    $sheet = $PHPExcel->getActiveSheet(0);//获得sheet
    $highestRow = $sheet->getHighestRow(); // 取得共有数据数
    $data = $sheet->toArray();
    $limit = 2;
    $rows = ceil($highestRow / $limit);
    for ($r = 0; $r < $rows; $r++) {
    $start = $r * $limit;
    for ($i = $start; $i < $limit + $start; $i++) {
    if ($i == 0 && $r == 0) {
    //第一行不导入
    continue;
    }
    if ($data[$i][0] == '') {
    continue;
    }
    $betrayal = Db::name('competition_buy_log')
    ->where('competition_id', $data['competition_id'])
    ->max('betrayal');
    if ($betrayal) {
    ++$betrayal;
    } else {
    $betrayal = 1;
    }
    // 导入人员
    $order_no = get_order_sn('DRSH');
    $add["order_sn"]=$order_no;
    $add["betrayal"]=$betrayal;
    $add["competition_id"]=$data1['competition_id'];
    $add["group_id"]=$data1['group_id'];
    // 代表队
    $delegation = $data[$i][0];
    $add['delegation'] = $delegation;
    $add['pay_money'] = 0;
    $add['is_pay'] =1;
    $add['coach_name'] = $data[$i][1];
    $add['coach_mobile'] =$data[$i][2];
    $add['coach_email'] =$data[$i][3];
    $add['is_Import'] =1;
    $add['user_name'] =$data[$i][4];
    $add['mobile'] =$data[$i][5];
    $add['card_num'] =$data[$i][6];
    $user_info = Db::name('user')->where("mobile",$data[$i][5])->find();
    if($user_info){
    $add['uid']=$user_info['id'];
    CompetitionBuyLog::insert($add);
    }
    }
    }
    } else {
    // $this->error("文件不存在");
    return array("resultcode" => -5, "resultmsg" => "文件不存在", "data" => null);
    }
    } else {
    return array("resultcode" => -5, "resultmsg" => "文件不存在", "data" => null);
    }
    unset($info);
    unlink($file_root);
    $this->success('导入成功');
    die;
    } else {
    $this->error('上传失败,请上传指定格式的文件');
    }

    }
  • 相关阅读:
    23种设计模式之单例模式
    6大设计原则之里氏替换原则
    6大设计原则之依赖倒置原则
    6大设计原则之接口隔离原则
    6大设计原则之迪米特法则
    Java日志第14天 2020.7.19
    Java日志第15天 2020.7.20
    Java日志第13天 2020.7.18
    Python 语音识别字幕生成器
    python list,tuple,str有序问题
  • 原文地址:https://www.cnblogs.com/zlf2000/p/12958006.html
Copyright © 2011-2022 走看看