ユーザー入力に基づいて、一部の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}
これは、@ 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';
}
うまく機能します。それを新しいファイルとして保存し、強制的にダウンロードする方法をまだ理解しようとしています。
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();
}
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);