lvyahui

所需工具

  • 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 }

 

 

分类:

技术点:

相关文章: