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.查看刚生成的文件
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"));
}
最终效果
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
请问多选框怎么设置选中状态,或者有没有替代多选框的方法?
不想保存在服务器,有什么方法能直接让浏览器下载,或者返回文件流?
jquery导出JSON、XML、PNG、CSV、TXT,SQL,MS-Word,Ms-Excel Ms-Powerpoint、PDF插件www.yujianni.top/news/comp_artinfo...
@YunMai
哈哈 多谢 解决了我的一个需求