亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

phpword插件導出word文件時中文亂碼問題處理方案

2024-05-04 23:25:02
字體:
來源:轉載
供稿:網友
PHPWord是一個可以把相關文件生成word文檔的插件了,但由于是老外開發的對于gbk支持不好,所以我們在導出帶有中文的word時會出現亂碼問題,下面本文就PHPWord中文亂碼問題介紹一些解決方法。
 
 

最近一個項目開發要用到PHP技術導出Word文檔,比較了幾種方案,首先是使用Microsoft Office自帶的ActiveX/COM組件,比如Word.Application,這種方式的優點是格式兼容度高,可以生成純doc的Word2003格式文檔,缺點一是比較占資源(調用會啟動一個WINWORD.EXE進程),不適合Web多用戶訪問使用;二是PHP這種Web開發技術大多數是跑在Linux服務器上,當然也就無法使用Windows下的技術了,平臺可移植和兼容性不好。

第二種生成Word的方案是生成Word兼容的網頁格式,然后以Word方式打開,這種方案總體上感覺怪怪的,畢竟文件格式是HTML的,而且格式兼容度不好,不過這種方式的優點是節省服務器資源,能夠快速生成;最后一種方案也就是今天的主角,采用PHPWord生成Word2007(docx)格式的文檔,現在基本上微軟Office Word 2003以后的版本均兼容這種格式了,對于2003版本來說,僅需要下載安裝個兼容格式包(下載地址),也能正常打開這類文件,當然如果你使用的是最新版本的Office(包括但不限于Office 2007、Office 2010)則不需要安裝此格式包。

好了,下面我就介紹一下PHPWord,大家可以通過訪問項目主頁下載并獲得關于項目的更多信息。

我在使用過程中主要遇到了中文亂碼的問題,結合網上大神們的指導,通過下面的方式解決了這類問題,希望對大家有所幫助。

1、增加東亞字體支持 

打開并編輯路徑/Writer/Word2007/Base.php文件內容,大概在第349行(行數隨著版本可能會有變化)大概函數_writeTextStyle內添加:

$objWriter->writeAttribute('w:eastAsia', $font)
比如我的修改片段基本是下面這樣:

// Fontif($font != 'Arial') {  $objWriter->startElement('w:rFonts');    $objWriter->writeAttribute('w:eastAsia', $font); // 添加這行    $objWriter->writeAttribute('w:ascii', $font);    $objWriter->writeAttribute('w:hAnsi', $font);    $objWriter->writeAttribute('w:cs', $font);  $objWriter->endElement();}

2. 解決中文亂碼問題

編輯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);}

調用方式如下:

 

$document->setValue('Template', iconv('utf-8', 'GB2312//IGNORE', '中文'));

上面的代碼主要解決模板的問題,下面同樣的道理,解決Section添加文本的問題,找到代碼$givenText = utf8_encode($text);,刪除或者注釋掉這行代碼,添加$givenText = iconv('gbk', 'utf-8', $text);,比如代碼如下:

 

