php使用phpexcel生成excel包含图片并导出

开发环境:linux

框架:thinkphp3.2

在之前遇到一个场景,是把excel表格中的数据解析出来,接触到了phpexcel,

先给个链接 http://blog.csdn.net/fei003/article/details/72897685


这个需要把商品信息导出表格,并且表格中还包含图片,所以这次又查了下,写下这次使用

PHPexcel的经历以及遇到的坑

首先把完整版代码贴出来,类库还是放在了vendor中



public function getExcel(){

        $ids = I('post.ids');
        $goods = $this->goods_model->select();  //查找自己所需要的数据

        // 实例化excel
        // 引入文件
        Vendor("PHPExcel.PHPExcel");
        vendor('PHPExcel/PHPExcel/Writer/Excel2007.php');
        $phpExcel = new \PHPExcel();
        $objDrawing = new \PHPExcel_Worksheet_Drawing();
        $phpExcel->getProperties()->setTitle("商品价格表");
        $phpExcel->getProperties()->setSubject("趣买呗商品价格表");
        // 对单元格设置居中效果
        $phpExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('E')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('F')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $phpExcel->getActiveSheet()->getStyle('G')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        //单独添加列名称
        $phpExcel->setActiveSheetIndex(0);
        $phpExcel->getActiveSheet()->setCellValue('A1', '商品编号');//可以指定位置
        $phpExcel->getActiveSheet()->setCellValue('B1', '商品名称');
        $phpExcel->getActiveSheet()->setCellValue('C1', '单价');
        $phpExcel->getActiveSheet()->setCellValue('D1', '本店售价');
        $phpExcel->getActiveSheet()->setCellValue('E1', '箱规');
        $phpExcel->getActiveSheet()->setCellValue('F1', '产品图片');
        $phpExcel->getActiveSheet()->setCellValue('G1', '指导价格');
        // 设置高度
        $phpExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
        $phpExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
        $phpExcel->getActiveSheet()->getColumnDimension('C')->setWidth(5);
        $phpExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
        $phpExcel->getActiveSheet()->getColumnDimension('D')->setWidth(5);
        $phpExcel->getActiveSheet()->getColumnDimension('E')->setWidth(10);
        $phpExcel->getActiveSheet()->getColumnDimension('F')->setWidth(10);
        $phpExcel->getActiveSheet()->getColumnDimension('G')->setWidth(10);

        //循环添加数据(根据自己的逻辑)
        foreach ($goods as $k=>$v){
            $i = $k + 2;
            // 对样式进行修饰
            $phpExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(50);
            $phpExcel->getActiveSheet()->getStyle('A'.$i)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $phpExcel->getActiveSheet()->getStyle('B'.$i)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

            $phpExcel->getActiveSheet()->setCellValue('A' . $i, $v['goods_sn']);
            $phpExcel->getActiveSheet()->setCellValue('B' . $i, $v['goods_name']);
            $phpExcel->getActiveSheet()->setCellValue('C' . $i, $v['shop_price'] / $v['goods_packnum']);
            $phpExcel->getActiveSheet()->setCellValue('D' . $i, $v['shop_price']);
            $phpExcel->getActiveSheet()->setCellValue('E' . $i, $v['goods_packnum']);
            // 对图片进行判断
            if(!empty($v['original_img'])){
                $image = './data/upload/'.$v['original_img'];
                if( @fopen($image , 'r' ) ) {
		    //这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
                    $objDrawing = new \PHPExcel_Worksheet_Drawing();
                    $objDrawing->setPath($image);
		    // 设置图片的宽度
                    $objDrawing->setHeight(50);
                    $objDrawing->setWidth(50);
                    $objDrawing->setCoordinates('F' . $i);
                    $objDrawing->setWorksheet($phpExcel->getActiveSheet());
                }
            }
            $phpExcel->getActiveSheet()->setCellValue('G' . $i, $v['market_price']);
        }

        // 对文件进行保存
        $filename = date('Y年m月d日-趣买呗商品价格表',time()).'.xlsx';
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=\"$filename\"");
        header('Cache-Control: max-age=0');
	// 通过工厂类实例化excel5,本来我想使用 excel2007,但是本地测试没有问题,到线上就出错,报错链接找不到
        $objWriter = \PHPExcel_IOFactory::createWriter($phpExcel, 'Excel5');
        $objWriter->save('php://output'); //文件通过浏览器下载

    }


上面是完整可完美运行的代码,下面我说下我遇到的坑

主要是两点

最开始我的excel输出是使用这个方式

        $objWriter = new \PHPExcel_Writer_Excel2007($phpExcel);

      //        直接下载的代码
        $filename = date('Y年m月d日-趣买呗商品价格表',time()).'.xls';
      header("Pragma: public");
      header("Expires: 0");
      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");
      header("Content-Type:application/octet-stream");
      header("Content-Type:application/download");;
      header('Content-Disposition:attachment;filename='.$filename);
      header("Content-Transfer-Encoding:binary");
      $objWriter->save('php://output');


一:图片出不来

图片生成的方法不会使用,刚开始实例化的时候把

      $objDrawing = new \PHPExcel_Worksheet_Drawing();

这一句放到循环外面了,怎么也出不来图片,后来放到循环里面就好了,应该是每次实例化都生成一张图片吧

二: ERR_INVALID_RESPONSE


碰到这个问题简直是一脸懵逼到百联懵逼

我本地完美运行,成功生成excel,正嗨着放到线上,但是一运行就搞这个错误,丝毫没有思路啊

各种百度,说什么的都有,

主要有两种

1  这个Writer->save错误可能由于很多原因导致,其中有一部分是因为header和缓冲区的错误导致的

   然后可能是header头错了,所以就把header头修改了一下,改成了上面代码中的那样

  但是改了之后还是不行,突然发现一个博客中导出excel实例的对象和我写的不一样

我是使用的这种方法

 $objWriter = new \PHPExcel_Writer_Excel2007($phpExcel);

      估计就是这个的问题

所以又试了这一种

$objWriter = \PHPExcel_IOFactory::createWriter($phpExcel, 'Excel5');

好吧,问题结觉了,感觉真是迷茫


我对这个phpexcel还是不太熟悉,还得努力啊



2  php版本过高,要修改phpexcel的一个方法类库(这另外一个可能的原因,但是我用的php5.6,所以和我没啥关系了)

在高版本PHP7下,出现ERR_INVALID_RESPONSE的错误还可能由于下面的原因导致


Fatal error: 'break' not in the 'loop' or 'switch' context in \PHPExcel\PHPExcel\Calculation\Functions.php on line 581
请打开PHPExcel\Calculation\Functions.php文件,删除掉581行的break即可


最终,问题终于解决了

你可能感兴趣的:(php学习,thinkphp3.2学习)