PhpWord文档

想实现更多功能的朋友可以仔细参考文档

https://phpword.readthedocs.io/en/latest/intro.html

一、使用环境

目前是在ThinkPHP5.0.21中使用的PhpWord,其他使用环境引入方式可能会有一点不同。

使用composer安装,直接使用下面的代码引入相关类库

二、安装

  1. 打开命令行进入项目根目录执行下面命令
  2. composer require phpoffice/phpword
  3. 安装完成 头部use 引入
  • use PhpOffice\PhpWord\IOFactory;
  • use PhpOffice\PhpWord\PhpWord;
  • use PhpOffice\PhpWord\TemplateProcessor;

三、使用模式

  1. 读取原有word模板,替换相关变量,word.docx是模板,里面有标签(注意:标签最好用“Notepad++编写,或者记事本、编译器,不要用word来编辑,然后在复制到word中对应位置,可以加粗,字体大小,字体颜色”),如下图所示,

替换为:

  1. 模板生成Word

使用场景:适合有一套固定的模板,只有几个关键的地方需要改变。

使用方式:下面介绍几行代码就足够完成整个word的替换了,需要更多功能参考文档。

//生成合同 $order_id 订单id
    public function createContract($order_id)
    {
        $orderInfo = StationOrder::with(['user', 'station'])->find($order_id);
        $data = [
            'value1' => $orderInfo->user->name, //用户名
            'value2' => $orderInfo->station->stationNm, //工位名
            'value3' => $orderInfo->station->price, //价格
            'value4' => date('Y年m月d日', $orderInfo['arrDt']), //入驻时间
            'value5' => date('Y年m月d日', $orderInfo['dptDt']), //到期时间
        ];
        $template_path = Db::name('attachment')->where(['extension' => 'docx', 'use' => 'attachment'])->value('file_url');
        $template_path = ROOT_PATH . 'public' . $template_path;
//读取模版word的版本最好是docx,要不然可能会读取不了
        $templateProcessor = new TemplateProcessor($template_path);
        foreach ($data as $k => $v) {  //读取模版word的版本最好是docx,要不然可能会读取不了
            $templateProcessor->setValue($k, $v);  //替换模板中的变量,对应word里的 ${xxxx}
        }
        // ROOT_PATH  =>  E:\phpstudy\PHPTutorial\WWW\666\
        $save_name = date('YmdHis') . '.docx';   //保存的文件名
        $return_path = DS.'uploads'.DS.'contract'.DS. $save_name;
        $savepath = ROOT_PATH . 'public'.DS.'uploads'.DS.'contract'.DS;
        if (!is_dir($savepath)) {
            @mkdir($savepath,0777);
        }
        $templateProcessor->saveAs($savepath.$save_name);   //将内容保存到生成新的word中
        StationOrder::update(['id' => $order_id, 'contract_url' => $return_path]);
        return $return_path;
    }

 //导出合同
    public function daochu($id) {
        $contract_url = StationOrderModel::where('id',$id)->value('contract_url');
        $file_name = end(explode(DS,$contract_url));
        $download_url = ROOT_PATH .'public'.$contract_url;  //真实路径
        $file1 = fopen($download_url, "r");    //打开文件
        //输入文件标签、下载文件
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length: " . filesize($download_url));
        Header("Content-Disposition: attachment; filename=" . $file_name);
        echo fread($file1, filesize($download_url));
        fclose($file1);
    }

四、最后

PS:

  1、Phpword虽然可以用代码生成word,但对于一些文字图片的定位操控起来非常麻烦,甚至无法控制。

  2、尽量使用模板,直接改动模板更加方便,只替换一些关键字就好。

  3、使用模板的时候要注意word格式要是docx,使用doc可能会报错。

我 秦始皇 打钱