/** * Add a Text Element *  * @param string $text * @param mixed $styleFont * @param mixed $styleParagraph * @return PHPWord_Section_Text */public function addText($text, $styleFont = null, $styleParagraph = null) {  //$givenText = utf8_encode($text);  $givenText = iconv('gbk', 'utf-8', $text); // 注釋掉上面行后添加這行  $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph);  $this->_elementCollection[] = $text;  return $text;}

調用方式和上面的模板調用大同小異,這邊就不列舉了。

折騰了這么多,突然發現網上還有另外一個版本的PhpWord,項目類名大小寫上略有不同,隸屬于PHPOffice/PHPWord,GitHub項目地址(文檔)。這個版本的PHPWord內容更加豐富,支持的功能也比較多(包括行間距,縮進和首行縮進等),最后我也采取的這個版本的PHPWord,值得注意的是這兩個版本的PHPWord在API接口上基本一致,可以通用。但是有些API,在PHPOffice/PHPWord里是不推薦的,比如createSection需要改成addSection,另外應用這個版本的PHPWord不需要像上面那樣做任何中文支持的修改,比較省事。

這兩個PHPWord項目的官方都提供了較詳細的使用例子和文檔,這里就不介紹了。最后提示的是:在模板模式下loadTemplate,只能使用setValue等模板操作方法,不能再添加段落或者段落修改了。這個略有不便。

對于PHPOffice/PHPWord我提供一個簡單的例子供參考(當然官方例子更多):

require_once 'PhpOffice/PhpWord/PhpWord.php'; // 包含頭文件use PhpOffice\PhpWord\Autoloader;use PhpOffice\PhpWord\Settings;use PhpOffice\PhpWord\IOFactory; require_once __DIR__ . '/PhpOffice/PhpWord/Autoloader.php';Autoloader::register();Settings::loadConfig(); // Create a new PHPWord Object$PHPWord = new \PhpOffice\PhpWord\PhpWord();$PHPWordHelper= new \PhpOffice\PhpWord\Shared\Font(); $PHPWord->setDefaultFontName('仿宋'); // 全局字體$PHPWord->setDefaultFontSize(16);   // 全局字號為3號 // 設置文檔的屬性,這些在對文檔右擊屬性可以看到,也可以省去這些步驟$properties = $PHPWord->getDocumentProperties();$properties->setCreator('張三');  // 創建者$properties->setCompany('某公司'); // 公司$properties->setTitle('某某文檔'); // 標題$properties->setDescription('http://wangye.org'); // 描述$properties->setLastModifiedBy('李四'); // 最后修改$properties->setCreated( time() );   // 創建時間$properties->setModified( time() );   // 修改時間 // 添加3號仿宋字體到'FangSong16pt'留著下面使用$PHPWord->addFontStyle('FangSong16pt', array('name'=>'仿宋', 'size'=>16)); // 添加段落樣式到'Normal'以備下面使用$PHPWord->addParagraphStyle( 'Normal',array(  'align'=>'both',  'spaceBefore' => 0,  'spaceAfter' => 0,  'spacing'=>$PHPWordHelper->pointSizeToTwips(2.8),  'lineHeight' => 1.19, // 行間距  'indentation' => array( // 首行縮進   'firstLine' => $PHPWordHelper->pointSizeToTwips(32)  ) )); // Section樣式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,頁腳3厘米// 注意這里厘米(centimeter)要轉換為twips單位$sectionStyle = array(  'orientation' => null,  'marginLeft' => $PHPWordHelper->centimeterSizeToTwips(3),  'marginRight' => $PHPWordHelper->centimeterSizeToTwips(3),  'marginTop' => $PHPWordHelper->centimeterSizeToTwips(3.5),  'marginBottom' => $PHPWordHelper->centimeterSizeToTwips(3.8),  'pageNumberingStart' => 1, // 頁碼從1開始  'footerHeight' => $PHPWordHelper->centimeterSizeToTwips(3),); $section = $PHPWord->addSection($sectionStyle); // 添加一節 // 下面這句是輸入文檔內容,注意這里用到了剛才我們添加的// 字體樣式FangSong16pt和段落樣式Normal$section->addText('文檔內容', 'FangSong16pt', 'Normal');$section->addTextBreak(1); // 新起一個空白段落 $objWriter = IOFactory::createWriter($PHPWord, 'Word2007');$objWriter->save('/path/to/file'); // 保存到/path/to/file路徑下

總結

1、用模板word生成word中文亂碼解決方案:打開phpword/Template.php文件,找到$replace = utf8_encode($replace);將其改為$replace =iconv('gbk', 'utf-8', $replace); 即可。

2、直接生成word文檔,調用addText對象時中文亂碼解決方案:打開phpword/Section.php文件,找到$givenText = utf8_encode($text);將其改為$givenText = iconv('gbk', 'utf-8', $text);即可。

3、貌似其他方法也類似第解決。

4、注意php文件采用gbk哦。反正我的顯示中文了。在網上找了好久,研究了半天才搞定。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文综合在线观看| 国产欧美日韩专区发布| 亚洲一区国产精品| 久热精品在线视频| 26uuu国产精品视频| 亚洲免费一级电影| 欧美区二区三区| 2019中文字幕在线观看| 成人av在线天堂| 国产玖玖精品视频| 久久久久北条麻妃免费看| 亚洲人成电影网站色www| 亚洲国产精品电影在线观看| 亚洲人精选亚洲人成在线| 亚洲跨种族黑人xxx| 国产精品视频地址| 青青久久aⅴ北条麻妃| 最好看的2019的中文字幕视频| 亚洲aⅴ男人的天堂在线观看| 久久91精品国产91久久跳| 日韩精品极品在线观看| 插插插亚洲综合网| 国产黑人绿帽在线第一区| 亚洲人永久免费| 国产综合久久久久久| 成人欧美一区二区三区黑人| 黑人巨大精品欧美一区二区三区| 久久亚洲欧美日韩精品专区| 国产精品美女免费| 精品美女久久久久久免费| 亚洲欧洲视频在线| 亚洲国产高清福利视频| 8090成年在线看片午夜| 久久av红桃一区二区小说| 欧美乱大交做爰xxxⅹ性3| 91精品久久久久久| 精品久久久久久久久久ntr影视| 亚洲区免费影片| 国产精品视频26uuu| 色老头一区二区三区| 欧美日韩国产限制| wwwwwwww亚洲| 国产精品狠色婷| 操日韩av在线电影| 国产欧美精品xxxx另类| 亚洲奶大毛多的老太婆| 日韩av日韩在线观看| 亚洲级视频在线观看免费1级| 91久久久久久久久久久| 中文字幕av一区二区三区谷原希美| 91美女片黄在线观| 亚洲国产精彩中文乱码av在线播放| 亚洲欧美中文字幕| 欧美另类99xxxxx| 国模私拍一区二区三区| 国产精品久久久久久久av大片| 亚洲精品久久久久中文字幕二区| 日韩欧美在线第一页| 亚洲www在线| 国产一区二区三区三区在线观看| 亚洲国产精品va在看黑人| 国产综合在线视频| 亚洲欧美另类人妖| 日韩av网站导航| 国产精品一区二区女厕厕| 日本精品va在线观看| 欧美激情三级免费| 亚洲精品wwwww| 国产精品色婷婷视频| 国产精品福利在线观看| 国产99久久精品一区二区| 91久久精品美女高潮| 欧美老少配视频| 免费97视频在线精品国自产拍| 国内免费精品永久在线视频| 91精品久久久久久久久久久久久久| 成人情趣片在线观看免费| 国语自产精品视频在线看| 美女啪啪无遮挡免费久久网站| 国产精品久久国产精品99gif| 成人字幕网zmw| 日韩av电影中文字幕| 亚洲视频欧美视频| 久久五月天色综合| 国产精品久久久久久久久借妻| 久久全球大尺度高清视频| 中文字幕亚洲自拍| 亚洲国产高清自拍| 久久精品国产2020观看福利| 亚洲黄色在线看| 国产日韩精品一区二区| 九色精品美女在线| 尤物yw午夜国产精品视频明星| 久久亚洲综合国产精品99麻豆精品福利| 51视频国产精品一区二区| 在线播放日韩精品| 尤物tv国产一区| 久久久久久亚洲精品中文字幕| 久久久久久97| 亚洲成人黄色网| 亚洲欧美综合精品久久成人| 日韩av在线影视| 日韩影视在线观看| 欧美大片网站在线观看| 日韩精品极品在线观看| 亚洲最大福利视频网| 91久久久久久久| 国语自产精品视频在免费| 亚洲性猛交xxxxwww| 色妞久久福利网| 亚洲午夜精品久久久久久性色| 欧美最猛性xxxxx亚洲精品| 日韩欧美精品中文字幕| 日本久久久久久久久久久| zzjj国产精品一区二区| 国内精品一区二区三区| 亚洲美女av网站| 亚洲另类图片色| 黄色成人av网| 26uuu另类亚洲欧美日本一| 国产精品视频网址| 亚洲另类图片色| 日韩精品丝袜在线| 久久精品欧美视频| 97精品一区二区三区| 国产精品自产拍在线观看中文| 一区二区欧美日韩视频| 国产精品日韩在线| 成人福利在线视频| 中文字幕国产精品| 欧美日韩在线第一页| 日韩电视剧在线观看免费网站| 51ⅴ精品国产91久久久久久| 亚洲人成电影网站| 国产一区二区三区毛片| 国产日韩在线一区| 久久精品久久久久| 操人视频在线观看欧美| 久久综合伊人77777| 亚洲男人第一av网站| 日韩大片在线观看视频| 欧美午夜精品久久久久久人妖| 亚洲欧洲免费视频| 92福利视频午夜1000合集在线观看| 亚洲第一国产精品| 亚洲天天在线日亚洲洲精| 亚洲天天在线日亚洲洲精| 欧美日韩中国免费专区在线看| 国产精品十八以下禁看| 精品一区二区三区三区| 欧美另类交人妖| 亚洲国产精品视频在线观看| 91精品视频在线免费观看| 欧美大学生性色视频| 亚洲人午夜色婷婷| 日韩中文字幕av| 亚洲精品自在久久| 成人性教育视频在线观看| 欧美猛交ⅹxxx乱大交视频| 精品高清美女精品国产区| 日韩在线视频网| 欧美国产一区二区三区| 96pao国产成视频永久免费| 精品欧美激情精品一区|