所需工具
- phpwrod 库
- php_zip 扩展
下载phpword库,放到类加载路径。
安装php_zip扩展
下载地址
linux下载targz包,windows下下载dll
linux下
1 wget http://pecl.php.net/get/zip-1.12.5.tgz 2 cd zip-1.12.5 3 phpize 4 ./configure 5 make 6 cp zip.so /alidata/server/php-5.4.23/lib/php/extensions/no-debug-non-zts-20100525/ 7 cd /alidata/server/php-5.4.23/etc/ 8 cp php.ini php.ini.bak 9 echo 'extension=zip.so' >> php.ini 10 tail php.ini 11 service httpd restart
PHPword生成脚本
首先要在word模板文件中定义好变量,定义的方式为
1 ${变量名}
1 protected function proccessWord($templeteFilename,$values,$defaultValues,$baseFloder,$outFilename = 'word'){ 2 $values = array_merge($defaultValues,$values); 3 $template = new TemplateProcessor($templeteFilename); 4 foreach ($values as $k=>$v) 5 { 6 if(!is_array($v)){ 7 $template->setValue($k, strval($v)); 8 } 9 } 10 if ( ! preg_match("|.+?\.docx$|", $outFilename)) 11 { 12 $outFilename .= '.docx$'; 13 } 14 $outFille = $baseFloder.'/'.$outFilename; 15 $template->saveAs($outFille); 16 return $outFille; 17 }
PHP压缩打包并响应
1 public function postDocs(){ 2 $query = Ownerdebt::whereNotNull('id')->with('owner.block')->where('status','active'); 3 if(Input::get('type') == 'all'){ 4 }else{ 5 $selected = Input::get('selected'); 6 $ids = array_unique(explode(",",$selected)); 7 $query = $query->whereIn('id',$ids); 8 } 9 $ownerdebts = $query->get(); 10 11 $user = User::with('property')->find(Auth::user()->id); 12 $defaultValues = array( 13 'name' =>'姓名', 14 'property' =>'某公司', 15 'block' =>'某小区', 16 'room' =>'某房', 17 'start_time'=>'2015年X月X日', 18 'end_time' =>'2015年X月X日', 19 'money' =>'1000', 20 'extra' =>'400', 21 'total' =>'1400', 22 'last_time'=>'2015年X月X日',// 最后期限 23 'create_date'=>'2015年X月X日', 24 ); 25 $baseFloder = base_path().'/../uploads/docs/'; 26 $allDocs = []; 27 $property = $user->property; 28 if($property){ 29 foreach($ownerdebts as $ot){ 30 $values = $ot->toArray(); 31 $values['name'] = $ot->owner->name; 32 $values['property'] = $property->name; 33 $values['block'] = $ot->owner->block->name; 34 $values['room'] = $values['owner']['room']; 35 $values['start_time'] = date('Y 年 m 月 d',strtotime($values['start_time'])); 36 $values['end_time'] = date('Y 年 m 月 d',strtotime($values['end_time'])); 37 $values['total'] = $values['money'] + $values['extra']; 38 $values['last_time'] = date('Y 年 m 月 d',strtotime('+30 day')); 39 $values['create_date'] = date('Y 年 m 月 d'); 40 41 //SiteHelpers::P($values); 42 $fileName = $values['room'].'-'.date("Y-m-d").'.docx'; 43 $allDocs [] = $fileName; 44 $this->proccessWord( 45 app_path().'/template/lawyer.docx', 46 $values, 47 $defaultValues, 48 $baseFloder, 49 $fileName 50 ); 51 } 52 // 打包 53 $zip_file = dirname(base_path())."/uploads/zip/lawyer-".date('Y-m-d-H-i-s').".zip"; 54 $zipHelpers = new ZipHelpers(); 55 //$zipTool = new ZipArchive(); 56 //if(file_exists($zip_file)) unlink($zip_file); 57 //$open = $zipTool->open($zip_file,ZipArchive::CREATE); 58 foreach($allDocs as $docs){ 59 $zipHelpers->add_data('docs/'.$docs, file_get_contents($baseFloder.'/'.$docs)); 60 //if($open) $zipTool->addFile($docs,$baseFloder.'/'.$docs); 61 } 62 //if($open) $zipTool->close(); 63 64 $flag = $zipHelpers->archive($zip_file); 65 $zipHelpers->clear_data(); 66 67 if($flag) { 68 header("Content-type: application/zip"); 69 header("Content-Disposition: attachment; filename=\"" .basename($zip_file) . "\""); 70 // header("Content-Length: " . filesize($zip_file)); // 这里不能响应长度,否则会造成压缩包损坏 71 readfile($zip_file); 72 }else{ 73 74 } 75 } 76 exit; 77 }