web-dev-qa-db-ja.com

LinuxでPHPを使用してWordドキュメントを作成

Linux環境でWordドキュメントを作成するためのPHPの利用可能なソリューションは何ですか?

59
TechLearner

実際のWord文書

「実際の」Wordドキュメントを作成する必要がある場合は、WindowsベースのWebサーバーとCOMオートメーションが必要です。このテーマについて Joelの記事 を強くお勧めします。

fakeWordをだまして生の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文書を(not送信しないことに注意してください。ブラウザをだましてダウンロードとして提供し、デフォルトで.docファイル拡張子。古いバージョンのWordでは、警告/セキュリティメッセージなしでこれを開くことが多く、生のHTMLをWordにインポートするだけです。 PHP誤解を招くような送信Content-Typeヘッダーは、実際のファイル形式変換を構成しません。

33
Sergey Kornilov

PHPWord は、docx形式のWord文書を生成できます。既存の.docxファイルをテンプレートとして使用することもできます-テンプレート変数は、$ {varname}の形式でドキュメントに追加できます

LGPLライセンスがあり、コードに付属している例はうまく機能しました。

29

OpenOfficeテンプレート+ OOoコマンドラインインターフェイス。

  1. [%value-to-replace%]などのプレースホルダーを使用してODTテンプレートを手動で作成します
  2. PHPで実際のデータを使用してテンプレートをインスタンス化する場合、テンプレートODT(zip形式のXML)を解凍し、XMLに対してプレースホルダーを実際の値でテキストで置き換えます。
  3. ODTを圧縮して戻す
  4. OpenOfficeコマンドラインインターフェイスを使用して、変換ODT-> DOCを実行します。

これらの各手順を簡単にするツールとライブラリが用意されています。

それが役立つかもしれません。

20
Ivan Krechetov

LinuxでDOCファイルを作成する最も簡単な方法は、PHPを使用してZend FrameworkコンポーネントphpLiveDocxを使用することです。

プロジェクトのWebサイトから:

「phpLiveDocxを使用すると、開発者はPHPからの構造化データをワードプロセッサで作成されたテンプレートと組み合わせてドキュメントを生成できます。結果のドキュメントはPDF、DOCX、DOCまたはRTFファイル。概念は差し込み印刷と同じです。 "

10
Leo Bonnafe

OpenTBS は、テンプレートの手法を使用してPHPでDOCX動的ドキュメントを作成できます。

一時ファイルもコマンドラインも不要で、すべてPHPで使用できます。

画像を追加または削除できます。作成されたドキュメントは、HTMLダウンロード、サーバーに保存されたファイル、またはPHPのバイナリコンテンツとして作成できます。

また、OpenDocumentファイル(ODT、ODS、ODFなど)をマージできます。

http://www.tinybutstrong.com/opentbs.php

7
Skrol29

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]のような冗長な置換文字列を使用してみてください。

6
Matiaan

Apacheプロジェクトには [〜#〜] poi [〜#〜] というライブラリがあり、MS Officeファイルの生成に使用できます。これはJavaライブラリですが、Linuxで問題なく実行できるという利点があります。このライブラリには制限がありますが、あなたのために仕事をするかもしれません。 Wordを実行します。

もう1つのオプションはOpenOfficeですが、使用したことがないため、厳密にはお勧めできません。

<?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);
?> 
3
hoang

高品質のWord文書を作成するには、2つのオプションがあります。 COMを使用してWordと通信します(少なくともWindows PHPサーバーが必要です)。 openofficeとそのAPIを使用して、Word形式でドキュメントを作成および保存します。

0
DreamWerx

PHP COMドキュメント(コメントは参考になります) http://us3.php.net/com をご覧ください。

0
JREAM