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

資訊專欄INFORMATION COLUMN

PHP制作word簡歷

Donne / 2306人閱讀

摘要:模板替換的方式制作簡歷在許多招聘網站都有一個簡歷下載的功能,如何用實現呢在里面就有一個非常簡單的生成一個文檔,向文檔中插入一些文字。安裝創建控制器及方法用于測試,并建立路由。

PHP操作word有一個非常好用的輪子,就是phpword,該輪子可以在github上查找到(PHPOffice/PHPWord)。上面有較為詳細的例子和代碼,其中里面的源碼包含有一些常用的操作例子,包括設置頁眉、頁腳、頁碼、字體樣式、表格、插入圖片等常用的操作。這里介紹的是如何使用該輪子來制作一個簡歷。

模板替換的方式制作簡歷

在許多招聘網站都有一個簡歷下載的功能,如何用php實現呢?在PHPOffice/PHPWord里面就有一個非常簡單的生成一個word文檔,向文檔中插入一些文字。這里我使用的方式比較取巧,這個輪子的說明文檔中有template processing,我理解為模板替換,也就是跟laravel的blade模板一個概念。接下來就不多廢話,直接說如何操作,這里提一句使用的是laravel框架。

1.安裝PHPOffice/PHPWord

composer require phpoffice/phpword

2.創建控制器DocController及test方法用于測試,并建立路由。

php artisan make:controller DocController

3.建立word模板,這里說明一下,該輪子替換的是word文檔中格式為${value}格式的字符串,這里我簡易的搭建一個模板如下圖1所示:

從圖中可以看到有一些基本的信息,這些可以從數據庫中撈取數據。不過這次是直接使用替換的方式,像工作經歷和教育經歷這種多行表格的模式這里也只需要取一行作為模板即可。

4.具體代碼

//load template docx
        $templateProcessor = new TemplateProcessor("./sample.docx");

        //基礎信息填寫替換
        $templateProcessor->setValue("update_at", date("Y-m-d H:i:s"));
        $templateProcessor->setValue("number", "123456");
        $templateProcessor->setValue("Name", "張三");
        $templateProcessor->setValue("sex", "男");
        $templateProcessor->setValue("birth", "1996年10月");
        $templateProcessor->setValue("age", "22");
        $templateProcessor->setValue("shortcut", "待業/aaa");
        $templateProcessor->setValue("liveArea", "福建省莆田市涵江區");
        $templateProcessor->setValue("domicile", "福建省莆田市涵江區");
        $templateProcessor->setValue("address", "");
        $templateProcessor->setValue("hopetodo", "IT");
        $templateProcessor->setValue("hopeworkin", "互聯網");
        $templateProcessor->setValue("hopes", "7000+");
        $templateProcessor->setValue("worklocation", "福建省莆田市");
        $templateProcessor->setValue("phone", "123456789");
        $templateProcessor->setValue("mail", "456789@qq.com");
        $templateProcessor->setValue("qqnum", "456789");
        $templateProcessor->setValue("selfjudge", "哇哈哈哈哈哈哈哈");

        //工作經歷表格替換
        $templateProcessor->cloneRow("experience_time", 2);//該表通過克隆行的方式,形成兩行
        $templateProcessor->setValue("experience_time#1", "2010-09~2014-06");//每行參數是用value#X(X表示行號,從1開始)
        $templateProcessor->setValue("job#1", "ABC company CTO");
        $templateProcessor->setValue("experience_time#2", "2014-09~至今");
        $templateProcessor->setValue("job#2", "JBC company CTO");

        //教育經歷
        $templateProcessor->cloneRow("time", 2);
        $templateProcessor->setValue("time#1", "2010-09~2014-06");
        $templateProcessor->setValue("school#1", "ABC");
        $templateProcessor->setValue("major#1", "Computer science");
        $templateProcessor->setValue("time#2", "2014-09~至今");
        $templateProcessor->setValue("school#2", "JBC");
        $templateProcessor->setValue("major#2", "Computer science");

        //語言能力
        $templateProcessor->cloneRow("lang",2);
        $templateProcessor->setValue("lang#1", "漢語|精通");
        $templateProcessor->setValue("lang#2", "英語|精通");

        //技能
        $templateProcessor->cloneRow("skill",3);
        $templateProcessor->setValue("skill#1", "JAVA|精通");
        $templateProcessor->setValue("skill#2", "Python|精通");
        $templateProcessor->setValue("skill#3", "PHP|精通");

        // Saving the document
        $templateProcessor->saveAs("my.docx");

