phpword 模板使用

记录下项目中遇到的问题
应项目需求,需要将用户的数据生成word文档,最后找到了phpword,他可以通过事先设置好的模板生成相应的文档
效果

1.安装phpword

$ composer require phpoffice/phpword

2.准备一个 word 模板

3.在我们的控制器里编写代码

<?php

namespace App\Http\Controllers;

use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\PhpWord;
use App\Http\Controllers\Controller;

class TestController extends Controller
{
    public function demo()
    {
        //实例化 phpword 类
        $PHPWord = new PhpWord();

        //指定事先制作好的模板文件路径
        $templateProcessor = new TemplateProcessor(public_path("Uploads/pdf/demo3.docx"));

        // 需要的数据
        $arr = [];
        $arr = [
            [
                'num' => 1,
                'add' => '临平1',
                'dec' => '描述1',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣10分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣100分'],
                ]
            ],
            [
                'num' => 2,
                'add' => '临平2',
                'dec' => '描述2',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣4分;未经责任人签字确认,扣8分'],
                    ['list' => '未制定安全生产责任制,扣7分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣200分'],
                ]
            ],
            [
                'num' => 3,
                'add' => '临平3',
                'dec' => '描述3',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣10分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣9分;未经责任人签字确认,扣2分'],
                    ['list' => '未制定安全生产责任制,扣4分;未经责任人签字确认,扣8分'],
                    ['list' => '未制定安全生产责任制,扣7分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣300分'],
                ]
            ],
        ];

        // 循环次数
        $count = count($arr);

            // 将 ${num} 所在行clone
            $templateProcessor->cloneRow('num', $count); //复制行

            foreach ($arr as $kk => $vv) {
                $list = '';
                for ($i = 0; $i < count($vv['list']); $i++) {
                    if ($i == (count($vv['list']) - 1)) {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}';
                    } else {
                        // <w:br/> 换行符
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}<w:br/>';
                    }
                }
                $templateProcessor->setValue('list#' . ($kk + 1), $list);

            }

        // 保存新word文档
        $path = md5(time());
        if (!is_dir(public_path("Uploads/pdf"))) {
            mkdir(public_path("Uploads/pdf"), 0755, true);
        }
        // 将 word 文档保存至 你设置的路径
        $templateProcessor->saveAs(public_path("Uploads/pdf/" . md5(time()) . ".docx"));

    }
}

4.查看刚生成的文件

phpwprd 模板使用

5.将我们的数据填充进去

public function demo()
    {
        //实例化 phpword 类
        $PHPWord = new PhpWord();

        //指定模板文件
        $templateProcessor = new TemplateProcessor(public_path("Uploads/pdf/demo3.docx"));

        //通过setValue 方法给模板赋值
        $templateProcessor->setValue('project', "项目名称");

        $arr = [];
        $arr = [
            [
                'num' => 1,
                'add' => '临平1',
                'dec' => '描述1',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣10分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣100分'],
                ]
            ],
            [
                'num' => 2,
                'add' => '临平2',
                'dec' => '描述2',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣4分;未经责任人签字确认,扣8分'],
                    ['list' => '未制定安全生产责任制,扣7分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣200分'],
                ]
            ],
            [
                'num' => 3,
                'add' => '临平3',
                'dec' => '描述3',
                'list' => [
                    ['list' => '未制定安全生产责任制,扣10分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣9分;未经责任人签字确认,扣2分'],
                    ['list' => '未制定安全生产责任制,扣4分;未经责任人签字确认,扣8分'],
                    ['list' => '未制定安全生产责任制,扣7分;未经责任人签字确认,扣5分'],
                    ['list' => '未制定安全生产责任制,扣3分;未经责任人签字确认,扣300分'],
                ]
            ],


        ];

        // 循环次数
        $count = count($arr);
            // 第一层
            $templateProcessor->cloneRow('num', $count); //复制行

            foreach ($arr as $kk => $vv) {
                $list = '';
                for ($i = 0; $i < count($vv['list']); $i++) {
                    if ($i == (count($vv['list']) - 1)) {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}';
                    } else {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}<w:br/>';
                    }
                }
                $templateProcessor->setValue('list#' . ($kk + 1), $list);
            }
            foreach ($arr as $k => $v) {

                $templateProcessor->setValue('num#' . ($k + 1), $v['num']);
                $templateProcessor->setValue('add#' . ($k + 1), $v['add']);
                $templateProcessor->setValue('dec#' . ($k + 1), $v['dec']);

                for ($i = 0; $i < count($arr[$k]['list']); $i++) {
                    $templateProcessor->setValue('list#' . ($k + 1) . '#' . ($i + 1), $arr[$k]['list'][$i]['list']); //替换变量
                }
            }


        //保存新word文档
        $path = md5(time());
        if (!is_dir(public_path("Uploads/pdf"))) {
            mkdir(public_path("Uploads/pdf"), 0755, true);
        }
        $templateProcessor->saveAs(public_path("Uploads/pdf/" . md5(time()) . ".docx"));
    }

最终效果

phpwprd 模板使用

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

@YunMai

protected function setFileReturnHeaders($file_path, $file_name)
    {
        $file = fopen($file_path, 'rb');

        //告诉浏览器这是一个文件流格式的文件
        Header("Content-type: application/octet-stream");
        //请求范围的度量单位
        Header("Accept-Ranges: bytes");
        //Content-Length是指定包含于请求或响应中数据的字节长度
        Header("Accept-Length: " . filesize($file_path));
        //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
        Header("Content-Disposition: attachment; filename=" . urlencode($file_name));

        Header("Access-Control-Expose-Headers: Content-Disposition");
        Header('Access-Control-Allow-Origin:*');
        Header('Access-Control-Allow-Credentials: true');

        // 读取文件输出
        echo fread($file, filesize($file_path));
        fclose($file);
        exit();
    }
2年前 评论

请问多选框怎么设置选中状态,或者有没有替代多选框的方法?

3年前 评论

不想保存在服务器,有什么方法能直接让浏览器下载,或者返回文件流?

3年前 评论

jquery导出JSON、XML、PNG、CSV、TXT,SQL,MS-Word,Ms-Excel Ms-Powerpoint、PDF插件www.yujianni.top/news/comp_artinfo...

3年前 评论

file 相同结构的可以用这种块的标签, $temp->cloneBlock('开始', 0, true, false, 数组);

2年前 评论

哈哈 多谢 解决了我的一个需求

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
20
收藏
27
排名:1616
访问:1765
私信
所有博文
社区赞助商