0

0

解决PHPWord导出生成Word中文乱码问题

php中文网

php中文网

发布时间:2016-06-02 09:14:08

|

2291人浏览过

|

来源于php中文网

原创

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,大家可以通过访问项目主页下载并获得关于项目的更多信息。

我在使用过程中主要遇到了中文乱码的问题,结合网上大神们的指导,通过下面的方式解决了这类问题,希望对大家有所帮助。

立即学习PHP免费学习笔记(深入)”;

1、增加东亚字体支持.

打开并编辑路径/Writer/Word2007/Base.php文件内容,大概在第349行(行数随着版本可能会有变化)大概函数_writeTextStyle内添加:

$objWriter->writeAttribute('w:eastAsia', $font)
比如我的修改片段基本是下面这样:
// Font 
if($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; 
}

调用方式和上面的模板调用大同小异,这边就不列举了。

广研企业网站管理系统中英文双语版
广研企业网站管理系统中英文双语版

v1.8新增功能简介: 一、后台新增生成网站地图和生成Sitemap.xml的功能。 二、新增下载中心功能,可在后台上传doc,xls,ppt,rar,pdf文件。 三、新增产品缩略图自动缩放功能,图片按比例缩放,解决了图片变形问题。 四、新闻、产品详细页新增了上一个、下一个的功能,改善用户体验。 五、在线客服新增了阿里巴巴贸易通在线客服。 六、可在后台设置分享代码,如百度分享和AddThis等。

下载

折腾了这么多,突然发现网上还有另外一个版本的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,反正我的显示中文了,在网上找了好久,研究了半天才搞定.


永久链接:

转载随意!带上文章地址吧。

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel基础快速入门
Laravel基础快速入门

共15课时 | 1.8万人学习

通用后台管理系统开发(Laravel)
通用后台管理系统开发(Laravel)

共21课时 | 4.1万人学习

Laravel基础与实战(模块化)
Laravel基础与实战(模块化)

共36课时 | 7.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号