Linux環境でWord文書を作成するためにPHPで利用できるソリューションは何ですか?
10 に答える
PHPWordは、Word 文書を docx 形式で生成できます。既存の .docx ファイルをテンプレートとして使用することもできます。テンプレート変数は、${varname} の形式でドキュメントに追加できます。
LGPL ライセンスがあり、コードに付属のサンプルはうまく機能しました。
実際の Word 文書
「実際の」Word ドキュメントを作成する必要がある場合は、Windows ベースの Web サーバーと COM オートメーションが必要です。このテーマに関するJoel の記事を強くお勧めします。
Word をだまして生の HTML を開くための偽のHTTP ヘッダー
かなり一般的な(しかし信頼できない)代替手段は次のとおりです。
header("Content-type: application/vnd.ms-word");
header("Content-Disposition: attachment; filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<b>Fake word document</b>";
echo "</body>";
echo "</html>"
外部スタイルシートを使用しないようにしてください。すべてが同じファイルにある必要があります。
これは実際の Word ドキュメントを送信しないことに注意してください。ブラウザをだましてダウンロードとして提供させ、.doc
ファイル拡張子をデフォルトにするだけです。古いバージョンの Word では、多くの場合、警告やセキュリティ メッセージが表示されずにこれが開かれ、未加工の HTML が Word にインポートされるだけです。その誤解を招くヘッダーを送信する PHP 送信Content-Type
は、実際のファイル形式の変換を構成しません。
OpenOffice テンプレート + OOo コマンド ライン インターフェイス。
- [%value-to-replace%] のようなプレースホルダーを含む ODT テンプレートを手動で作成します。
- PHP で実際のデータを使用してテンプレートをインスタンス化する場合は、テンプレート ODT (圧縮された XML) を解凍し、XML に対して実行して、プレースホルダーを実際の値にテキストで置き換えます。
- ODT を圧縮して戻します
- OpenOffice コマンド ライン インターフェイスを介して ODT -> DOC の変換を実行します。
これらの各ステップを容易にするために利用できるツールとライブラリがあります。
それが役立つかもしれません。
Linux で DOC ファイルを作成する最も簡単な方法は、PHP を使用して Zend Framework コンポーネントphpLiveDocxを使用することです。
プロジェクトの Web サイトから:
「phpLiveDocx を使用すると、開発者は PHP の構造化データをワード プロセッサで作成したテンプレートと組み合わせてドキュメントを生成できます。結果のドキュメントは、PDF、DOCX、DOC、または RTF ファイルとして保存できます。概念は差し込み印刷と同じです。 ."
OpenTBSは、テンプレートの手法を使用して、PHP で DOCX 動的ドキュメントを作成できます。
一時ファイルやコマンド ラインは不要で、すべて PHP で実行されます。
写真を追加または削除できます。作成されたドキュメントは、HTML ダウンロード、サーバーに保存されたファイル、または PHP のバイナリ コンテンツとして生成できます。
また、OpenDocument ファイル (ODT、ODS、ODF など) をマージすることもできます。
Ivan Krechetov の回答に続いて、追加のライブラリを必要とせずに、docx と odt の差し込み印刷 (実際には単純なテキスト置換) を行う関数を次に示します。
function mailMerge($templateFile, $newFile, $row)
{
if (!copy($templateFile, $newFile)) // make a duplicate so we dont overwrite the template
return false; // could not duplicate template
$zip = new ZipArchive();
if ($zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
return false; // probably not a docx file
$file = substr($templateFile, -4) == '.odt' ? 'content.xml' : 'word/document.xml';
$data = $zip->getFromName($file);
foreach ($row as $key => $value)
$data = str_replace($key, $value, $data);
$zip->deleteName($file);
$zip->addFromString($file, $data);
$zip->close();
return true;
}
これは [Person Name] を Mina に、[Person Last Name] を Mooo に置き換えます。
$replacements = array('[Person Name]' => 'Mina', '[Person Last Name]' => 'Mooo');
$newFile = tempnam_sfx(sys_get_temp_dir(), '.dat');
$templateName = 'personinfo.docx';
if (mailMerge($templateName, $newFile, $replacements))
{
header('Content-type: application/msword');
header('Content-Disposition: attachment; filename=' . $templateName);
header('Accept-Ranges: bytes');
header('Content-Length: '. filesize($file));
readfile($newFile);
unlink($newFile);
}
置換する文字列が一般的すぎる場合、この関数はドキュメントを破損する可能性があることに注意してください。[Person Name] のような冗長な置換文字列を使用してみてください。
<?php
function fWriteFile($sFileName,$sFileContent="No Data",$ROOT)
{
$word = new COM("word.application") or die("Unable to instantiate Word");
//bring it to front
$word->Visible = 1;
//open an empty document
$word->Documents->Add();
//do some weird stuff
$word->Selection->TypeText($sFileContent);
$word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc");
//closing word
$word->Quit();
//free the object
$word = null;
return $sFileName;
}
?>
<?php
$PATH_ROOT=dirname(__FILE__);
$Return ="<table>";
$Return .="<tr><td>Row[0]</td></tr>";
$Return .="<tr><td>Row[1]</td></tr>";
$sReturn .="</table>";
fWriteFile("test",$Return,$PATH_ROOT);
?>
Apache プロジェクトには、 MS Office ファイルの生成に使用できるPOIというライブラリがあります。これは Java ライブラリですが、Linux 上で問題なく実行できるという利点があります。このライブラリにはいくつかの制限がありますが、必要な機能を備えている可能性があり、おそらく Word を実行するよりも簡単に使用できます。
別のオプションとして OpenOffice がありますが、使用したことがないため、正確にはお勧めできません。
PHP COMドキュメントを見てください(コメントは役に立ちます)http://us3.php.net/com
高品質の Word ドキュメントを作成するには、2 つのオプションがあります。COM を使用して word と通信します (これには少なくとも Windows php サーバーが必要です)。openoffice とその API を使用して、ドキュメントをワード形式で作成および保存します。