這樣就可以通過建立word模板的方式產生一個簡歷了。以上內容沒有提到如何將圖片替換進去,如果你查看文檔的話會發現這個包的模板替換并沒有說怎么替換圖片,因為好像壓根這種方式就沒有提供,暈死。不過github的issue中有人提出了這個問題并且也有人給出了解決方案。下面我就來說說如何實現將圖片替換進去的功能。

替換圖片

假設你的簡歷模板中有個表格單元格中要插入一張圖片,如下:

我要將public/img下的against the current.jpg圖片替換進去,而源代碼沒有將圖片替換進word的功能,所以只能自己編寫了。

1.修改composer.json,將TemplateDocx類自動加載進來:

"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Core/TemplateDocx.php"
        ],
        "psr-4": {
            "App": "app/"
        }
    },

運行下列代碼:

composer dump-autoload

2.實現TemplateDocx類:

該類的內容我直接放在我的gist上了,連接TemplateDocx.php

由于code是放在gist上,國內訪問不了所以我直接把code貼出來,如下:

_countRels = 100; //start id for relationship between image and document.xml
        $this->_rels = "";
        $this->_types = "";
    }
    /**
     * Saves the result document.
     *
     * @throws PhpOfficePhpWordExceptionException
     *
     * @return string
     */
    public function save()
    {
        foreach ($this->tempDocumentHeaders as $index => $xml) {
            $this->zipClass->addFromString($this->getHeaderName($index), $xml);
        }
        $this->zipClass->addFromString($this->getMainPartName(), $this->tempDocumentMainPart);
        /*****************重寫原有的save方法中添加的內容******************/
        if ($this->_rels != "") {
            $this->zipClass->addFromString("word/_rels/document.xml.rels", $this->_rels);
        }
        if ($this->_types != "") {
            $this->zipClass->addFromString("[Content_Types].xml", $this->_types);
        }
        /*********************我是分割線******************************/
        foreach ($this->tempDocumentFooters as $index => $xml) {
            $this->zipClass->addFromString($this->getFooterName($index), $xml);
        }
        // Close zip file
        if (false === $this->zipClass->close()) {
            throw new Exception("Could not close zip file.");
        }
        return $this->tempDocumentFilename;
    }
    /**
     * 實現將圖片替換進word穩定的方法
     * @param $strKey
     * @param $img
     */
    public function setImg($strKey, $img){
        $strKey = "${".$strKey."}";
        $relationTmpl = "";
        $imgTmpl = "";
        $toAdd = $toAddImg = $toAddType = "";
        $aSearch = array("RID", "IMG");
        $aSearchType = array("IMG", "EXT");
        $countrels=$this->_countRels++;
        //I"m work for jpg files, if you are working with other images types -> Write conditions here
        $imgExt = "jpg";
        $imgName = "img" . $countrels . "." . $imgExt;
        $this->zipClass->deleteName("word/media/" . $imgName);
        $this->zipClass->addFile($img["src"], "word/media/" . $imgName);
        $typeTmpl = "";
        $rid = "rId" . $countrels;
        $countrels++;
        list($w,$h) = getimagesize($img["src"]);
        if(isset($img["swh"])) //Image proportionally larger side
        {
            if($w<=$h)
            {
                $ht=(int)$img["swh"];
                $ot=$w/$h;
                $wh=(int)$img["swh"]*$ot;
                $wh=round($wh);
            }
            if($w>=$h)
            {
                $wh=(int)$img["swh"];
                $ot=$h/$w;
                $ht=(int)$img["swh"]*$ot;
                $ht=round($ht);
            }
            $w=$wh;
            $h=$ht;
        }
        if(isset($img["size"]))
        {
            $w = $img["size"][0];
            $h = $img["size"][1];
        }
        $toAddImg .= str_replace(array("RID", "WID", "HEI"), array($rid, $w, $h), $imgTmpl) ;
        if(isset($img["dataImg"]))
        {
            $toAddImg.="".$this->limpiarString($img["dataImg"])."";
        }
        $aReplace = array($imgName, $imgExt);
        $toAddType .= str_replace($aSearchType, $aReplace, $typeTmpl) ;
        $aReplace = array($rid, $imgName);
        $toAdd .= str_replace($aSearch, $aReplace, $relationTmpl);
        $this->tempDocumentMainPart=str_replace("" . $strKey . "", $toAddImg, $this->tempDocumentMainPart);
        //print $this->tempDocumentMainPart;
        if($this->_rels=="")
        {
            $this->_rels=$this->zipClass->getFromName("word/_rels/document.xml.rels");
            $this->_types=$this->zipClass->getFromName("[Content_Types].xml");
        }
        $this->_types       = str_replace("", $toAddType, $this->_types) . "";
        $this->_rels        = str_replace("", $toAdd, $this->_rels) . "";
    }
}

