백엔드 개발 PHP 튜토리얼 解决PHPWord中文乱码及设置中文字体、常见使用问题

解决PHPWord中文乱码及设置中文字体、常见使用问题

Jun 06, 2017 pm 01:39 PM
PHP 기술

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

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

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);
}
로그인 후 복사

调用方式如下:

/**
 * 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;
}
로그인 후 복사

上面的代码主要解决模板的问题,下面同样的道理,解决Section添加文本的问题,找到代码$givenText = utf8_encode($text);,删除或者注释掉这行代码,添加$givenText = iconv('gbk', 'utf-8', $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路径下
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP의 파일 업로드 및 다운로드 기술에 대한 자세한 설명 PHP의 파일 업로드 및 다운로드 기술에 대한 자세한 설명 Jun 25, 2023 pm 05:57 PM

PHP는 웹사이트 개발에 널리 사용되는 매우 인기 있는 서버측 프로그래밍 언어입니다. 그 중 파일 업로드 및 다운로드는 웹사이트에서 흔히 사용되는 기능 중 하나이며, PHP는 이러한 기능을 구현하기 위한 풍부한 기능과 기술을 제공합니다. 이 기사에서는 웹사이트를 보다 효율적으로 개발할 수 있도록 PHP의 파일 업로드 및 다운로드 기술을 자세히 소개합니다. 파일 업로드 파일 업로드는 로컬 컴퓨터에서 원격 서버로 파일을 전송하는 것을 의미하며, 파일을 업로드한 후 이러한 파일을 저장, 처리 및 표시할 수 있습니다. PHP에서

PHP Kuaishou API 인터페이스 호출 기술: 인터페이스에서 반환된 오류 정보를 처리하는 방법 PHP Kuaishou API 인터페이스 호출 기술: 인터페이스에서 반환된 오류 정보를 처리하는 방법 Jul 20, 2023 pm 11:22 PM

PHP Kuaishou API 인터페이스 호출 팁: 인터페이스에서 반환된 오류 정보를 처리하는 방법 PHP를 사용하여 Kuaishou API 인터페이스를 호출할 때 인터페이스에서 오류를 반환하는 상황이 자주 발생합니다. 처리 인터페이스에서 반환된 오류 정보에 대해 적절한 처리 및 피드백을 제공하여 애플리케이션의 안정성과 사용자 경험을 개선해야 합니다. 이 기사에서는 인터페이스에서 반환된 오류 정보를 처리하는 몇 가지 기술을 소개하고 해당 코드 예제를 제공합니다. 예외를 포착하려면 try-catch를 사용하십시오. API 인터페이스를 호출할 때 일부 예외 오류가 발생할 수 있습니다.

프레임워크 내 PHP의 페이징 기술 적용 방법에 대한 자세한 설명 프레임워크 내 PHP의 페이징 기술 적용 방법에 대한 자세한 설명 Jun 09, 2023 am 11:40 AM

인터넷의 급속한 발전으로 인해 사용자의 검색 경험을 향상시키기 위해 데이터 페이징 기능을 구현해야 하는 웹사이트가 점점 더 많아지고 있습니다. 웹 개발에서 PHP는 가장 널리 사용되는 서버측 프로그래밍 언어 중 하나이며, 데이터 페이징 기능은 PHP 개발에 없어서는 안 될 기술입니다. 이 기사에서는 프레임워크에서 PHP의 페이징 기술을 적용하는 방법을 소개하고 다양한 페이징 솔루션의 장단점을 비교합니다. 1. 전통적인 PHP 페이징 방법 전통적인 PHP 개발에서 데이터 페이징 기능을 구현하려면 많은 코드를 작성해야 하며 각 페이지에서 이를 반복해야 합니다.

PHP 프로그래밍 팁: 이미지 크기 조정을 처리하는 방법 PHP 프로그래밍 팁: 이미지 크기 조정을 처리하는 방법 Aug 19, 2023 am 10:36 AM

PHP 프로그래밍 팁: 이미지 크기 조정을 처리하는 방법 현대 웹 디자인에서 이미지는 필수적인 부분이며 이미지 크기 조정은 일반적인 작업 중 하나입니다. 이미지 모음을 표시하든, 다양한 크기의 장치 요구 사항에 응답하든, 이미지 크기 조정은 중요한 역할을 합니다. 이 기사에서는 PHP 프로그래밍 언어를 사용하여 이미지 크기 조정을 처리하는 방법을 소개하고 참조용 코드 예제를 첨부합니다. 1. 이미지 크기 조정을 위해 GD 라이브러리를 사용합니다. GD 라이브러리는 PHP의 강력한 이미지 처리 라이브러리로 이미지 크기 조정 기능을 구현할 수 있습니다. 먼저, 다음을 확인하세요.

PHP 프로그래밍 팁: 배열에서 누락된 숫자를 빠르게 찾는 방법 PHP 프로그래밍 팁: 배열에서 누락된 숫자를 빠르게 찾는 방법 Mar 01, 2024 pm 04:27 PM

PHP 프로그래밍 팁: 배열에서 누락된 숫자를 빠르게 찾는 방법 프로그래밍을 하다 보면 배열에서 특정 숫자가 누락되었는지 확인해야 하는 상황에 자주 직면하게 됩니다. 이때, 적시에 처리할 수 있도록 배열에서 누락된 숫자를 찾는 빠르고 효과적인 방법이 필요합니다. 이 기사에서는 특정 코드 예제를 사용하여 배열에서 누락된 숫자를 빠르게 찾는 방법을 보여주는 PHP 기반 프로그래밍 기술을 소개합니다. 1. 방법 1: 루프를 사용하여 배열을 순회합니다. 먼저 배열을 반복하여 배열에서 누락된 숫자를 확인할 수 있습니다. 특정 단계

PHP에서 개행 문자 교체에 대해 자세히 알아보세요. PHP에서 개행 문자 교체에 대해 자세히 알아보세요. Mar 20, 2024 pm 06:42 PM

PHP에서 줄 바꿈을 바꾸는 것은 실제 개발, 특히 텍스트 데이터를 처리할 때 자주 발생하는 문제입니다. 개행 문자는 운영 체제에 따라 다르게 표시될 수 있습니다. 일반적으로 Windows 시스템에서는 ""이고 Linux 시스템에서는 ""입니다. 따라서 텍스트 데이터가 정상적인 형식이 되도록 균일하게 줄 바꿈을 처리해야 합니다. 이 기사에서는 PHP에서 개행 문자를 바꾸는 기술을 살펴보고 구체적인 코드 예제를 제공합니다. 1. PHP 내장 함수를 사용하여 줄 바꿈을 처리합니다. PHP는 몇 가지 내장 함수를 제공합니다.

PHP 높은 동시성 처리 능력 분석 PHP 높은 동시성 처리 능력 분석 Aug 10, 2023 pm 06:53 PM

PHP 고동시성 처리 능력 분석 인터넷의 발달로 인해 웹 사이트 동시 방문에 대한 요구 사항이 점점 더 높아지고 있습니다. 웹사이트 개발을 위한 프로그래밍 언어로서 PHP는 높은 동시 액세스 압력에 직면했을 때 성능과 안정성을 향상시키기 위해 특별한 처리 기술이 필요합니다. 이 기사에서는 PHP의 높은 동시성 처리 기술을 소개하고 코드 예제를 제공합니다. PHP-FPMPHP-FPM(FastCGIProcessManager)을 사용하면 PHP에서 공식적으로 제공하는 프로세스 관리자로,

PHP 쿼리문 최적화 팁 공유 PHP 쿼리문 최적화 팁 공유 Mar 24, 2024 pm 12:51 PM

제목: PHP 쿼리문 최적화 팁 공유 웹 애플리케이션을 개발할 때 데이터베이스 쿼리를 최적화하는 것은 애플리케이션의 성능과 응답 속도를 크게 향상시킬 수 있는 중요한 링크입니다. PHP에서는 쿼리문을 최적화하면 데이터베이스에 대한 부담을 효과적으로 줄이고 시스템 성능을 향상시킬 수 있습니다. 이 기사에서는 일부 PHP 쿼리문 최적화 기술과 특정 코드 예제를 공유합니다. 1. 인덱스 사용 데이터베이스 테이블에 인덱스를 적절하게 생성하면 데이터 쿼리 속도를 높일 수 있습니다. PHP에서는 쿼리 문에 사용되는 인덱스를 지정할 수 있습니다.

See all articles