成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用PHPWord對(duì)Word文件做模板替換

468122151 / 2567人閱讀

摘要:注文件需要使用編碼在文件中按照參考文件方式插入復(fù)制符號(hào)到文件正常的輸出替換。

因工作需要,使用了版本比較舊的PHPWord項(xiàng)目
官方已不見維護(hù)更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM
如果PHP版本>=5.3.3,強(qiáng)烈推薦使用PHPOffice/PHPWord這個(gè)開源項(xiàng)目
本篇針對(duì)的為舊版本的PHPWord

基本安裝

見官網(wǎng)

問題總結(jié) Autoloader自動(dòng)加載部分情況下失敗

在使用Yii 1配置自動(dòng)加載時(shí)無法正常加載類庫,需對(duì)其PHPWord/Autoloader.php做部分調(diào)整,這兒借鑒了PHPExcelAutoloader:

/**
 * PHPWord_Autoloader
 */
class PHPWord_Autoloader
{
    /**
     * Register the Autoloader with SPL
     *
     */
    public static function Register() {
        $functions = spl_autoload_functions();  
        foreach ( $functions as  $function)  
            spl_autoload_unregister($function);  
        $functions = array_merge(array(array("PHPWord_Autoloader","Load")),$functions);  
        foreach ( $functions as $function)  
            $x = spl_autoload_register($function);  
        return $x; 

    }   //    function Register()


    /**
     * Autoload a class identified by name
     *
     * @param    string    $pClassName        Name of the object to load
     */
    public static function Load($pClassName){
        if ((class_exists($pClassName,FALSE)) || (strpos($pClassName, "PHPWord") !== 0)) {
            //    Either already loaded, or not a PHPWord class request
            return FALSE;
        }

        $pClassFilePath = PHPWORD_BASE_PATH .
                          str_replace("_",DIRECTORY_SEPARATOR,$pClassName) .
                          ".php";

        if ((file_exists($pClassFilePath) === FALSE) || (is_readable($pClassFilePath) === FALSE)) {
            //    Can"t load
            return FALSE;
        }

        require($pClassFilePath);
    }   //    function Load()

}
模板替換時(shí)無法識(shí)別模板標(biāo)簽 表現(xiàn)

使用/復(fù)制官方樣例的模板文件替換正常

自己手動(dòng)敲出模板標(biāo)簽替換異常

原因

PHPWord的替換規(guī)則是將Word文件解析成XML進(jìn)行替換處理,當(dāng)Word解析成XML時(shí)字符分離了,導(dǎo)致匹配不上模板標(biāo)簽;

具體分析可參考一下資料:

phpword: setValue() not working

stackoverflow: PhpWord doesn"t replace text

解決辦法

參考http://stackoverflow.com/a/21750677/5270710

改進(jìn)Template類:
可參考Github: Arisse/PHPWord_CloneRow對(duì)Template類進(jìn)行改造。
因?yàn)橄旅嫒孕枰薷?b>Template類,這兒暫時(shí)就不貼代碼了,下面一并貼出改造后的代碼。

中文亂碼

參考CSDN: PHPWord利用模板替換字符串生成精確的word文檔

編輯PHPWord/Template.php,找到代碼$replace = utf8_encode($replace);,刪除或者注釋掉這行代碼,添加$replace = iconv( "gbk","utf-8", $replace);,比如代碼改為如下:

/**
 * Set a Template value
 * 
 * @param mixed $search
 * @param mixed $replace
 */
public function setValue($search, $replace) {
    if(substr($search, 0, 2) !== "${" && substr($search, -1) !== "}") {
        $search = "${".$search."}";
    }
 
    if(!is_array($replace)) {
        //$replace = utf8_encode($replace);
        $replace =iconv("gbk", "utf-8", $replace); // 注釋掉上面行后添加這行
    }
 
    $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
}
空格輸出

參考CSDN: PhpWord 如何輸出換行符到 word?

在想要輸出換行的地方用代替即可.

標(biāo)記符號(hào)輸出

參考百度經(jīng)驗(yàn): 如何在word中選擇打鉤的方框
僅以輸出?為例,其它符號(hào)與之類似。
注:PHP文件需要使用UTF-8編碼

Word文件中按照參考文件方式插入?;

復(fù)制符號(hào)到PHP文件;

正常的輸出替換。
具體代碼見如下的項(xiàng)目代碼。

