Tp5关于PHPEcxel的使用以及遇见的坑

一、Tp5的PHPExcel安装

composer下载  composer require phpoffice/phpexcel

文件存储位置 vendor/phpofice/phpexcel

二、tp5使用PHPExcel的导入

不多说废话,直接上代码。

public function createExcel()
    {
        // 接收文件
        $inputdata = $this->request->file('file');
        //上传文件
        $info = $inputdata->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{
            $this->error('文件过大或格式不正确导致上传失败-_-!');
        }
        // 载入excel文件
        $excel = $reader->load($filePath,$encode='utf-8');
        //读取第一张表
        $sheet = $excel->getSheet(0)->toArray();
        //获取总行数
        foreach ($sheet as $k=>$v){

            //$data[$k]["id"]=$v[0];//单号  ****************
            $data[$k]["userid"]=$v[1];//类型名称
            $data[$k]["cardid"]=$v[2];
            $data[$k]["username"]=$v[3];
            $data[$k]["ruly"]=$v[4];
            $data[$k]["time"]=time();
        }
        // 添加数据
        for ($i = 1; $i < count($data); $i ++) {
            $res[] = $data[$i];
            //将数据保存到数据库
        }
        $result = $this->guest->insertAll($res);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

1、看代码的时候注意一下那个 ******** 那个地方就会遇见添加Excel的第一个坑,这个坑就是 rying to access array offset on value of type int
因为我们在创建数据库时id时自增张int型,然后上传时候时数据,当我们的数据库中的id已经有了,那么就会出现冲突,报这个偏移量的错误。

三、PHPExcel导出代码以及问题

我做的是单独吧导出封装起来了,使用的是调用方式

public function exportExcel($expTitle,$expCellName,$expTableData){
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称
        $fileName = $xlsTitle;//or $xlsTitle 文件名称可根据自己情况设定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);

        $objPHPExcel = new \PHPExcel();
        $cellName = array('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','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');

        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
        // $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
        }
        // Miscellaneous glyphs, UTF-8
        for($i=0;$i<$dataNum;$i++){
            for($j=0;$j<$cellNum;$j++){
                $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]);
            }
        }
        //$filePath = "/Users/shuaibi/Desktop/".$fileName.".xlsx"; *********
		// halt($filePath);   	***********
       
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl;charset=UTF-8");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");
        header("Content-Disposition:attachment;filename=" . $fileName . ".xlsx");
        header("Content-Transfer-Encoding:binary");

        $PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $PHPWriter->save('php://output'); //表示在$path路径下面生成demo.xlsx文件

        #释放内存
        unset($PHPWriter);
        unset($objPHPExcel);
        return 1;
    }

public function dchis(){
        $xlsName  = "入场历史数据".date("m-d His");
        $history = new  History();
        $xlsCell  = array(
            array('userid','UserID'),
            array('site','会场名称'),
            array('time','扫描时间'),
            array('static','进出场'),

        );
        /*
        $xlsCell  = array(
            array('userid',=>'123'),
            array('site'=>'会场1231'),
            array('time'=>time()),
            array('static'=>'进场'),

        );
        */
        $data = $history->select();
        $xlsname=[];
        foreach ($data as $key => $val){
            $xlsname[] = [
                "userid" => $val['userid'],
                "site" => $val['site'],
                "time" => date("Y-m-d H:i",$val['time']),
                "static" => $val['static'],
            ];
        }
        $this->exportExcel($xlsName,$xlsCell,$xlsname);
       // return  apiArr(config("status.success") , "成功导出!");
    }

1、数据导出时遇见不清楚的错误的时候,首先创建虚拟数据,也就是写死数据,比如 **/* */**中的测试代码一样,看一下能不能成功导出。
2、这个问题,也是我测试了好久的问题。如果你使用ajax调用导出,他不会使用浏览器下载,回报一个下图错误在这里插入图片描述

其实这个错误很好修改
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
这个错误真的让我修改了满满1天。我是真的fo了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章