PHP 生成Word文档

本文采用 PHPWord

composer 安装

composer require phpoffice/phpword
引入phpword
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\TemplateProcessor;
        
        //初始化PHPWord对象
        $PHPWord = new PhpWord();
        //载入模板文件 ROOT_PATH项目根目录
        $templateProcessor = $PHPWord->loadTemplate(ROOT_PATH . '/public/uploads/word/personal.docx');
        //通过setValue 方法给模板赋值(中文)
        $templateProcessor->setValue('name', iconv('utf-8', 'GB2312//IGNORE', $data['name']));
        //在word文档里面 ${name} 会自动替换
        //加载图片
        $templateProcessor->setImageValue('img',['src' => $data['img']]);
        
        //保存并且下载word文档
        //保存文件名
        $downFileName = time() . ".docx";
        //文件全路径+文件名+后缀
        $templateProcessor->saveAs(ROOT_PATH . "/public/uploads/word/" . $downFileName);
        //文件全路径
        $_file = ROOT_PATH . "/public/uploads/word/" . $downFileName;

        //以只读和二进制模式打开文件
        $file = fopen($_file, "rb");

        //告诉浏览器这是一个文件流格式的文件
        Header("Content-type: application/octet-stream");
        //请求范围的度量单位
        Header("Accept-Ranges: bytes");
        //Content-Length是指定包含于请求或响应中数据的字节长度
        Header("Accept-Length: " . filesize($_file));
        //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
        Header("Content-Disposition: attachment; filename='{$name}.doc'");
        //读取文件内容并直接输出到浏览器
        echo fread($file, filesize($_file));
        fclose($file);
        exit ();

        //告诉浏览器这是一个文件流格式的文件
        Header("Content-type: application/octet-stream");
        //请求范围的度量单位
        Header("Accept-Ranges: bytes");
        //Content-Length是指定包含于请求或响应中数据的字节长度
        Header("Accept-Length: " . filesize($_file));
        //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
        Header("Content-Disposition: attachment; filename='{$name}.doc'");
        //读取文件内容并直接输出到浏览器
        echo fread($file, filesize($_file));
        fclose($file);
        exit ();


中文乱码解决

打开TemplateProcessor.php文件

246行注释$subject = utf8_encode($subject);

新增$subject = iconv('gbk', 'utf-8', $subject);

即可


if (!Text::isUTF8($subject)) {
//           $subject = utf8_encode($subject);
            $subject = iconv('gbk', 'utf-8', $subject);
}

Word模板



保存下载的word文档效果

Pasa吴技术博客
请先登录后发表评论
  • latest comments
  • 总共0条评论