4

PHPWordを使用して、MySQL データベースから引き出された動的データを含む Word ドキュメントを作成しようとしています。データベースには MySQL charset: UTF-8 Unicode(utf8) MySQL connection collat​​ion: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; 
      

//==== これは単語データを単語テンプレート内に書き込む方法の実例です //--- 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

Nasers の方法とは異なる 2 つの場所で修正する必要がありました。

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 ファイルで 2 つの定数を確認できます

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

'textDirection' よりも前に Paragraph のような他の配列を組み合わせたスタイルを適用できないことに注意してください。これは、そのスタイルが 'textDirection' を無効にするためです。

于 2014-11-05T17:14:37.470 に答える
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 に答える