close
問題:
PHPWord的cloneRow功能當執行超過100行之後執行效率會急速下降,一千筆要等一分多鐘,資料筆數太多的時候根本無法使用!
解法:
其實在這個issue close時也沒有完全解法,是兩年後2017年最後一個留言才把這個問題解決,而且到現在2025年PHPWord最新版1.4.0仍然沒有解決這個問題XDDD
只能自己改寫cloneRow這個function
--
轉自 https://github.com/PHPOffice/PHPWord/issues/513
全站熱搜
首先,感謝作者們完成這個偉大的項目,並對我的英語能力表示歉意。
我認為在處理大量資料時會出現一個設計問題(順便說一句,在許多任務中處理數百或數十行資料是很常見的)。
在我看來,問題在於值是在行被複製之後才被加入的。對我來說,問題在於每次添加(克隆)一行,處理時間就會增加兩倍:
這表示如果要處理的行數為 n,則處理時間將約為 n^2 (n*n)。
使用 str_replace 或將搜尋/替換值作為數組可以稍微加快速度,但處理時間仍將增加約 n^2 (n*n)
解決方案可能是在克隆時進行搜尋/替換,這樣,搜尋/替換操作將僅針對克隆的部分進行,而不是針對整個文件。處理時間將增加 n,而非 n^2。
這樣,它可以在不到一秒的時間內產生數千行資料…
我修改了 TemplateProcessor::cloneRow,以便它可以接受帶有值參數的陣列並在克隆時執行替換工作。
只需透過傳遞數組數組作為第三個參數來調用它:
並且在克隆時將直接進行替換。
第四個參數(限制)完全是可選的。
如果你以正常方式呼叫它(只有兩個參數),我仍然會相信正常方式(只克隆行,不應用值)
我使用以下程式碼對其進行了測試(使用範例 7 中的範本)