4

我正在尝试使用PHPWord创建一个 word 文档,其中将包含从 MySQL 数据库中提取的动态数据。该数据库具有 MySQL 字符集:UTF-8 Unicode(utf8) MySQL 连接排序规则:utf8_unicode_ci表字段也是如此。

数据在 HTML 中可以很好地存储和预览,但是在使用阿拉伯语变量创建文档时,Word 中的输出看起来像أحÙد Ùبار٠اÙÙرÙ.

$PHPWord = new PHPWord();
$document = $PHPWord->loadTemplate('templates/.../wtvr.docx');
$document->setValue('name', $name);
$document->setValue('overall_percent_100', $overall_percent_100);
$document->save('Individual Report - ' . $name . '.docx');

有没有办法解决这个问题?

4

5 回答 5

7
于 2012-12-20T11:05:47.957 回答
1
  • 请找到以下几点在phpword模板中编写从右到左数据插入的所有类型的utf-8。

    1. setValueTemplate.php 的函数(第 95 行)中,请注释以下代码部分

      //if(!is_array($replace)) {
      //    $replace = utf8_encode($replace);
      //}
      
    2. 如果您有从右到左的问题,在某些语言中,文本与从左到右的文本混合在一起,请在同一setValue函数中添加以下代码。

      $replace = "<w:rPr><w:rtl/></w:rPr>".$replace; 
      

//==== 这是一个如何在 word 模板中写入 word 数据的工作示例 //--- 加载 phpword 库 ----

    $this->load->library("phpword/PHPWord");
    $PHPWord  = new PHPWord();
    $document = $PHPWord->loadTemplate('./forms/data.docx');

    $document->setValue('NAME', 'شراف الدين');
    $document->setValue('SURNAME', 'مشرف');
    $document->setValue('FNAME', 'ظهرالدين');
    $document->setValue('MYVALUE', '15 / سنبله / 1363');
    $document->setValue('PROVINCE', 'سمنگان');
    $document->setValue('DNAME', 'عبدالله');
    $document->setValue('DMOBILE', '0775060701');   
    $document->setValue('BOX','<w:sym w:font="Wingdings" w:char="F06F"/>');
    $document->setValue('NO','<w:sym w:font="Wingdings" w:char="F06F"/>');
    //$document->setValue('BOX2','<w:sectPr w:rsidR="00000000"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/>');
    $document->setValue('YES','<w:sym w:font="Wingdings" w:char="F0FE"/>');

    $document->setValue('CLASS1','<w:sym w:font="Wingdings" w:char="F06F"/>');
    $document->setValue('CLASS2','<w:sym w:font="Wingdings" w:char="F0FE"/>');
    $document->setValue('DNAME','يما شاه رخي');
    $document->setValue('TEL','0799852369');
    $document->setValue('ENTITY','مشاور حقوقي و نهادي');
    $document->setValue('ENTITY','مشاور حقوقي و نهادي');
    $document->setValue('REMARKS','در مسابقات سال 2012 میلادی در میدان Judo   بر علاوه به تعداد  39 نفر در تاریخ 4/میزان/ سال 1391 قرار ذیل اند.');

    $file = "./forms/data2.docx";
    $document->save($file);
    header("Cache-Control: public");     
    header("Content-Description: File Transfer");     
    header("Content-Disposition: attachment; filename=data2.docx");     
    header("Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");     
    header("Content-Transfer-Encoding: binary");         
    ob_clean();
    flush();
    readfile($file);

//需要设计如何改变外观。颜色#E4EDF9在此处输入图像描述

于 2012-12-27T05:01:09.650 回答
0

寻找

$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($strText);
$objWriter->endElement();

在 Writer/Word2007/Base.php 中

用。。。来代替

$objWriter->startElement('w:textDirection');
$objWriter->writeAttribute('w:val', 'rlTb');
$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($strText);
$objWriter->endElement();
$objWriter->endElement();

此外,请确保您不使用任何样式来使其工作,否则您将不得不在您使用的每个功能中重复此步骤。

于 2013-02-16T01:10:56.773 回答
0

我不得不在与 Nasers 不同的两个地方修复它:

1-在 Section.php addText 函数中:

我这样做了:

//$givenText = utf8_encode($text);
$givenText = $text;

2- 在 cell.php 中的 addText 函数

我这样做了:

// $text = utf8_encode($text);

现在您的 word 文件将以正确的方式显示 unicode 字符。然后我在文本方向上遇到了问题。我通过使用此代码找到了解决方案

$section->addText($val['notetitle'],array('textDirection'=>PHPWord_Style_Cell::TEXT_DIR_TBRL));

你可以在 cell.php 文件中看到这两个常量

const TEXT_DIR_TBRL = 'tbRl';
const TEXT_DIR_BTLR = 'btLr';

请注意,您不能在 'textDirection' 之前应用其他数组组合样式,例如 Paragraph ,因为其样式使 'textDirection' 禁用。

于 2014-11-05T17:14:37.470 回答
0

打开 PHPWord\Template.php
更改 setValue 函数(第 89 行),如下所示。
更改$replace = utf8_encode($replace); $replace = $replace;

于 2017-12-01T09:30:29.427 回答