web-dev-qa-db-ja.com

.docx(Word)ファイルの内容を読み取って置き換えます

ユーザー入力に基づいて、一部のWord文書のコンテンツを置き換える必要があります。テンプレートファイル(「template.docx」など)を読み取って、名{fname}、住所{address}などを置き換えようとしています。

template.docx:

To,
The Office,
{officeaddress}
Sub:  Authorization Letter
Sir / Madam,

I/We hereby authorize  to  {Ename}  whose signature is attested here below, to submit application and collect Residential permit for {name}  
Kindly allow him to support our International assignee

{name}                                          {Ename}  

Laravel 5.3で同じことをする方法はありますか?

Phpwordを使用しようとしていますが、新しいWordファイルを書き込むためのコードしか表示されませんが、既存のファイルを読み取って置き換えることはできません。また、単に読み書きをすると、フォーマットがめちゃくちゃになります。

コード:

$file = public_path('template.docx');
$phpWord = \PhpOffice\PhpWord\IOFactory::load($file);

$phpWord->save('b.docx');

b.docx

To,
The Office,
{officeaddress}

Sub: 
 Authorization Letter
Sir / Madam,


I/We hereby authorize 
 to

{Ename}


whose signature is attested here below, to submit a
pplication and collect Residential permit
 for 
{name}

Kindly allow him to support our International assignee


{name}













{
E
name}
8
Santosh Achari

これは、@ addweb-solution-pvt-ltdの回答に対する作業バージョンです。

//This is the main document in  Template.docx file.
$file = public_path('template.docx');

$phpword = new \PhpOffice\PhpWord\TemplateProcessor($file);

$phpword->setValue('{name}','Santosh');
$phpword->setValue('{lastname}','Achari');
$phpword->setValue('{officeAddress}','Yahoo');

$phpword->saveAs('edited.docx');

ただし、すべての{name}フィールドが変更されているわけではありません。理由はわかりません。


または:

// Creating the new document...
$Zip = new \PhpOffice\PhpWord\Shared\ZipArchive();

//This is the main document in a .docx file.
$fileToModify = 'Word/document.xml';

$file = public_path('template.docx');
$temp_file = storage_path('/app/'.date('Ymdhis').'.docx');
copy($template,$temp_file);

if ($Zip->open($temp_file) === TRUE) {
    //Read contents into memory
    $oldContents = $Zip->getFromName($fileToModify);

    echo $oldContents;

    //Modify contents:
    $newContents = str_replace('{officeaddqress}', 'Yahoo \n World', $oldContents);
    $newContents = str_replace('{name}', 'Santosh Achari', $newContents);

    //Delete the old...
    $Zip->deleteName($fileToModify);
    //Write the new...
    $Zip->addFromString($fileToModify, $newContents);
    //And write back to the filesystem.
    $return =$Zip->close();
    If ($return==TRUE){
        echo "Success!";
    }
} else {
    echo 'failed';
}

うまく機能します。それを新しいファイルとして保存し、強制的にダウンロードする方法をまだ理解しようとしています。

7
Santosh Achari

PHPで。docまたは。docxファイルを編集するのと同じタスクがあります、私はそれのためにこのコードを使用しました。

参照http://www.onlinecode.org/update-docx-file-using-php/

    $full_path = 'template.docx';
    //Copy the Template file to the Result Directory
    copy($template_file_name, $full_path);

    // add calss Zip Archive
    $Zip_val = new ZipArchive;

    //Docx file is nothing but a Zip file. Open this Zip File
    if($Zip_val->open($full_path) == true)
    {
        // In the Open XML Wordprocessing format content is stored.
        // In the document.xml file located in the Word directory.

        $key_file_name = 'Word/document.xml';
        $message = $Zip_val->getFromName($key_file_name);               

        $timestamp = date('d-M-Y H:i:s');

        // this data Replace the placeholders with actual values
        $message = str_replace("{officeaddress}", "onlinecode org", $message);
        $message = str_replace("{Ename}", "[email protected]", $message); 
        $message = str_replace("{name}", "www.onlinecode.org", $message);   

        //Replace the content with the new content created above.
        $Zip_val->addFromString($key_file_name, $message);
        $Zip_val->close();
    }
2
JON

Docファイルからコンテンツを読み取って置き換えるには、 PHPWord パッケージを使用し、 composer コマンドを使用してこのパッケージをダウンロードします。

_composer require phpoffice/phpword 
_

バージョンv0.12.1 に従って、_Autoloader.php_フォルダーからPHP Word _src/PHPWord_を要求して登録する必要があります

_require_once 'src/PhpWord/Autoloader.php';
\PhpOffice\PhpWord\Autoloader::register();
_

1)ドキュメントを開く

_$template = new \PhpOffice\PhpWord\TemplateProcessor('YOURDOCPATH');
_

2)文字列変数をsingleに置き換えます

_$template->setValue('variableName', 'MyVariableValue');
_

3)複数回出現する文字列変数を置き換えます
-配列プレースホルダーを配列の数に複製します

_$template->cloneRow('arrayName', count($array));  
_

-変数値を置き換えます

_for($number = 0; $number < count($array); $number++) {
    $template->setValue('arrayName#'.($number+1), htmlspecialchars($array[$number], ENT_COMPAT, 'UTF-8'));
}
_

4)変更したドキュメントを保存します

_$template->saveAs('PATHTOUPDATED.docx');
_

[〜#〜]更新[〜#〜]
limitを3番目のパラメーターとして$template->setValue($search, $replace, $limit)に渡して、一致する回数を指定できます。

簡単な解決策を見つけたら、これを使用できます library

例:このコードは、$ pathToDocxファイルの$ searchを$ replaceに置き換えます

$docx = new IRebega\DocxReplacer($pathToDocx);

$docx->replaceText($search, $replace);
0
Igor Rebega