Template類代碼
// code
/**
* Set a Template value
*
* @param mixed $search
* @param mixed $replace
*/
public function setValue($search, $replace, $limit=-1) {
    if(substr($search, 0, 1) !== "{" && substr($search, -1) !== "}") {
        $search = "{".$search."}";
    }
    
    if(!is_array($replace)) {
        // $replace = utf8_encode($replace);
        // $replace = iconv( "gbk","utf-8", $replace);
        $replace = str_replace("
","",$replace);
    }

    preg_match_all("/{[^}]+}/", $this->_documentXML, $matches);
    foreach ($matches[0] as $k => $match) {
        $no_tag = strip_tags($match);
        if ($no_tag == $search) {
            $match = "{".$match."}";
            $this->_documentXML = preg_replace($match, $replace, $this->_documentXML, $limit);    
            if ($limit == 1) {
                break;
            }            
        }
    }
}
// code
項(xiàng)目代碼
// @author Heier [email protected]
public function actionExportPersonTable() {
    // 獲取數(shù)據(jù)部分代碼
    // ...

    $PHPWord = new PHPWord();
    
    // Word模板目錄
    $personBasePath = Yii::app()->basePath."/person/";
    
    // 刪除目錄下臨時(shí)文件-十分鐘以前
    $this->delfile( $personBasePath, 10 );
    
    // 模板文件名
    $tempName = $personBasePath . "/moban.docx";
    
    $word = $PHPWord->loadTemplate( $tempName );
    
    // 項(xiàng)目使用的是GBK編碼,需要做轉(zhuǎn)換
    $username = iconv("gbk", "utf-8", getUserNameById($personData[0]["user_id"]) );
    $personal_type = $personData[0]["personal_type"];
    
    // 模板替換開始
    // 可以輸出打勾的方框
    $deptA=$deptBP=$deptB=$deptC=$deptD = "□";
    if( $DirectorLevel == "A" ) {
        $deptA = "?";
    } elseif( $DirectorLevel == "B+" ) {
        $deptBP = "?";
    } elseif( $DirectorLevel == "B" ) {
        $deptB = "?";
    } elseif( $DirectorLevel == "C" ) {
        $deptC = "?";
    } elseif( $DirectorLevel == "D" ) {
        $deptD = "?";
    }

    $word->setValue("deptA", $deptA);
    $word->setValue("deptBP", $deptBP);
    $word->setValue("deptB", $deptB);
    $word->setValue("deptC", $deptC);
    $word->setValue("deptD", $deptD);

    // 設(shè)置其它替換
    // ...
    
    // 生成臨時(shí)文件以供下載
    $tmpFileName = md5( time()."Heier" );
    
    $word->save($personBasePath . "/" . $tmpFileName .".docx");
    $file = $personBasePath . "/" . $tmpFileName .".docx";
    
    // 下載Word文件
    ob_start(); //打開緩沖區(qū)
    $fp = fopen($file,"r");
    $file_size = filesize($file);
    $downFileName = "XXX.docx";
    
    header("Cache-Control: public");
    header("Content-type: application/octet-stream");
    header("Accept-Ranges: bytes");
    header("Content-Disposition: attachment; filename={$downFileName}");
    header("Pragma:no-cache");
    header("Expires:0");
    $buffer = 1024;
    $file_count = 0;
    //向?yàn)g覽輸出回?cái)?shù)據(jù)
    while(!feof($fp) && $file_count < $file_size){
        $file_con = fread($fp,$buffer);
        $file_count += $buffer;
        echo $file_con;
    }
    ob_end_flush();//輸出全部?jī)?nèi)容到瀏覽器
}
參考文檔匯總

CodePlex: PHPWord;

Github: PHPOffice/PHPWord;

phpword: setValue() not working;

stackoverflow: PhpWord doesn"t replace text;

Github: Arisse/PHPWord_CloneRow;

CSDN: PHPWord利用模板替換字符串生成精確的word文檔;

CSDN: PhpWord 如何輸出換行符到 word?

關(guān)于我

文章轉(zhuǎn)載自我的博客:
Heier Blog: 使用PHPWord對(duì)Word文件做模板替換

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22183.html

相關(guān)文章

  • PHPWord中文手冊(cè)整理

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

    wangdai 評(píng)論0 收藏0
  • PHP制作word簡(jiǎn)歷

    摘要:模板替換的方式制作簡(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è)置頁眉...

    Donne 評(píng)論0 收藏0
  • 使用PHPWord合并Word文檔,在文檔指定頁插入另一個(gè)文檔的內(nèi)容

    摘要:提示不支持文件的讀取有一個(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è)文檔(D...

    RobinTang 評(píng)論0 收藏0
  • PHP 實(shí)現(xiàn)Office word 關(guān)鍵詞添加背景色

    摘要:需求最近做一個(gè)新聞規(guī)范掃描的工具,需要將中的內(nèi)容讀取出來掃描可疑錯(cuò)誤詞文本,并將錯(cuò)誤可疑文本添加背景顏色。內(nèi)容掃描規(guī)范識(shí)別不在本文中描述,重點(diǎn)說怎樣通過編程語言操作實(shí)現(xiàn)文字添加背景色。 需求:最近做一個(gè)word新聞規(guī)范掃描的工具,需要將wold中的內(nèi)容讀取出來掃描可疑、錯(cuò)誤詞文本,并將錯(cuò)誤可疑文本添加背景顏色。內(nèi)容掃描規(guī)范識(shí)別不在本文中描述,重點(diǎn)說怎樣通過編程語言操作word實(shí)現(xiàn)文字添...

    harriszh 評(píng)論0 收藏0
  • eyoucms v1.4.9授權(quán)破解版 易優(yōu)cms企業(yè)建站系統(tǒng)去版權(quán)版 v1.4.9

    摘要:授權(quán)破解版易優(yōu)企業(yè)建站系統(tǒng)易優(yōu)企業(yè)建站系統(tǒng)是一款十分優(yōu)秀專業(yè)的為企業(yè)創(chuàng)建網(wǎng)站服務(wù)的軟件。去版權(quán)破解版強(qiáng)大好用,為企業(yè)創(chuàng)建網(wǎng)站提供很多幫助和便利。直接去易優(yōu)官網(wǎng),購買商業(yè)授權(quán)即可去除版權(quán)。eyoucms v1.4.9授權(quán)破解版(易優(yōu)企業(yè)建站系統(tǒng))是一款十分優(yōu)秀專業(yè)的為企業(yè)創(chuàng)建網(wǎng)站服務(wù)的軟件。eyoucms v1.4.9去版權(quán)破解版 強(qiáng)大好用,為企業(yè)創(chuàng)建網(wǎng)站提供很多幫助和便利。易優(yōu)cms破解授權(quán)...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<