phpword中文乱码解决方法

phpword是一个强大的PHP库用于创建Word文件,利用这个库可以插入文本、Text分段、页分段、页头/页脚、表格、列表元素、超链接、并进行格式化,最终生成docx文件,但是在导出中文时出现乱码问题,以下是解决办法,希望对你有所帮助。

一、增加东亚字体支持 

打开并编辑路径/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();

}

二、 解决中文乱码问题

编辑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哦。


转载于:https://my.oschina.net/china008/blog/387828

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHPWord Beta 0.6.2 开发者指南 目 录 首先我们要了解文档最基本的信息和设置: 4 计量单位:缇(twips) 4 字体设置 4 文档属性设置 4 新建文档 5 添加页面 5 页面样式 5 页面样式属性 6 文本 7 添加文本 7 添加文本资源 7 文本样式 8 样式属性列表 9 添加换行符 10 添加分页符 10 列表 10 添加列表 10 列表样式 11 列表样式属性列表 11 超链接 11 添加超链接 11 超链接样式 12 图片 13 添加图片 13 图片样式 13 图片样式属性 13 添加GD生成图片 14 添加水印 14 添加对象 15 添加标题 15 添加目录 16 表格 17 添加表格 17 添加行 17 添加单元格 17 单元格样式 19 表格样式 20 页脚 22 页眉 23 模版 23 其他问题修改 25 解决文本缩进问题 25 表格对齐和表格缩进 27 图片缩进和绝对相对悬浮定位 30 首先我们要了解文档最基本的信息和设置:  因为是国外编辑的类库,存在对中文支持的问题,使用前,我们需要进行一些修正: 1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK或者GB2312编码,使用iconv进行编码转换。 2、解决中文字体支持,在writer/word2007/base.php中 312行添加 $objWriter->writeAttribute('w:eastAsia',$font) 3、启动php zip支持,windows环境下在php配置文件php.ini中,将extension=php_zip.dll前面的分号“;”去除;(如果没有,请添加extension=php_zip.dll此行并确保php_zip.dll文件存在相应的目录),然后同样在php.ini文件中,将 zlib.output_compression = Off 改为zlib.output_compression = On ; 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值