关于导出后出错的问题
https://segmentfault.com/q/1010000005330214
https://blog.csdn.net/ohmygirl/article/details/6907946
我遇到了文件损坏,经过百度,大神说是缓冲区的问题,在导出函数的第一行加上
ob_end_clean();
相关介绍
https://blog.csdn.net/soonfly/article/details/52103795
扩展下载链接
https://pan.baidu.com/s/1yPzl7dKZ-CT6DNi9SUt6kg
本文章摘取了一下文献
http://www.thinkphp.cn/code/1257.html
thinkphp3.2和phpexcel导入
http://www.thinkphp.cn/code/2124.html
thinkphp3.2和phpexcel导入,出现PHPExcel_RichText object解决办法
http://www.thinkphp.cn/code/2143.html
thinkphp3.2和phpexcel导出带生成图片完美案例
http://www.thinkphp.cn/code/2112.html
第一步:下载PHPEXCEL文件(这个可以百度下载)
第二步:解压这个文件,把这里全部的文件复制到 ThinkPHP/Library/Org/Util
这个文件夹下面(如图所示), 并把 PHPExcel.php 这个文件改名为 PHPExcel.class.php
第三步:如何使用
生成excel的代码如下和上面图片类似
public function imgexcel(){
ob_end_clean(); import("Org.Util.PHPExcel"); $excel = new \PHPExcel(); $excel->getProperties()->setCreator("JAMES") ->setLastModifiedBy("JAMES") ->setTitle("zltrans") ->setSubject("Dorder") ->setDescription("Dorder List") ->setKeywords("Dorder") ->setCategory("Test result file"); $excel->setActiveSheetIndex(0) ->setCellValue("A1","hello") ->setCellValue("A3","龙龙") ->setCellValue("B2","你好") ->setCellValue("B4","世界"); import("Org.Util.PHPExcel.IOFactory"); $excelWriter = \PHPExcel_IOFactory::createWriter($excel,\'Excel2007\');
//转码文件名,防止汉字乱码 $filename = iconv("utf-8","gb2312","guagua龙.xlsx"); $excelWriter->save($filename);//使用下载方法一的时候注释 $this->force_download($filename);//使用下载方法一的时候注释
}
下载方法一:
header(\'Content-Type: application/vnd.ms-excel\'); header("Content-Disposition: attachment;filename=\"$filename\"");//文件名 header(\'Cache-Control: max-age=0\'); $objWriter = \PHPExcel_IOFactory::createWriter($excel, \'Excel2007\'); $objWriter->save(\'php://output\'); //文件通过浏览器下载
下载方法二:
导出到了服务器上,如果需要下载到客户端的话如下:
//下面两个是下载需要的函数 public function force_download($filename) { if ($filename == \'\'){ return FALSE; } if (FALSE === strpos($filename, \'.\')){ return FALSE; } $x = explode(\'.\', $filename); $extension = end($x); $mimes =$this->getMimes(); // Set a default mime if we can\'t find it if ( ! isset($mimes[$extension])){ $mime = \'application/octet-stream\'; }else{ $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; } // Generate the server headers if (strpos($_SERVER[\'HTTP_USER_AGENT\'], "MSIE") !== FALSE) { header(\'Content-Type: "\'.$mime.\'"\'); header(\'Content-Disposition: attachment; filename="\'.$filename.\'"\'); header(\'Expires: 0\'); header(\'Cache-Control: must-revalidate, post-check=0, pre-check=0\'); header("Content-Transfer-Encoding: binary"); header(\'Pragma: public\'); header("Content-Length: ".filesize($filename)); } else { header(\'Content-Type: "\'.$mime.\'"\'); header(\'Content-Disposition: attachment; filename="\'.$filename.\'"\'); header("Content-Transfer-Encoding: binary"); header(\'Expires: 0\'); header(\'Pragma: no-cache\'); header("Content-Length: ".filesize($filename)); } readfile($filename); } private function getMimes(){ return $mimes = array( \'hqx\' => \'application/mac-binhex40\', \'cpt\' => \'application/mac-compactpro\', \'csv\' => array(\'text/x-comma-separated-values\', \'text/comma-separated-values\', \'application/octet-stream\', \'application/vnd.ms-excel\', \'application/x-csv\', \'text/x-csv\', \'text/csv\', \'application/csv\', \'application/excel\', \'application/vnd.msexcel\'), \'bin\' => \'application/macbinary\', \'dms\' => \'application/octet-stream\', \'lha\' => \'application/octet-stream\', \'lzh\' => \'application/octet-stream\', \'exe\' => array(\'application/octet-stream\', \'application/x-msdownload\'), \'class\' => \'application/octet-stream\', \'psd\' => \'application/x-photoshop\', \'so\' => \'application/octet-stream\', \'sea\' => \'application/octet-stream\', \'dll\' => \'application/octet-stream\', \'oda\' => \'application/oda\', \'pdf\' => array(\'application/pdf\', \'application/x-download\'), \'ai\' => \'application/postscript\', \'eps\' => \'application/postscript\', \'ps\' => \'application/postscript\', \'smi\' => \'application/smil\', \'smil\' => \'application/smil\', \'mif\' => \'application/vnd.mif\', \'xls\' => array(\'application/excel\', \'application/vnd.ms-excel\', \'application/msexcel\'), \'ppt\' => array(\'application/powerpoint\', \'application/vnd.ms-powerpoint\'), \'wbxml\' => \'application/wbxml\', \'wmlc\' => \'application/wmlc\', \'dcr\' => \'application/x-director\', \'dir\' => \'application/x-director\', \'dxr\' => \'application/x-director\', \'dvi\' => \'application/x-dvi\', \'gtar\' => \'application/x-gtar\', \'gz\' => \'application/x-gzip\', \'php\' => \'application/x-httpd-php\', \'php4\' => \'application/x-httpd-php\', \'php3\' => \'application/x-httpd-php\', \'phtml\' => \'application/x-httpd-php\', \'phps\' => \'application/x-httpd-php-source\', \'js\' => \'application/x-javascript\', \'swf\' => \'application/x-shockwave-flash\', \'sit\' => \'application/x-stuffit\', \'tar\' => \'application/x-tar\', \'tgz\' => array(\'application/x-tar\', \'application/x-gzip-compressed\'), \'xhtml\' => \'application/xhtml+xml\', \'xht\' => \'application/xhtml+xml\', \'zip\' => array(\'application/x-zip\', \'application/zip\', \'application/x-zip-compressed\'), \'mid\' => \'audio/midi\', \'midi\' => \'audio/midi\', \'mpga\' => \'audio/mpeg\', \'mp2\' => \'audio/mpeg\', \'mp3\' => array(\'audio/mpeg\', \'audio/mpg\', \'audio/mpeg3\', \'audio/mp3\'), \'aif\' => \'audio/x-aiff\', \'aiff\' => \'audio/x-aiff\', \'aifc\' => \'audio/x-aiff\', \'ram\' => \'audio/x-pn-realaudio\', \'rm\' => \'audio/x-pn-realaudio\', \'rpm\' => \'audio/x-pn-realaudio-plugin\', \'ra\' => \'audio/x-realaudio\', \'rv\' => \'video/vnd.rn-realvideo\', \'wav\' => array(\'audio/x-wav\', \'audio/wave\', \'audio/wav\'), \'bmp\' => array(\'image/bmp\', \'image/x-windows-bmp\'), \'gif\' => \'image/gif\', \'jpeg\' => array(\'image/jpeg\', \'image/pjpeg\'), \'jpg\' => array(\'image/jpeg\', \'image/pjpeg\'), \'jpe\' => array(\'image/jpeg\', \'image/pjpeg\'), \'png\' => array(\'image/png\', \'image/x-png\'), \'tiff\' => \'image/tiff\', \'tif\' => \'image/tiff\', \'css\' => \'text/css\', \'html\' => \'text/html\', \'htm\' => \'text/html\', \'shtml\' => \'text/html\', \'txt\' => \'text/plain\', \'text\' => \'text/plain\', \'log\' => array(\'text/plain\', \'text/x-log\'), \'rtx\' => \'text/richtext\', \'rtf\' => \'text/rtf\', \'xml\' => \'text/xml\', \'xsl\' => \'text/xml\', \'mpeg\' => \'video/mpeg\', \'mpg\' => \'video/mpeg\', \'mpe\' => \'video/mpeg\', \'qt\' => \'video/quicktime\', \'mov\' => \'video/quicktime\', \'avi\' => \'video/x-msvideo\', \'movie\' => \'video/x-sgi-movie\', \'doc\' => \'application/msword\', \'docx\' => array(\'application/vnd.openxmlformats-officedocument.wordprocessingml.document\', \'application/zip\'), \'xlsx\' => array(\'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\', \'application/zip\'), \'word\' => array(\'application/msword\', \'application/octet-stream\'), \'xl\' => \'application/excel\', \'eml\' => \'message/rfc822\', \'json\' => array(\'application/json\', \'text/json\') ); }
下面是导出excel带图片的代码
这个代码的使用环境是图片全部是网络图片,需要下载下来,然后在将图片放进excel,如果是本地图片可以直接169行参数写完整的图片路径即可
以下代码是写在thingphp3.2的function.php里面的
1 /** 2 * 判断文件夹是否存在,不存在则创建,支持递归试的多目录创建 3 * @param [type] $dir [description] 4 * @return boolean [description] 5 */ 6 function z_is_dir($dir=\'\'){ 7 $dir = "./excelimgs"; 8 if(empty($dir)){ 9 return false; 10 }else{ 11 if(is_dir($dir)){ 12 return true; 13 }else{ 14 $dir = iconv("UTF-8","GBK",$dir); 15 return mkdir($dir,0777,true); 16 } 17 } 18 } 19 /** 20 * 下载图片到指定目录 21 * @return [type] [description] 22 */ 23 function imgdown($url=\'\',$dir=\'\'){ 24 if(!preg_match(\'/\/([^\/]+\.[a-z]{3,4})$/i\',$url,$matches)){ 25 return false; 26 } 27 //判断目录有效性 28 if(!z_is_dir($dir)){ 29 return false; 30 } 31 32 $image_name = strToLower($matches[1]); 33 $ch = curl_init ($url); 34 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 35 curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 36 $img = curl_exec ($ch); 37 curl_close ($ch); 38 $fp = fopen($dir.$image_name,\'w\');//保存的文件名称用的是链接里面的名称 39 // dump($image_name);die; 40 fwrite($fp, $img); 41 fclose($fp); 42 } 43 /** 44 * excel导出 图片文件 45 * @return [type] [description] 46 */ 47 function look_down($data=\'\',$dir=\'\'){ 48 //以下是数据格式 49 // $data[] = array( 50 // \'addtime\'=>\' 2018/03/05 12:23\', 51 // \'address\'=>\'平顶山卫东区新华路南环路明珠花园\', 52 // \'car_code\'=>\'豫D38880\', 53 // \'shenhe\'=>\'小明\', 54 // \'zhidan\'=>\'小强\', 55 // \'price\'=>\'5\', 56 // \'img\'=>array( 57 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 58 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 59 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 60 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 61 // \'图片链接http://p6t.clouddn.com/5acdb30.png\' 62 // ) 63 // ); 64 // $data[] = array( 65 // \'addtime\'=>\' 2018/08/05 12:23\', 66 // \'address\'=>\'郑州市卫东区新华路南环路明珠花园\', 67 // \'car_code\'=>\'豫D38X80\', 68 // \'shenhe\'=>\'小红\', 69 // \'zhidan\'=>\'小刚\', 70 // \'price\'=>\'5\', 71 // \'img\'=>array( 72 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 73 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 74 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 75 // \'图片链接http://p6t.clouddn.com/5acdb30.png\', 76 // \'图片链接http://p6t.clouddn.com/5acdb30.png\' 77 // ) 78 // ); 79 if(empty($data) || empty($dir)){ 80 E(\'数据或者路径不能为空;数据格式请进入本方法看注释;路径需要根目录开始的路径,如:./excelimgs/\'); 81 return false; 82 } 83 //将所有包含的图片下载下来 84 foreach ($data as $k => $v) { 85 $imgs = $v[\'img\']; 86 $img_str = null; 87 foreach ($imgs as $kk => $vv) { 88 $this->imgdown($vv,$dir); 89 //在下载的过程中将文件名单独摘出来,用于生成excel的时候要的文件名 90 $img_str[] = substr($vv,strripos($vv,"/")+1); 91 } 92 $data[$k][\'img_str\'] = $img_str; 93 } 94 95 // 导出Exl 96 import("Org.Util.PHPExcel"); 97 import("Org.Util.PHPExcel.Worksheet.Drawing"); 98 import("Org.Util.PHPExcel.Writer.Excel2007"); 99 $objPHPExcel = new \PHPExcel(); 100 101 $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel); 102 103 $objActSheet = $objPHPExcel->getActiveSheet(); 104 105 // 水平居中(位置很重要,建议在最初始位置) 106 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'A\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 107 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'B\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 108 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'C\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 109 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'D\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 110 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'E\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 111 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'F\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 112 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'G\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 113 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'H\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 114 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'I\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 115 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'J\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 116 $objPHPExcel->setActiveSheetIndex(0)->getStyle(\'K\')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 117 118 $objActSheet->setCellValue(\'A1\', \'时间\'); 119 $objActSheet->setCellValue(\'B1\', \'地点\'); 120 $objActSheet->setCellValue(\'C1\', \'车牌号\'); 121 $objActSheet->setCellValue(\'D1\', \'制单人\'); 122 $objActSheet->setCellValue(\'E1\', \'审核人\'); 123 $objActSheet->setCellValue(\'F1\', \'奖励金\'); 124 $objActSheet->setCellValue(\'G1\', \'图片\'); 125 $objActSheet->setCellValue(\'H1\', \'图片\'); 126 $objActSheet->setCellValue(\'I1\', \'图片\'); 127 $objActSheet->setCellValue(\'J1\', \'图片\'); 128 $objActSheet->setCellValue(\'K1\', \'图片\'); 129 // 设置个表格宽度 130 $objPHPExcel->getActiveSheet()->getColumnDimension(\'A\')->setWidth(20); 131 $objPHPExcel->getActiveSheet()->getColumnDimension(\'B\')->setWidth(80); 132 $objPHPExcel->getActiveSheet()->getColumnDimension(\'C\')->setWidth(30); 133 $objPHPExcel->getActiveSheet()->getColumnDimension(\'D\')->setWidth(20); 134 $objPHPExcel->getActiveSheet()->getColumnDimension(\'E\')->setWidth(20); 135 $objPHPExcel->getActiveSheet()->getColumnDimension(\'F\')->setWidth(20); 136 $objPHPExcel->getActiveSheet()->getColumnDimension(\'G\')->setWidth(30); 137 $objPHPExcel->getActiveSheet()->getColumnDimension(\'H\')->setWidth(30); 138 $objPHPExcel->getActiveSheet()->getColumnDimension(\'I\')->setWidth(30); 139 $objPHPExcel->getActiveSheet()->getColumnDimension(\'J\')->setWidth(30); 140 $objPHPExcel->getActiveSheet()->getColumnDimension(\'K\')->setWidth(30); 141 142 // 垂直居中 143 $objPHPExcel->getActiveSheet()->getStyle(\'A\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 144 $objPHPExcel->getActiveSheet()->getStyle(\'B\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 145 $objPHPExcel->getActiveSheet()->getStyle(\'C\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 146 $objPHPExcel->getActiveSheet()->getStyle(\'D\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 147 $objPHPExcel->getActiveSheet()->getStyle(\'E\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 148 $objPHPExcel->getActiveSheet()->getStyle(\'F\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 149 $objPHPExcel->getActiveSheet()->getStyle(\'G\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 150 $objPHPExcel->getActiveSheet()->getStyle(\'H\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 151 $objPHPExcel->getActiveSheet()->getStyle(\'I\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 152 $objPHPExcel->getActiveSheet()->getStyle(\'J\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 153 $objPHPExcel->getActiveSheet()->getStyle(\'K\')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); 154 155 foreach($data as $k=>$v){ 156 $k +=2; 157 // 表格内容 158 $objActSheet->setCellValue(\'A\'.$k, $v[\'addtime\']); 159 $objActSheet->setCellValue(\'B\'.$k, $v[\'address\']); 160 $objActSheet->setCellValue(\'C\'.$k, $v[\'car_code\']); 161 $objActSheet->setCellValue(\'D\'.$k, $v[\'shenhe\']); 162 $objActSheet->setCellValue(\'E\'.$k, $v[\'zhidan\']); 163 $objActSheet->setCellValue(\'F\'.$k, $v[\'price\']."元"); 164 $lies = array(\'G\',\'H\',\'I\',\'J\',\'K\'); 165 $lies_index = 0; 166 foreach ($v[\'img_str\'] as $kk => $vv) { 167 // 图片生成 168 $objDrawing[$k] = new \PHPExcel_Worksheet_Drawing(); 169 $objDrawing[$k]->setPath($dir.$vv); 170 // 设置宽度高度 171 $objDrawing[$k]->setHeight(80);//照片高度 172 $objDrawing[$k]->setWidth(80); //照片宽度 173 /*设置图片要插入的单元格*/ 174 $objDrawing[$k]->setCoordinates($lies[$lies_index].$k); 175 // 图片偏移距离 176 $objDrawing[$k]->setOffsetX(0); 177 $objDrawing[$k]->setOffsetY(0); 178 $objDrawing[$k]->setWorksheet($objPHPExcel->getActiveSheet()); 179 $lies_index++; 180 } 181 182 183 // 表格高度 184 $objActSheet->getRowDimension($k)->setRowHeight(80); 185 186 } 187 188 $fileName = \'报价表\'; 189 $date = date("Y-m-d",time()); 190 $fileName .= "_{$date}.xls"; 191 $fileName = iconv("utf-8", "gb2312", $fileName); 192 //重命名表 193 // $objPHPExcel->getActiveSheet()->setTitle(\'test\'); 194 //设置活动单指数到第一个表,所以Excel打开这是第一个表 195 $objPHPExcel->setActiveSheetIndex(0); 196 header(\'Content-Type: application/vnd.ms-excel\'); 197 header("Content-Disposition: attachment;filename=\"$fileName\""); 198 header(\'Cache-Control: max-age=0\'); 199 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, \'Excel2007\'); 200 $objWriter->save(\'php://output\'); //文件通过浏览器下载 201 // END 202 }
如果文件损坏,可以在导出的方法的第一行加入ob_end_clean();