Laravel8中使用phpword生成word文档

最近在开发有关考试试卷相关的内容,需要生成试卷的word文档并下载。

这里用到了phpoffice/phpword插件,这里记录下一些开发过程中注意的点。

1.安装phpoffice/phpword

php 复制代码
composer require phpoffice/phpword

2.准备一个word模板方便向其中写入需要生成的内容

3.编写生成word的方法

php 复制代码
<?php
use PhpOffice\PhpWord\Element\Table;
use PhpOffice\PhpWord\TemplateProcessor;

class PaperLogic extends Logic
{
    // 下载试卷
    public function downloadPaper(array $papdfInfo)
    {
        $baseData = [];
		// 获取试卷模板
        $templatePath = resource_path('template/paper/试卷模板.docx');
        $baseData['paper_name'] = $paperInfo['name'];
        $baseData['paper_topic_num'] = $paperInfo['topic_num'];
        $baseData['paper_num'] = $paperInfo['num'];
        $baseData['paper_score'] = $paperInfo['score'];

        $templateProcessor = new TemplateProcessor($templatePath);
        // 把基础信息渲染到试卷模板中
        $templateProcessor->setValues($baseData);

		// 这里处理的是试题相关内容
        $topic_list = $paperInfo['topic_list'];
        foreach ($topic_list as $key => $val) {
            $question_list = $val['question_list']->toArray();
            foreach ($question_list as $k => $v) {
                $option_arr = [];
                if (in_array($v['type'], ['1', '2', '3'])) {
                    foreach ($v['option'] as $d) {
                        $option_arr[] = $d['key'] . ':' . $d['label'];
                    }
                }
                $v['option_arr'] = $option_arr;
                $v['answer'] = implode('、', $v['answer']);
                $question_list[$k] = $v;
            }
            $val['question_list'] = $question_list;

            $topic_list[$key] = $val;
        }
        
        $table = new Table([
            'borderSize' => 10,
            // 'borderColor' => '000000', // 默认黑色
            'borderColor' => 'FFFFFF', // 白色
            'unit' => 'nil',
        ]);
		
		// 注意word模板中的文字换行为<w:br/>
        foreach ($topic_list as $k => $v) {
            $table->addRow();
            if ($v['describe']) {
                $table->addCell(10870, ['valign' => 'center'])->addText($v['name'] . '(' . $v['describe'] . ')', null, ['align' => 'left']);
            } else {
                $table->addCell(10870, ['valign' => 'center'])->addText($v['name'], null, ['align' => 'left']);
            }

            foreach ($v['question_list'] as $b) {
                $table->addRow();
                $table->addCell(10870, ['valign' => 'center'])->addText($b['index'] . '.' . $b['name'] . '   【' . $b['type_text'] . '】   ' . '(' . $b['score'] . '分)', null, ['align' => 'left']);
                $table->addRow();
                if (in_array($b['type'], ['1', '2'])) {
                    $b['option_str'] = implode('<w:br/>', $b['option_arr']);
                    $table->addCell(10870, ['valign' => 'center'])->addText($b['option_str'], null, ['align' => 'left']);
                    $table->addRow();
                    $table->addCell(10870, ['valign' => 'center'])->addText("正确选项:" . $b['answer_key'] . "<w:br/>正确答案:" . $b['answer'] . "<w:br/>答案解析:" . $b['analysis'], null, ['align' => 'left']);
                } else if ($b['type'] == '3') {
                    $b['option_str'] = implode('<w:br/>', $b['option_arr']);
                    $table->addCell(10870, ['valign' => 'center'])->addText($b['option_str'], null, ['align' => 'left']);
                    $table->addRow();
                    $table->addCell(10870, ['valign' => 'center'])->addText("正确答案:" . $b['answer'] . "<w:br/>答案解析:" . $b['analysis'], null, ['align' => 'left']);
                } else if ($b['type'] == '4') {
                    $b['answer'] = str_replace('&', '或', $b['answer']);
                    $table->addCell(10870, ['valign' => 'center'])->addText("正确答案:" . $b['answer'] . "<w:br/>答案解析:" . $b['analysis'], null, ['align' => 'left']);
                } else if ($b['type'] == '5') {
                    $table->addCell(10870, ['valign' => 'center'])->addText("正确答案:" . $b['answer'] . "<w:br/>答案解析:" . $b['analysis'], null, ['align' => 'left']);
                }
            }
        }
		
		// 把生成的table表格渲染到mord模板中
        $templateProcessor->setComplexBlock('table', $table);

        // 生成新的word
        $tempPath = storage_path("app/public/temp/new_word.docx");
        $templateProcessor->saveAs($tempPath);
    }
}

4.生成结果

相关推荐
踢球的打工仔1 小时前
PHP面向对象(7)
android·开发语言·php
4***v2145 小时前
详解 为什么 tcp 会出现 粘包 拆包 问题
网络·tcp/ip·php
vx_dmxq2115 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php
X***E4636 小时前
PHP在电商中的订单处理
开发语言·php
温轻舟6 小时前
Python自动办公工具05-Word表中相同内容的单元格自动合并
开发语言·python·word·自动化办公·温轻舟
vx_vxbs667 小时前
【SSM电影网站】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·小程序·php·idea
ヽ格式化12 小时前
一文读懂栈与堆:从生活例子到Golang/PHP内存管理实践
golang·php·生活
c***979813 小时前
PHP在内容管理中的模板引擎
开发语言·php
亮子AI13 小时前
如何做一个类似Word的编辑器?要有修改标记功能
编辑器·word
Q_Q51100828514 小时前
python+django/flask的情绪宣泄系统
spring boot·python·pycharm·django·flask·node.js·php