PHP如何引用word模板生成word文件

一个PHP小白的苦逼之路,PHP接口大家想必只要有点其他语言的基础,都能很快上手,并且能够将数据成功返回给前端。但是只会写接口的程序员不是好程序员,但是PHP的后端小白除了写接口还能干嘛呢?
正好公司要求生成word形式的合同,而且是以模板的形式。这下子就不能用纯生的PHP去写了,网上也有很多纯生PHP去写,但是流程很多,代码也很多,小白的我肯定是能偷懒则偷懒,找到了一个通用的三方库(用composer自动导入PHPoffice/phpword),引用很方便,就想着po出来给和我一样的小白去偷懒。

进入正题:本流程是基于window环境下。

一、安装composer:Download Compser

在这里插入图片描述
点击Composer-Setup.exe之后按照流程安装就行,安装路径自己定义。
可能会出现安装报错,绝大部分原因是因为没有开启openssl配置。
我们打开 php 目录下的 php.ini,将 extension=php_openssl.dll 前面的分号去掉就可以了。

二、安装完成后,在cmd命令窗口或者powershell中输入composer -V指令查看composer安装是否成功。

在这里插入图片描述
然后最重要的就是将Packagist改为国内镜像了,因为这个composer软件是国外的,所以可能有些功能会被限制不能使用,在cmd命令窗口或者powershell中输入
composer config -g repo.packagist composer https://packagist.phpcomposer.com

三、项目中composer的使用:

我们需要先在项目的目录下创建一个 composer.json 文件,文件描述了项目的依赖关系。
json文件中写入:

{
    
    
    "require": {
    
    
        "monolog/monolog": "1.2.*"
    }
}

然后开启cmd命令控制中心或者powershell,将路径改为我们计算机中存储项目的路径,运行composer install,这下子我们项目中需要的依赖包就安装完了。

四、引入第三方库phpoffice/phpword。

这个库可以直接手写编辑word文件输出的样式,也可以导入word模板,然后替换里面需要变更的变量。(但是word模板的格式必须是docx后缀的,至于为什么doc的不行,看过源码后我觉得是可以的,可能是自己偷懒不想去找doc的方法,但是生成的word文件是可以为doc或者docx格式的)。
同样的在计算机中存储项目的路径下运行cmd命令控制中心或者powershell。输入composer require phpoffice/phpword,然后这个三方库就已经自动安装成功了,接下来就是去写代码了。

五、引入word模板并生成word文件。

我们需要将word模板中需要替换的变量改为${name}的形式,${}中的名字随便改。只是用来做变量替换的媒介。

	require_once . "/vendor/autoload.php";//这是composer自动生成的autoload.php文件,是需要手动导入的。
	$phpWord = new PhpOffice\PhpWord\PhpWord();
	$tmp = $phpWord -> loadTemplate("/xxx.docx");//这里指加载的word模板文件的路径,文件最好放在项目的包下面
	$tmp -> setValue('name', 'JerryKit');//其中前者name就是${}中的名字,后者为你想要替换的值
    $arr = array('a', 'b', 'c');//列如你想表格行随着你的值不断自增
    $rows = count($arr);//计算数组的长度
    $tmp -> cloneRow('name',$rows);//以name作为表格行的第一个元素,进行克隆行
    for ($i=0; $i < $rows; $i++) {
    
     
    	$tmp -> setValue("name#" . ($i + 1), $arr[i]);//按照顺序自动生成行,#不能少
  	}
  	//有俩种方式生成word文件
  	$tmpfile = $tmp->saveAs('/xxxxxxx.docx');//这边指生成到指定路径,并且取名为xxxxxxx。不需要执行下面的输出到控制台的代码。
  	
  	$tmpfile = $tmp->save();//暂存服务器,不指定路径。
  	ob_start();
	$fp = fopen($tmpfile,"r");
	$file_size = filesize($tmpfile);
	$downFileName = "xxxxxxx.docx";
	header("Cache-Comtrol: public");
	header("Content-type: application/octet-stream");
	header("Accept-Ranges: bytes");
	header("Content-Disposition: attachment; filename={
      
      $downFileName}.docx");
	header("Pragma:no-cache");
	header("Expires:0");
	$buffer = 1024;
	$file_count = 0;
    while(!feof($fp) && $file_count < $file_size){
    
    
	   $file_con = fread($fp,$buffer);
	   $file_count += $buffer;        
	   echo $file_con;
	}//将生成的word文件以二进制流输出到前端和控制台中
	ob_end_flush();
	fclose($fp);
	unlink($tmpfile);
	exit();

猜你喜欢

转载自blog.csdn.net/weixin_46304253/article/details/108253642
今日推荐