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

Tags : php