Word 문서를 내보내려면 PHP 기술을 사용해야 하는 최근 프로젝트 개발 중 첫 번째는 Word.Application과 같은 Microsoft Office와 함께 제공되는 ActiveX/COM 구성 요소를 사용하는 것이었습니다. 형식 호환성이 높으며 순수한 doc Word2003 형식 문서를 생성할 수 있습니다. 단점은 더 많은 리소스를 차지하며(호출 시 WINWORD.EXE 프로세스가 시작됨) 웹에서 다중 사용자 액세스에 적합하지 않다는 것입니다. 물론 PHP 등 대부분의 웹 개발 기술은 리눅스 서버에서 구동되기 때문에 윈도우 환경에서는 사용이 불가능하고 플랫폼 이식성과 호환성도 좋지 않다.
Word를 생성하는 두 번째 방법은 Word 호환 웹 페이지 형식을 생성한 다음 Word에서 여는 것입니다. 이 솔루션은 전체적으로 이상한 느낌이 듭니다. 결국 파일 형식이 HTML이고 형식 호환성이 좋지 않습니다. 하지만 이 방법의 장점은 서버 리소스를 절약하고 빠르게 생성할 수 있다는 것입니다. 마지막 솔루션은 PHPWord를 사용하여 Word2007(docx) 형식으로 문서를 생성하는 것입니다. 이제 기본적으로 Microsoft Office Word 2003 및 이후 버전과 호환됩니다. 2003 버전의 경우 호환되는 형식의 패키지(다운로드 주소)만 다운로드하여 설치하면 되며, 물론 최신 버전의 Office를 사용하는 경우에도 해당 파일을 정상적으로 열 수 있습니다. Office 2007, Office 2010으로 제한됨), 이 형식 패키지를 설치할 필요가 없습니다.
자, 이제 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', $를 추가합니다. 교체); 예를 들어 코드는 다음과 같이 변경됩니다.
/** * 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', '中文'));
위의 코드는 주로 템플릿의 문제를 해결합니다. 아래와 같은 이유로 섹션에 텍스트를 추가하는 문제를 해결합니다. $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도 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. 템플릿 단어를 사용하여 중국어 왜곡된 단어 솔루션 생성: phpword/Template.php 파일을 열고 $replace = utf8_encode($replace)를 찾아 $replace =iconv('gbk', 'utf-8) ', $replace) 그게 다입니다.
2. 단어 문서를 직접 생성합니다. addText 개체를 호출할 때 중국어 문자가 깨졌을 때 해결 방법: phpword/Section.php 파일을 열고 $givenText = utf8_encode($text)를 찾습니다. gbk', 'utf-8', $text); 그게 다입니다.
3. 다른 방법에도 비슷한 해결책이 있는 것 같습니다.
4. php 파일은 gbk를 사용합니다. 어쨌든 내 것은 중국어를 표시합니다. 오랫동안 온라인에서 검색하고 오랫동안 조사한 끝에 마침내 알아냈습니다.