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

資訊專欄INFORMATION COLUMN

使用PHPWord對Word文件做模板替換

468122151 / 2540人閱讀

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

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

基本安裝

見官網

問題總結 Autoloader自動加載部分情況下失敗

在使用Yii 1配置自動加載時無法正常加載類庫,需對其PHPWord/Autoloader.php做部分調整,這兒借鑒了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()

}
模板替換時無法識別模板標簽 表現

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

自己手動敲出模板標簽替換異常

原因

PHPWord的替換規則是將Word文件解析成XML進行替換處理,當Word解析成XML時字符分離了,導致匹配不上模板標簽;

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

phpword: setValue() not working

stackoverflow: PhpWord doesn"t replace text

解決辦法

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

改進Template類:
可參考Github: Arisse/PHPWord_CloneRow對Template類進行改造。
因為下面仍需要修改Template類,這兒暫時就不貼代碼了,下面一并貼出改造后的代碼。

中文亂碼

參考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?

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

標記符號輸出

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

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

復制符號到PHP文件;

正常的輸出替換。
具體代碼見如下的項目代碼

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
項目代碼
// @author Heier xheier@outlook.com
public function actionExportPersonTable() {
    // 獲取數據部分代碼
    // ...

    $PHPWord = new PHPWord();
    
    // Word模板目錄
    $personBasePath = Yii::app()->basePath."/person/";
    
    // 刪除目錄下臨時文件-十分鐘以前
    $this->delfile( $personBasePath, 10 );
    
    // 模板文件名
    $tempName = $personBasePath . "/moban.docx";
    
    $word = $PHPWord->loadTemplate( $tempName );
    
    // 項目使用的是GBK編碼,需要做轉換
    $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);

    // 設置其它替換
    // ...
    
    // 生成臨時文件以供下載
    $tmpFileName = md5( time()."Heier" );
    
    $word->save($personBasePath . "/" . $tmpFileName .".docx");
    $file = $personBasePath . "/" . $tmpFileName .".docx";
    
    // 下載Word文件
    ob_start(); //打開緩沖區
    $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;
    //向瀏覽輸出回數據
    while(!feof($fp) && $file_count < $file_size){
        $file_con = fread($fp,$buffer);
        $file_count += $buffer;
        echo $file_con;
    }
    ob_end_flush();//輸出全部內容到瀏覽器
}
參考文檔匯總

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?

關于我

文章轉載自我的博客:
Heier Blog: 使用PHPWord對Word文件做模板替換

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

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

相關文章

  • PHPWord中文手冊整理

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

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

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

    Donne 評論0 收藏0
  • 使用PHPWord合并Word文檔,在文檔指定頁插入另一個文檔的內容

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

    RobinTang 評論0 收藏0
  • PHP 實現Office word 關鍵詞添加背景色

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

    harriszh 評論0 收藏0
  • eyoucms v1.4.9授權破解版 易優cms企業建站系統去版權版 v1.4.9

    摘要:授權破解版易優企業建站系統易優企業建站系統是一款十分優秀專業的為企業創建網站服務的軟件。去版權破解版強大好用,為企業創建網站提供很多幫助和便利。直接去易優官網,購買商業授權即可去除版權。eyoucms v1.4.9授權破解版(易優企業建站系統)是一款十分優秀專業的為企業創建網站服務的軟件。eyoucms v1.4.9去版權破解版 強大好用,為企業創建網站提供很多幫助和便利。易優cms破解授權...

    番茄西紅柿 評論0 收藏2637

發表評論

0條評論

468122151

|高級講師

TA的文章

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