当前位置: 首页 > news >正文

Laravel8中使用phpword生成word文档

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

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

1.安装phpoffice/phpword

composer require phpoffice/phpword

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

在这里插入图片描述

在这里插入图片描述

3.编写生成word的方法

<?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.生成结果

在这里插入图片描述

http://www.dtcms.com/a/265646.html

相关文章:

  • LeetCode--40.组合总和II
  • 【ArcGIS Pro】属性表咋不能编辑了?
  • wvp-GB28181-pro 项目 ZLMediaKit 部署 (Centos7)
  • XILINX Ultrascale+ Kintex系列FPGA的架构
  • R语言开发记录,二(创建R包)
  • vue-37(模拟依赖项进行隔离测试)
  • 《导引系统原理》-西北工业大学-周军-“2️⃣导引头的角度稳定系统”
  • 定时点击二次鼠标 定时点击鼠标
  • Node.js中exports与module.exports区别
  • DPDK开发环境配置
  • SpringCloud系列(49)--SpringCloud Stream消息驱动之实现生产者
  • 《Spring 中上下文传递的那些事儿》 Part 1:ThreadLocal、MDC、TTL 原理与实践
  • 使用 Docker Swarm 部署高可用集群指南
  • 副作用是什么?
  • DQL-3-聚合函数
  • lspci查看PCI设备详细信息
  • linux常用命令(10):scp命令(远程拷贝命令,复制文件到远程服务器)
  • PlatformIO 在使用 GitHub 上的第三方库
  • Spark 4.0的VariantType 类型以及内部存储
  • 云上堡垒:如何用AWS原生服务构筑坚不可摧的主机安全体系
  • java教程——初识guava(2)
  • 在 React 中使用 WebSockets 构建实时聊天应用程序
  • 实训项目记录 | 7.3
  • AI会取代网络工程师吗?理解AI在网络安全中的角色
  • 【网络安全】Webshell命令执行失败解决思路
  • 如何避免服务器出现故障情况?
  • 数据库服务端有连接数限制吗
  • vue3 + cesium + heatmapjs 开发热力图(不需要CesiumHeatMap插件)
  • JA3指纹在Web服务器或WAF中集成方案
  • 在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南