开发环境: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();
这一句放到循环外面了,怎么也出不来图片,后来放到循环里面就好了,应该是每次实例化都生成一张图片吧
碰到这个问题简直是一脸懵逼到百联懵逼
我本地完美运行,成功生成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\Calculation\Functions.php文件,删除掉581行的break即可
最终,问题终于解决了