記錄下專案中遇到的問題
應專案需求,需要將使用者的資料生成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 協議》,轉載必須註明作者和本文連結