php phpword模板表格複製與合併儲存格
最近碰到套版需要複製表格後合併儲存格的狀況,做出來後順便做個紀錄,使用的phpword版本為1.1.0。
雖然內部沒有直接的指令可以處理,不過在網路上找到可以直接寫入word使用的xml來進行合併的處理。
方法
預設的範本如下
先上程式碼
//載入lib和範本
require_once(dirname(dirname(__File__))."/libraries/PhpSpreadSheet-main/PhpOffice/autoload.php");
$template = dirname(dirname(dirname(__File__))).'/assets/downloads/visit_template_231215.docx';
$document= new \PhpOffice\PhpWord\TemplateProcessor($template);
//複製 *1
$document->cloneRow('fac_row', 3);
//合併設定 直的 *2
$document->setValue('fac_row#1', "工廠地址(可視情況增加)".'<w:vMerge w:val="restart"/> ');
$document->setValue('fac_row#2', '<w:vMerge w:val="continue"/>');
$document->setValue('fac_row#3', '<w:vMerge w:val="continue"/>');
//合併設定 橫的
$document->setValue('fac_num#1', '<w:hMerge w:val="restart"/>');
$document->setValue('fac_add#1', '<w:hMerge w:val="continue"/>');
//測試未成功的部份
$document->setValue('fac_num#2', '<w:gridSpan w:val="2"/><w:vMerge w:val="restart"/>');
$document->setValue('fac_num#3', '<w:gridSpan w:val="2"/><w:vMerge w:val="continue"/>');
被cloneRow複製後長這樣(*1)
加入合併xml後(*2)
垂直的開頭使用<w:vMerge w:val="restart"/>
,而下方需要跟他合併的部分都填入<w:vMerge w:val="continue"/>
處理,橫向的則是將vMerge改為hMerge就可以做到同樣的效果。
另外(*3)的部分
這個是最後一個參考網站看到的,可以直接設定佔2格位置,也許有辦法做成同時合併row和col,不過沒有成功單純做個紀錄
參考資料
https://stackoverflow.com/questions/50093264/merge-cols-or-rows-in-phpoffice-phpword-templateprocessor
https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.verticalmerge?view=openxml-2.8.1
https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.horizontalmerge?view=openxml-2.8.1
https://python-docx.readthedocs.io/en/latest/dev/analysis/features/table/cell-merge.html