摘要:提示不支持文件的讀取有一個(gè)客戶(hù)有這樣的需求,需要在里使用組件,把一個(gè)文檔的內(nèi)容,插入另一個(gè)文檔的指定頁(yè)內(nèi)。由于兩個(gè)文檔的內(nèi)容都不是固定的,所以不能使用的功能。當(dāng)讀取到指定的分頁(yè)符之后,再讀取的內(nèi)容,跟著前面的內(nèi)容插入,最后保存新的文檔。
提示:不支持.doc文件的讀取
有一個(gè)客戶(hù)有這樣的需求,需要在ThinkPHP里使用PHPWord組件,把一個(gè)文檔(DOC1)的內(nèi)容,插入另一個(gè)文檔(DOC2)的指定頁(yè)內(nèi)。由于兩個(gè)文檔的內(nèi)容都不是固定的,所以不能使用PHPWord的Template功能。
以前從來(lái)沒(méi)有使用過(guò)PHPWord,所以前后也折騰了幾天。從熟悉PHPWord的功能開(kāi)始,看示例代碼,還有源碼,最終還是摸索出來(lái)解決方案,下面說(shuō)下解決思路:
首先讀取DOC1的內(nèi)容,PHPWord把內(nèi)容分成不同的節(jié)點(diǎn)和容器,最頂級(jí)的是Section,里面有TextRun(文本塊),Table(表格)等容器。這些容器里又有Text(文本),Row(表格行),Cell(單元格)等,還有一些其他的TextBreak,PageBreak(分頁(yè)符)等制表符。
逐級(jí)讀取內(nèi)容后,然后把讀取出的內(nèi)容插入到一個(gè)新的文檔內(nèi)。當(dāng)讀取到指定的分頁(yè)符之后,再讀取DOC2的內(nèi)容,跟著前面的內(nèi)容插入,最后保存新的文檔。
貼一部分代碼:
namespace HomeLogic; Vendor("PhpOffice.autoload"); use PhpOfficePhpWordPhpWord; use PhpOfficePhpWordIOFactory; use PhpOfficePhpWordStyleFont; use PhpOfficePhpWordSharedipArchive; use PhpOfficePhpWordSettings; class MergeFile { private $currentPage = 0; // 當(dāng)前分頁(yè) private $page = 0; // 插入頁(yè)數(shù) private $args = null; // 文本段樣式 private $tmpFiles = []; // 臨時(shí)文件 /** * 合并文件 * * @param URI * 文件1地址 * @param URI * 文件2地址 * @param Numeric * 指定插入的頁(yè)數(shù) * * @return String * 新文件的URI */ public function joinFile($file1, $file2, $page) { $S1 = IOFactory::load($file1)->getSections(); $S2 = IOFactory::load($file2)->getSections(); $this->page = $page > 0 ? $page - 1 : $page; $phpWord = new PhpWord(); foreach ($S1 as $S) { $section = $phpWord->addSection($S->getStyle()); $elements = $S->getElements(); # 逐級(jí)讀取/寫(xiě)入節(jié)點(diǎn) $this->copyElement($elements, $section, $S2); } $F1 = IOFactory::createWriter($phpWord); $path = $_SERVER["DOCUMENT_ROOT"] . __ROOT__ . "/Public/Write/"; if(!is_dir($path)) mkdir($path); $filePath = $path . time() . ".docx"; $F1->save($filePath); # 清除臨時(shí)文件 foreach($this->tmpFiles as $P) { unlink($P); } return $filePath; } /** * 逐級(jí)讀取/寫(xiě)入節(jié)點(diǎn) * * @param Array * 需要讀取的節(jié)點(diǎn) * @param PhpOfficePhpWordElementSection * 節(jié)點(diǎn)的容器 * @param Array * 文檔2的所有節(jié)點(diǎn) */ private function copyElement($elements, &$container, $S2 = null) { $inEls = []; foreach ($elements as $i => $E) { # 檢查當(dāng)前頁(yè)數(shù) if ($this->currentPage == $this->page && !is_null($S2)) { # 開(kāi)始插入 foreach ($S2 as $k => $v) { $ELS = $v->getElements(); $this->copyElement($ELS, $container); } # 清空防止重復(fù)插入 $S2 = null; } $ns = get_class($E); $elName = end(explode("", $ns)); $fun = "add" . $elName; # 統(tǒng)計(jì)頁(yè)數(shù) if ($elName == "PageBreak") { $this->currentPage ++; } # 合并文本段 if($elName == "TextRun" #&& !is_null($S2) ) { $tmpEls = $this->getTextElement($E); if(!is_null($tmpEls)) { $inEls = array_merge($inEls, $tmpEls); } $nextElName = ""; if($i + 1 < count($elements)) { $nextE = $elements[$i + 1]; $nextClass = get_class($nextE); $nextElName = end(explode("", $nextClass)); } if($nextElName == "TextRun") { # 對(duì)比當(dāng)前和下一個(gè)節(jié)點(diǎn)的樣式 if(is_object(end($inEls))) { $currentStyle = end($inEls)->getFontStyle(); } else { continue; } $nextEls = $this->getTextElement($nextE); if(is_null($nextEls)) { $nextStyle = new Font(); } else { $nextStyle = current($nextEls)->getFontStyle(); } } } # 設(shè)置參數(shù) $a = $b = $c = $d = $e = null; @list($a, $b, $c, $d, $e) = $args; $newEl = $container->$fun($a, $b, $c, $d, $e); $this->setAttr($elName, $newEl, $E); #$inEls = []; if(method_exists($E, "getElements") && $elName != "TextRun" ) { $inEls = $E->getElements(); } if(method_exists($E, "getRows")) $inEls = $E->getRows(); if(method_exists($E, "getCells")) $inEls = $E->getCells(); if (count($inEls) > 0) { $this->copyElement($inEls, $newEl); $inEls = []; $this->args = null; } } return $pageIndex; } /** * 獲取Text節(jié)點(diǎn) */ private function getTextElement($E) { $elements = $E->getElements(); $result = []; foreach($elements as $inE) { $ns = get_class($inE); $elName = end(explode("", $ns)); if($elName == "Text") { $inE->setPhpWord(null); $result[] = $inE; } elseif (method_exists($inE, "getElements")) { $inResult = $this->getTextElement($inE); } if(!is_null($inResult)) $result = array_merge($result, $inResult); } return count($result) > 0 ? $result : null; } private function setAttr($elName, &$newEl, $E) { switch (strtolower($elName)) { case "footnote": $newEl->setReferenceId($E->getReferenceId()); break; case "formfield": $newEl->setName($E->getName()); $newEl->setDefault($E->getDefault()); $newEl->setValue($E->getValue()); $newEl->setEntries($E->getEntries()); break; case "object": $newEl->setImageRelationId($E->getImageRelationId()); $newEl->setObjectId($E->getObjectId()); break; case "sdt": $newEl->setValue($E->getValue()); $newEl->setListItems($E->getListItems()); break; case "table": $newEl->setWidth($E->getWidth()); break; } } }
程序員客棧,匯集各路碼農(nóng),找到你的靠譜技術(shù)小伙伴 http://t.cn/RXz4ONT
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22695.html
摘要:修正中文支持的問(wèn)題,使用前如果發(fā)現(xiàn)亂碼,需要進(jìn)行一些修正解決編碼問(wèn)題,會(huì)對(duì)輸入的文字進(jìn)行編碼轉(zhuǎn)化,如果你使用或者編碼的話(huà)就會(huì)出現(xiàn)亂碼,如果你用編碼,就查找類(lèi)庫(kù)中所有方法中的轉(zhuǎn)碼將其刪除,如果你采用或者編碼,使用進(jìn)行編碼轉(zhuǎn)換。 修正 中文支持的問(wèn)題,使用前如果發(fā)現(xiàn)亂碼,需要進(jìn)行一些修正: 解決編碼問(wèn)題,PHPword?會(huì)對(duì)輸入的文字進(jìn)行utf8_encode編碼轉(zhuǎn)化,如果你使用GBK、...
摘要:模板替換的方式制作簡(jiǎn)歷在許多招聘網(wǎng)站都有一個(gè)簡(jiǎn)歷下載的功能,如何用實(shí)現(xiàn)呢在里面就有一個(gè)非常簡(jiǎn)單的生成一個(gè)文檔,向文檔中插入一些文字。安裝創(chuàng)建控制器及方法用于測(cè)試,并建立路由。 PHP操作word有一個(gè)非常好用的輪子,就是phpword,該輪子可以在github上查找到(PHPOffice/PHPWord)。上面有較為詳細(xì)的例子和代碼,其中里面的源碼包含有一些常用的操作例子,包括設(shè)置頁(yè)眉...
摘要:注文件需要使用編碼在文件中按照參考文件方式插入復(fù)制符號(hào)到文件正常的輸出替換。 因工作需要,使用了版本比較舊的PHPWord項(xiàng)目官方已不見(jiàn)維護(hù)更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM如果PHP版本>=5.3.3,強(qiáng)烈推薦使用PHPOffice/PHPWord這個(gè)開(kāi)源項(xiàng)目本篇針對(duì)的為舊版本的PHPWord 基本安裝 見(jiàn)官網(wǎng) 問(wèn)題總結(jié) Autoloader...
摘要:方式是將內(nèi)容放在了請(qǐng)求頭,所以會(huì)顯示在上,將內(nèi)容放在了請(qǐng)求體。此外,方式對(duì)提交內(nèi)容的長(zhǎng)度有限制,必須在之內(nèi),而沒(méi)有。如果屬性設(shè)置,表示選擇框只能同時(shí)顯示三項(xiàng)。表頭會(huì)自動(dòng)加粗居中,在表格內(nèi)容區(qū),表示行,表示列。HTML HTML叫做超文本標(biāo)記語(yǔ)言,是一種制作萬(wàn)維網(wǎng)頁(yè)面標(biāo)準(zhǔn)語(yǔ)言。相當(dāng)于定義一套規(guī)則,大家都來(lái)遵守它,這樣瀏覽器就可以去解釋它。 瀏覽器負(fù)責(zé)將標(biāo)簽翻譯成用戶(hù)看得懂的格式,呈現(xiàn)給用戶(hù)。 ...
閱讀 3193·2021-11-23 09:51
閱讀 1533·2021-11-22 09:34
閱讀 2843·2021-10-27 14:15
閱讀 2289·2021-10-12 10:17
閱讀 1894·2021-10-12 10:12
閱讀 955·2021-09-27 14:00
閱讀 2005·2021-09-22 15:19
閱讀 1040·2019-08-30 10:51