服务端生成word并压缩打包下载

简介: 所需工具 phpwrod 库 php_zip 扩展 下载phpword库,放到类加载路径。 安装php_zip扩展 下载地址  http://pecl.php.net/package/zip linux下载targz包,windows下下载dll   linux下 1 wget http://pecl.

所需工具

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

 

 

目录
相关文章
|
10月前
|
JavaScript 前端开发
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
|
前端开发 算法 API
直接在前端做 zip 压缩/解压
前段时间研究前端是如何解析 excel 表格的时候了解到 jszip 这个库,可以直接在前端对 zip 包进行压缩和解压缩,今天稍微水一篇。
|
4月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
268 4
|
10月前
|
Java 关系型数据库 MySQL
文件在线压缩与解压|基于Springboot实现文件在线压缩与解压
文件在线压缩与解压|基于Springboot实现文件在线压缩与解压
|
10月前
|
XML Go 数据格式
Go如何自动解压缩包?如何读取docx/doc文件内容?
在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件。
127 0
|
JSON 前端开发 JavaScript
前端下载二进制流文件
前端下载二进制流文件
392 0
|
JavaScript 算法 Java
网页内容压缩与解压教程
本教程将为你介绍如何使用Node.js、Java和Python进行网页内容的压缩与解压。我们将重点讨论gzip、deflate和brotli这三种常用的压缩方法。
386 0
|
Java 程序员
批量压缩16万个文件夹为压缩包(.zip格式)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
340 0
批量压缩16万个文件夹为压缩包(.zip格式)
|
前端开发 Java
如何使用zip工具类打包下载压缩图片?
如何使用zip工具类打包下载压缩图片?
如何使用zip工具类打包下载压缩图片?
|
存储 Android开发 开发者
【Google Play】APK 扩展包 ( 2021年09月02日最新处理方案 | 扩展文件名格式 | 扩展文件下载存放地址 )
【Google Play】APK 扩展包 ( 2021年09月02日最新处理方案 | 扩展文件名格式 | 扩展文件下载存放地址 )
283 0