PHP Excel读取

class ReadExcel
{
   /** 读取指定表格中的数据内容(默认读取第一张表的数据)
     * @param $file 文件路径及名称
     * @param int $path 文件中img存放路径(默认img转为base64编码)
     * @param int $page 表格编号(默认第一张表)
     * @param bool $trainst 数组组成方式 (默认false = $data[行号][列标记])true = $data[列标记][行号]
     * @return array 判断文件是否错误或表格中的数据
     */
    static function result($file,$path=0,$page = 0,$trainst = false){
        $dataset = self::base($file,$PHPExcel);
        if($dataset['code'] === 1) return $dataset;
        $sheet = $PHPExcel->getSheet($page); // 读取第page+1個工作表
        return $dataset = self::table_data($sheet,$path,$trainst);
    }

    /**读取表格中的数据
     * @param $file 文件路径及名称
     * @param int $path 文件中img存放路径(默认img转为base64编码)
     * @param bool $trainst 数组组成方式 (默认false = $data[行号][列标记])true = $data[列标记][行号]
     * @return array 判断文件是否错误或表格中的数据
     */
    static function result_big_value($file,$path=0,$trainst = false){
        $dataset = self::base($file,$PHPExcel);
        if($dataset['code'] === 1) return $dataset;
        $AllSheets = $PHPExcel->getAllSheets();
        $i = 0;
        $big_data['code'] = 0;
        foreach ($AllSheets as $sheet){
            $key = $sheet->getTitle();
            $key = $key or $i;
            $big_data[$key] = self::table_data($sheet,$path,$trainst);
            $i++;
        }
        return $big_data;
     }
    /** 载入文件 及 生成解析表格的对象
     * @param $file 文件路径及名称
     * @param $PHPExcel 解析表格的对象
     * @return array 文件是否有误
     * @throws \PHPExcel_Reader_Exception
     */
    private static function base($file,& $PHPExcel){
        $f = fopen($file,'rb');
        $bin = fread($f,2);
        fclose($f);
        $strinfo = @unpack("C2chars",$bin);
        $typeCode = intval($strinfo['chars1'].$strinfo['chars2']);
        require_once ('./Classes/PHPExcel.php');
        require_once ('./Classes/PHPExcel/IOFactory.php');
        try{
            if($typeCode == 8075){
                $reader = \PHPExcel_IOFactory::createReader('Excel2007');
            }elseif ($typeCode == 208207){
                $reader = \PHPExcel_IOFactory::createReader('Excel5');//设置以Excel5格式(Excel97-2003工作簿)
            }else{
                return $dataset = array('code'=>1,'info'=>'文件类型错误');
            }
            $PHPExcel = $reader->load($file);
        }catch (\PHPExcel_Reader_Exception $e){
            return $dataset = array('code'=>1,'info'=>'文件类型错误');
        }
        return $dataset = array('code'=>0,'info'=>'文件类型正确');
    }

    /**
     * @param $sheet
     * @param int $path
     * @param bool $trainst
     * @return array
     * @throws \PHPExcel_Exception
     */
    private static function table_data($sheet,$path=0,$trainst = false){
        try{
            $highestRow = $sheet->getHighestRow(); // 取得总行数
            $highestColumm = $sheet->getHighestColumn(); // 取得总列数
            $lenght = 0;
            for($i=0;$i<strlen($highestColumm);$i++){
                $lenght += (ord($highestColumm[$i])-64);
            }
            /** 循环读取每个单元格的数据 */
            if($trainst){
                for ($row = 1; $row <= $highestRow; $row++){//行号从1开始
                    for ($i = 1,$column = 'A'; $i <= $lenght; $i++,$column++){//列数是以A列开始
                        $data[$column][$row] = $sheet->getCell($column.$row)->getValue();
                    }
                }
            }else{
                for ($row = 1; $row <= $highestRow; $row++){//行号从1开始
                    for ($i = 1,$column = 'A'; $i <= $lenght; $i++,$column++){//列数是以A列开始
                        $data[$row][$column] = $sheet->getCell($column.$row)->getValue();
                    }
                }
            }
            if($path){
                if(!is_dir($path)){
                    mkdir($path,0777);
                }
                foreach ($sheet->getDrawingCollection() as $k => $drawing) {
                    list ($column, $row) = \PHPExcel_Cell::coordinateFromString($drawing->getCoordinates());//获取列与行号
                    if(substr($path,-1) == '/'){
                        $path = $path.$drawing->getHashCode().'_';
                    }else{
                        $path = $path.'/'.$drawing->getHashCode().'_';
                    }
                    // for xlsx
                    if ($drawing instanceof \PHPExcel_Worksheet_Drawing) {
                        $filename = $drawing->getPath();
                        $imageFileName = $drawing->getIndexedFilename();
                        $path = $path . $drawing->getIndexedFilename();
                        copy($filename, $path);
                        if($trainst){
                            $data[$column][$row] = '.'.substr($path,strlen(SITE_DIR));
                        }else{
                            $data[$row][$column] = '.'.substr($path,strlen(SITE_DIR));
                        }
                    }
                }
            }else{
                foreach ($sheet->getDrawingCollection() as $k => $drawing) {
                    $path = './';
                    list ($column, $row) = \PHPExcel_Cell::coordinateFromString($drawing->getCoordinates());//获取列与行号
                    // for xlsx
                    if ($drawing instanceof \PHPExcel_Worksheet_Drawing) {
                        $filename = $drawing->getPath();

                        $imageFileName = $drawing->getIndexedFilename();

                        $path = $path . $drawing->getIndexedFilename();

                        copy($filename, $path);
                        $image_info = getimagesize($path);
                        $image_data = fread(fopen($path, 'r'), filesize($path));
                        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
                        unlink($path);
                        if($trainst){
                            $data[$column][$row] = $base64_image;
                        }else{
                            $data[$row][$column] = $base64_image;
                        }
                    }
                }
            }
        }catch (\PHPExcel_Exception $e){
            return $dataset = array('code'=>1,'info'=>'文件类型错误');
        }
        return $dataset = array('code'=>0,'data'=>$data,'sheet'=>$sheet);
    }


    }


   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值