3.使用方法:

$templateProcessor = new TemplateDocx("./sample.docx");
        $imgPath = "./img/against the current.jpg";

        $templateProcessor->setImg("img", array(
            "src"  => $imgPath, //圖片路徑
            "size" => array( 150, 150 ) //圖片大小,單位px
        ));
        $templateProcessor->setValue("name", "Sun");

        $templateProcessor->cloneRow("key", 2);//該表通過克隆行的方式,形成兩行
        $templateProcessor->setValue("key#1", "2010-09~2014-06");//每行參數是用value#X(X表示行號,從1開始)
        $templateProcessor->setValue("val#1", "ABC company CTO");
        $templateProcessor->setValue("key#2", "2014-09~至今");
        $templateProcessor->setValue("val#2", "JBC company CTO");
//        $templateProcessor->setValue("img", "Sun");

        $templateProcessor->saveAs("my.docx");

4.運行結果

至此就可以產生簡歷啦,如果這篇文章對你有所幫助記得點贊哦,親!如果有任何問題可以留言!!(* ̄︶ ̄)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28535.html

相關文章

  • 程序員寫簡歷時的技術詞匯拼寫規范備忘錄!

    摘要:寫在前面每年這個時候又到了求職的旺季。求職前,我們都會花很多的時間在自己的技術水平提升筆面試的準備之上,但往往卻忽略了找工作第一步所需要的一個嚴謹且靠譜的簡歷。而程序員寫簡歷,第一步就是需要注意嚴謹而規范地使用各種技術詞匯。 ...

    h9911 評論0 收藏0
  • 我本以為你們會寫簡歷

    摘要:然而并不是裁員的裁員沒裁員的正在準備裁員的路上再加上一些人年終獎也已經騙到手了依據優良傳統年后正是很多人辭職奔向更好的騙工資崗位的高峰期所以如何編簡歷注意是編不是寫我認為編這個字十分有內涵其實編簡歷并不是一件很難的事情這件事情的本質就是你在 然而并不是 裁員的裁員 , 沒裁員的正在準備裁員的路上 . 再加上一些人年終獎也已經騙到手了 , 依據優良傳統 , 年后正是很多人辭職奔向更好的騙...

    buildupchao 評論0 收藏0
  • 如何寫一份好的前端面試簡歷?

    摘要:簡歷的存在只有一個目的幫你約到面試。即使你通過其他方式獲得了面試,當你入職的時候,還是要有這么一份紙質簡歷的,所以不要想著偷懶。在該系統上線后,前端性能從提升到,服務器由臺減少到臺通過量化的數字來增強可信度。 簡歷的本質 原文地址在寫簡歷之前,我們必須清楚的了解一件事情,那就是簡歷是什么?它不是人生履歷,不是項目清單,也不是技能大放送。簡歷的存在只有一個目的 —— 幫你約到面試。只要能...

    winterdawn 評論0 收藏0
  • 如何寫一份好的前端面試簡歷?

    摘要:簡歷的存在只有一個目的幫你約到面試。即使你通過其他方式獲得了面試,當你入職的時候,還是要有這么一份紙質簡歷的,所以不要想著偷懶。在該系統上線后,前端性能從提升到,服務器由臺減少到臺通過量化的數字來增強可信度。 簡歷的本質 原文地址在寫簡歷之前,我們必須清楚的了解一件事情,那就是簡歷是什么?它不是人生履歷,不是項目清單,也不是技能大放送。簡歷的存在只有一個目的 —— 幫你約到面試。只要能...

    joyvw 評論0 收藏0
  • 如何寫一份好的前端面試簡歷?

    摘要:簡歷的存在只有一個目的幫你約到面試。即使你通過其他方式獲得了面試,當你入職的時候,還是要有這么一份紙質簡歷的,所以不要想著偷懶。在該系統上線后,前端性能從提升到,服務器由臺減少到臺通過量化的數字來增強可信度。 簡歷的本質 原文地址在寫簡歷之前,我們必須清楚的了解一件事情,那就是簡歷是什么?它不是人生履歷,不是項目清單,也不是技能大放送。簡歷的存在只有一個目的 —— 幫你約到面試。只要能...

    wpw 評論0 收藏0

發表評論

0條評論

Donne

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<