国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用PHPWord合并Word文檔,在文檔指定頁插入另一個(gè)文檔的內(nèi)容

RobinTang / 2040人閱讀

摘要:提示不支持文件的讀取有一個(gè)客戶有這樣的需求,需要在里使用組件,把一個(gè)文檔的內(nèi)容,插入另一個(gè)文檔的指定頁內(nèi)。由于兩個(gè)文檔的內(nèi)容都不是固定的,所以不能使用的功能。當(dāng)讀取到指定的分頁符之后,再讀取的內(nèi)容,跟著前面的內(nèi)容插入,最后保存新的文檔。

提示:不支持.doc文件的讀取
有一個(gè)客戶有這樣的需求,需要在ThinkPHP里使用PHPWord組件,把一個(gè)文檔(DOC1)的內(nèi)容,插入另一個(gè)文檔(DOC2)的指定頁內(nèi)。由于兩個(gè)文檔的內(nèi)容都不是固定的,所以不能使用PHPWord的Template功能。
以前從來沒有使用過PHPWord,所以前后也折騰了幾天。從熟悉PHPWord的功能開始,看示例代碼,還有源碼,最終還是摸索出來解決方案,下面說下解決思路:

首先讀取DOC1的內(nèi)容,PHPWord把內(nèi)容分成不同的節(jié)點(diǎn)和容器,最頂級的是Section,里面有TextRun(文本塊),Table(表格)等容器。這些容器里又有Text(文本),Row(表格行),Cell(單元格)等,還有一些其他的TextBreak,PageBreak(分頁符)等制表符。
逐級讀取內(nèi)容后,然后把讀取出的內(nèi)容插入到一個(gè)新的文檔內(nèi)。當(dāng)讀取到指定的分頁符之后,再讀取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)前分頁
    private $page = 0; // 插入頁數(shù)
    private $args = null; // 文本段樣式
    private $tmpFiles = []; // 臨時(shí)文件
    
    /**
     * 合并文件
     * 
     * @param URI
     *    文件1地址
     * @param URI
     *    文件2地址
     * @param Numeric
     *    指定插入的頁數(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();
            # 逐級讀取/寫入節(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;
    }

    /**
     * 逐級讀取/寫入節(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)前頁數(shù)
            if ($this->currentPage == $this->page && !is_null($S2)) {
                # 開始插入
                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ì)頁數(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") {
                    # 對比當(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22695.html

相關(guān)文章

  • PHPWord中文手冊整理

    摘要:修正中文支持的問題,使用前如果發(fā)現(xiàn)亂碼,需要進(jìn)行一些修正解決編碼問題,會對輸入的文字進(jìn)行編碼轉(zhuǎn)化,如果你使用或者編碼的話就會出現(xiàn)亂碼,如果你用編碼,就查找類庫中所有方法中的轉(zhuǎn)碼將其刪除,如果你采用或者編碼,使用進(jìn)行編碼轉(zhuǎn)換。 修正 中文支持的問題,使用前如果發(fā)現(xiàn)亂碼,需要進(jìn)行一些修正: 解決編碼問題,PHPword?會對輸入的文字進(jìn)行utf8_encode編碼轉(zhuǎn)化,如果你使用GBK、...

    wangdai 評論0 收藏0
  • PHP制作word簡歷

    摘要:模板替換的方式制作簡歷在許多招聘網(wǎng)站都有一個(gè)簡歷下載的功能,如何用實(shí)現(xiàn)呢在里面就有一個(gè)非常簡單的生成一個(gè)文檔,向文檔中插入一些文字。安裝創(chuàng)建控制器及方法用于測試,并建立路由。 PHP操作word有一個(gè)非常好用的輪子,就是phpword,該輪子可以在github上查找到(PHPOffice/PHPWord)。上面有較為詳細(xì)的例子和代碼,其中里面的源碼包含有一些常用的操作例子,包括設(shè)置頁眉...

    Donne 評論0 收藏0
  • 使用PHPWordWord文件做模板替換

    摘要:注文件需要使用編碼在文件中按照參考文件方式插入復(fù)制符號到文件正常的輸出替換。 因工作需要,使用了版本比較舊的PHPWord項(xiàng)目官方已不見維護(hù)更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM如果PHP版本>=5.3.3,強(qiáng)烈推薦使用PHPOffice/PHPWord這個(gè)開源項(xiàng)目本篇針對的為舊版本的PHPWord 基本安裝 見官網(wǎng) 問題總結(jié) Autoloader...

    468122151 評論0 收藏0
  • 前端——HTML

    摘要:方式是將內(nèi)容放在了請求頭,所以會顯示在上,將內(nèi)容放在了請求體。此外,方式對提交內(nèi)容的長度有限制,必須在之內(nèi),而沒有。如果屬性設(shè)置,表示選擇框只能同時(shí)顯示三項(xiàng)。表頭會自動加粗居中,在表格內(nèi)容區(qū),表示行,表示列。HTML HTML叫做超文本標(biāo)記語言,是一種制作萬維網(wǎng)頁面標(biāo)準(zhǔn)語言。相當(dāng)于定義一套規(guī)則,大家都來遵守它,這樣瀏覽器就可以去解釋它。 瀏覽器負(fù)責(zé)將標(biāo)簽翻譯成用戶看得懂的格式,呈現(xiàn)給用戶。 ...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<