Laravel读取Excel 和CSV

1、下载依赖:https://github.com/PHPOffice/PHPExcel ;

  或使用命令安装:

composer require phpoffice/phpexcel 

2、下载完成后,将PHPExcel文件夹放在laravel的vendor目录下;

  更改支持PHP7.3语法:

  将continue改成break

 

3、在你需要使用的控制器引用:

use PHPExcel_IOFactory;
use PHPExcel;

4、读取Excel:

封装(为了防止Class 'PHPExcel_IOFactory' not found 报错,以下使用上述两种引入):

    // $excel_file是excel文件的绝对路径;$start_row是起始行,默认2;$end_row是截至行,默认最大行,
    // $end_line是截至列:如F,则取A-E列,默认取到E列;  $column_name 是字段列名,数组;$is_del 是否将文件删除
    public static function excel_to_array($excel_file=null, $start_row = null, $end_row = null, $end_line = null, $column_name = [], $is_del = null){
        $test_data = [
            'excel_file'=> $excel_file,
            'start_row'=> $start_row,
            'end_row'=> $end_row,
            'end_line'=> $end_line,
        ];
        if (!$excel_file){
            $state = 0;
            $msg = 'Excel路径参数不全';
            $content = [];
        }else{
            //加载excel文件
            $filename = $excel_file;
            $objPHPExcelReader = PHPExcel_IOFactory::load($filename);
            $sheet = $objPHPExcelReader->getSheet(0); // 读取第一个工作表(编号从 0 开始,sheet)
            if (!$end_row){
                $highestRow = $sheet->getHighestRow(); // 取得最大行数
            }else{
                $highestRow = $end_row;
            }
            $highestColumn = $sheet->getHighestColumn(); // 取得最大列数
            if ($highestColumn > 100001){
                $state = 0;
                $msg = '最大行数100001行,如有超过,请切割文件';
                $content = [];
            }else{
                $arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; // 目标列标号
                if (!$start_row){ // 默认从第二行读
                    $start_row = 2;
                }
                if (!$end_line){ // 默认取到E列
                    $end_line = 'F';
                }
                $res_arr = [];
                for ($row = $start_row; $row <= $highestRow; $row++) { // 一次读取一行
                    $row_arr = [];
                    for ($column = 0; $arr[$column] != $end_line; $column++) {
                        $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
                        $row_arr[] = $val;
                    }
                    $res_arr[] = $row_arr;
                }
                $data_list = [];
                if(!empty($column_name)){
                    foreach ($res_arr as $key => $value) {
                        $data_lists = [];
                        foreach ($value as $k => $v) {
                            $data_lists[$column_name[$k]] = $v;
                        }
                        $data_list[] = $data_lists;
                    }
                }
                $state = 1;
                $msg = '读取完成';
                $content = $data_list;
                //读取完后删除文件;
                if(!empty($is_del)){
                    if(file_exists($filename)){                            //判断文件存在
                          unlink($filename);     //删除
                    }
                }
            }
        }
        return [
            'state'=> $state,
            'msg'=> $msg,
            'test_data'=> $test_data,
            'content'=> $content,
        ];
    }

5、读取Excel和CSV:

    // $excel_file是excel文件的绝对路径;$start_row是起始行,默认2;$end_row是截至行,默认最大行,
    // $end_line是截至列:如F,则取A-F列,默认取最大列;  $column_name 是字段列名,数组;$is_del 是否将文件删除
    public static function excel_to_array($excel_file=null, $start_row = null, $end_row = null, $end_line = null, $column_name = [], $is_del = null){
        $test_data = [
            'excel_file'=> $excel_file,
            'start_row'=> $start_row,
            'end_row'=> $end_row,
            'end_line'=> $end_line,
        ];
        if (!file_exists($excel_file)){
            $state = 0;
            $msg = '找不到文件!';
            $content = [];
        }else{
            //加载文件
            $filename = $excel_file;
            $type = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
            //根据不同类型分别操作
            if ($type == 'xlsx' || $type == 'xls') {
                $objPHPExcelReader = PHPExcel_IOFactory::load($filename);
                $read_ok = 1;
            }elseif($type == 'csv'){
                //不设置将导致中文列内容返回boolean(false)或乱码
                $objReader = PHPExcel_IOFactory::createReader('CSV')->setDelimiter(',')->setInputEncoding('GBK');
                $objPHPExcelReader = $objReader->load($filename);
                $read_ok = 1;
            }else{
                $state = 0;
                $msg = '文件格式不正确!';
                $content = [];
                $read_ok = 0;
            }
            if(!empty($read_ok)){
                $sheet = $objPHPExcelReader->getSheet(0); // 读取第一个工作表(编号从 0 开始,sheet)
                if (!$end_row){
                    $highestRow = $sheet->getHighestRow(); // 取得最大行数
                }else{
                    $highestRow = $end_row;
                }
                $highestColumn = $sheet->getHighestColumn(); // 取得最大列数
                if ($highestColumn > 100001){
                    $state = 0;
                    $msg = '最大列数100001列,如有超过,请切割文件';
                    $content = [];
                }else{
                    if (!$start_row){ // 默认从第二行读
                        $start_row = 2;
                    }
                    if (!$end_line){ // 默认取最大列
                        $end_line = $highestColumn;
                    }

                    //取得字段,如果没有指定字段,将在表格中的第一行为数据的字段,因此先取出用来作后面数组的键名
                    $filed = [];
                    if(!empty($column_name)){
                        $filed = $column_name;
                    }else{
                        for ($column = 'A'; $column <= $end_line; $column ++) {
                            $cellVal = $sheet->getCell($column . 1)->getValue();//取得列内容
                            $filed[] = $cellVal;
                        }
                    }
                    //开始取出数据并存入数组
                    $data = [];
                    for ($i = $start_row; $i <= $highestRow; $i++) {//ignore row 1
                        $row = [];
                        $e = 0;
                        for ($column = 'A'; $column <= $end_line; $column ++) {
                            $cellVal = $sheet->getCell($column . $i)->getValue();
                            $row[$filed[$e]] = $cellVal;
                            $e = $e + 1;
                        }
                        $data[] = $row;
                    }
                    
                    $state = 1;
                    $msg = '读取完成';
                    $content = $data;
                    //读取完后删除文件;
                    if(!empty($is_del)){
                        if(file_exists($filename)){                            //判断文件存在
                              unlink($filename);     //删除
                        }
                    }
                }
            }

        }
        return [
            'state'=> $state,
            'msg'=> $msg,
            'test_data'=> $test_data,
            'content'=> $content,
        ];
    }

 

 

调用excel_to_array($excel_file)即可:

 

 

 

 

结果如:

 

 

 

 

 

 

 

 

 

 

posted @ 2020-12-24 16:25  ShuijingOL  阅读(1157)  评论(0编辑  收藏  举报