キーテイクアウト
PHP開発者は、PHPとそのInterop拡張を使用して、HTMLフォームの入力に基づいてMicrosoft Wordドキュメントを生成できます。
PIASリストにMicrosoft.Office.Interopのパッケージ全体が含まれていない場合、オフィスを再インストールしてPIA機能を含めます。または、マイクロソフトからパッケージを手動でダウンロードしてインストールする必要があります。詳細な手順については、このMSDNページを参照してください。
注:Microsoft Office 2010 PIA Redistributableのみがダウンロードしてインストールできます。このパッケージのPIAバージョンは14.0.0です。バージョン15には、Office 2013のインストールが付属しています
最後に、PHP.iniファイルでPHP拡張PHP_COM_DOTNET.DLLを有効にしてサーバーを再起動する必要があります。プログラミングに進むことができます。
htmlフォーム
「名前」のテキストフィールド、「性別」のラジオボタングループ、「年齢」の範囲コントロール、「メッセージ」のテキスト領域があります。そして最後に、もちろん、「送信」ボタン
このファイルを仮想ホストのルートディレクトリの下のディレクトリに「index.html」として保存して、http:// test/test/interop。のようなURIでアクセスできるように
バックエンドのPHPファイルは、私たちの議論の焦点です。最初にこのファイルのコードをリストし、次に段階的に説明します。
「名前」、「バージョン」、「公開キートークン」はすべて、「C:WindowsAssembly」を閲覧すると表示された情報から取得されます。
<span><span><?php </span></span><span> </span><span><span>$inputs = $_POST; </span></span><span><span>$inputs['printdate']=''; </span></span><span><span>// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. </span></span><span> </span><span><span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span></span><span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span></span><span> </span><span><span>$w = new DOTNET($assembly, $class); </span></span><span><span>$w->visible = true; </span></span><span> </span><span><span>$fn = __DIR__ . '\template.docx'; </span></span><span> </span><span><span>$d = $w->Documents->Open($fn); </span></span><span> </span><span><span>echo "Document opened.<br><hr>"; </span></span><span> </span><span><span>$flds = $d->Fields; </span></span><span><span>$count = $flds->Count; </span></span><span><span>echo "There are <span><span>$count</span> fields in this document.<br>"</span>; </span></span><span><span>echo "<ul>"; </span></span><span><span>$mapping = setupfields(); </span></span><span> </span><span><span>foreach ($flds as $index => $f) </span></span><span><span>{ </span></span><span> <span>$f->Select(); </span></span><span> <span>$key = $mapping[$index]; </span></span><span> <span>$value = $inputs[$key]; </span></span><span> <span>if ($key == 'gender') </span></span><span> <span>{ </span></span><span> <span>if ($value == 'm') </span></span><span> <span>$value = 'Mr.'; </span></span><span> <span>else </span></span><span> <span>$value = 'Ms.'; </span></span><span> <span>} </span></span><span> </span><span> <span>if($key=='printdate') </span></span><span> <span>$value= date ('Y-m-d H:i:s'); </span></span><span> </span><span> <span>$w->Selection->TypeText($value); </span></span><span> <span>echo "<li>Mappig field <span><span>$index</span>: <span>$key</span> with value <span>$value</span></li>"</span>; </span></span><span><span>} </span></span><span><span>echo "</ul>"; </span></span><span> </span><span><span>echo "Mapping done!<br><hr>"; </span></span><span><span>echo "Printing. Please wait...<br>"; </span></span><span> </span><span><span>$d->PrintOut(); </span></span><span><span>sleep(3); </span></span><span><span>echo "Done!"; </span></span><span> </span><span><span>$w->Quit(false); </span></span><span><span>$w=null; </span></span><span> </span><span> </span><span> </span><span><span>function setupfields() </span></span><span><span>{ </span></span><span> <span>$mapping = array(); </span></span><span> <span>$mapping[0] = 'gender'; </span></span><span> <span>$mapping[1] = 'name'; </span></span><span> <span>$mapping[2] = 'age'; </span></span><span> <span>$mapping[3] = 'msg'; </span></span><span> <span>$mapping[4] = 'printdate'; </span></span><span> </span><span> </span><span> <span>return $mapping; </span></span><span><span>}</span></span>
「文化」は常に中立です。
<span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span> <span>$w = new DOTNET($assembly, $class); </span><span>$w->visible = true;</span>
私たちが呼び出すクラスは、常にアセンブリの名前と「.ApplicationClass」です。
これら2つのパラメーターを設定すると、単語オブジェクトをインスタンス化できます。もう1つの方法は、「検索レプレース」を行うことです。 PHPには、これを行う上で強力な組み込み機能があります。交換する予定のプレースホルダーコンテンツの周りに特別なデリミターを置くWordドキュメントを作成できます。たとえば、次のようなものを含むドキュメントを作成できます。
{{name}}そして、PHPでは、これをフォームの提出から取得した「名前」値に単純に置き換えることができます。
これは簡単で、最初のオプションのすべての欠点を回避します。適切な区切り文字を見つける必要があります。この場合、使用されるテンプレートがWordドキュメントになることを除いて、テンプレートレンダリングを行うようなものです。
3番目のオプションは私の推奨であり、Wordの高度なトピックです。フィールドを使用してプレースホルダーを表し、PHPコードでは、それぞれのフォーム値でフィールドを直接更新します。このアプローチは柔軟で、速く、Wordのベストプラクティスに準拠しています。また、ドキュメントでの全文検索も回避され、パフォーマンスに役立ちます。このオプションにも欠点があることに注意してください。
Wordは、そのデビュー以来、フィールドの名前のインデックスをサポートしたことはありません。 Word Documentで作成したフィールドの名前を提供しましたが、各フィールドにアクセスするために番号のサブスクリプトを使用する必要があります。また、これは、フィールドインデックスとフォームフィールドの名前の間の手動マッピングを行うために専用の関数(Setupfields)を使用する必要がある理由を説明しています。
Wordドキュメントにフィールドを挿入する方法を学ぶには(既製バージョンについてはここをクリックしてください)、関連するWordヘルプトピックとマニュアルを参照してください。このデモには、5つのMergefieldフィールドを備えたドキュメントがあります。また、簡単にアクセスできるように、ドキュメントをPHPスクリプトと同じディレクトリに配置しました。
フィールドPrintDateには対応するフォームフィールドがありません。そのため、$入力配列にダミーprintdateキーを追加しました。これがなければ、スクリプトはまだ実行できますが、インデックスprintdateは$ inputsアレイに表示されていないということに気付くでしょう。
フォーム値でフィールドを更新した後、次のことを使用してドキュメントを印刷します。
印刷方式にはいくつかのオプションのパラメーターがあり、その最も単純なフォームを使用しています。これにより、Windowsマシンに接続されたデフォルトのプリンターに1つのコピーを印刷します。
ドキュメントを印刷する前に、printpreviewを使用して出力を見てみることもできます。純粋に自動化された環境では、もちろん代わりに印刷を使用します。
印刷ジョブには完全にスプールするために時間が必要なため、単語アプリケーションを終了する前に数秒待たなければなりません。遅滞なく(3)、$ w-> quitはすぐに実行され、印刷ジョブも殺されます。
最後に、$ w-> quit(false)を呼び出して、PHPスクリプトによって呼び出された単語アプリケーションを閉じます。ここで提供される唯一のパラメーターは、禁止する前に変更を保存するかどうかを指定することです。ドキュメントに変更を加えましたが、他のユーザーの入力用にクリーンなテンプレートを保持したいため、ドキュメントを保存したくありません。
コードを完了したら、フォームページをロードし、いくつかの値を入力して、フォームを送信できます。以下の画像は、PHPスクリプトの出力と更新されたWordドキュメントを示しています。
これにより、開発速度が大幅に低下します。より速くするために、最初にC#で関数を開発し、次にコードをPHPに移行することをお勧めします。私がお勧めする無料のC#IDEは「#Develop」と呼ばれ、ここからダウンロードできます。 #Developは小さく、よりクリーンで、より速いため、VSシリーズよりもこれを好みます。
C#コードのPHPへの移行はまったく怖くありません。 C#コードのいくつかの行をお見せしましょう:
<span><span><?php </span></span><span> </span><span><span>$inputs = $_POST; </span></span><span><span>$inputs['printdate']=''; </span></span><span><span>// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. </span></span><span> </span><span><span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span></span><span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span></span><span> </span><span><span>$w = new DOTNET($assembly, $class); </span></span><span><span>$w->visible = true; </span></span><span> </span><span><span>$fn = __DIR__ . '\template.docx'; </span></span><span> </span><span><span>$d = $w->Documents->Open($fn); </span></span><span> </span><span><span>echo "Document opened.<br><hr>"; </span></span><span> </span><span><span>$flds = $d->Fields; </span></span><span><span>$count = $flds->Count; </span></span><span><span>echo "There are <span><span>$count</span> fields in this document.<br>"</span>; </span></span><span><span>echo "<ul>"; </span></span><span><span>$mapping = setupfields(); </span></span><span> </span><span><span>foreach ($flds as $index => $f) </span></span><span><span>{ </span></span><span> <span>$f->Select(); </span></span><span> <span>$key = $mapping[$index]; </span></span><span> <span>$value = $inputs[$key]; </span></span><span> <span>if ($key == 'gender') </span></span><span> <span>{ </span></span><span> <span>if ($value == 'm') </span></span><span> <span>$value = 'Mr.'; </span></span><span> <span>else </span></span><span> <span>$value = 'Ms.'; </span></span><span> <span>} </span></span><span> </span><span> <span>if($key=='printdate') </span></span><span> <span>$value= date ('Y-m-d H:i:s'); </span></span><span> </span><span> <span>$w->Selection->TypeText($value); </span></span><span> <span>echo "<li>Mappig field <span><span>$index</span>: <span>$key</span> with value <span>$value</span></li>"</span>; </span></span><span><span>} </span></span><span><span>echo "</ul>"; </span></span><span> </span><span><span>echo "Mapping done!<br><hr>"; </span></span><span><span>echo "Printing. Please wait...<br>"; </span></span><span> </span><span><span>$d->PrintOut(); </span></span><span><span>sleep(3); </span></span><span><span>echo "Done!"; </span></span><span> </span><span><span>$w->Quit(false); </span></span><span><span>$w=null; </span></span><span> </span><span> </span><span> </span><span><span>function setupfields() </span></span><span><span>{ </span></span><span> <span>$mapping = array(); </span></span><span> <span>$mapping[0] = 'gender'; </span></span><span> <span>$mapping[1] = 'name'; </span></span><span> <span>$mapping[2] = 'age'; </span></span><span> <span>$mapping[3] = 'msg'; </span></span><span> <span>$mapping[4] = 'printdate'; </span></span><span> </span><span> </span><span> <span>return $mapping; </span></span><span><span>}</span></span>
変数タイプが与えられた場合、コード洞察とコードの完了を楽しむことができ、開発速度がはるかに高速になります。
PHP開発をスピードアップする別の方法は、単語マクロをタップすることです。必要なアクションを実行し、マクロで記録します。マクロはVisual Basicにあり、PHPに簡単に変換できます。
最も重要なことは、MicrosoftのOffice PIA、特に各オフィスアプリケーションの名前空間ドキュメントに関する公式ドキュメントは、常に最も詳細な参照資料です。主に使用されている3つのアプリケーションは次のとおりです
窓とオフィスは、日常生活で広く使用されています。 PHP Windowsプログラマーにとって、オフィス/WindowsとPHPの両方のパワーに関する知識を持つことは、
に不可欠です。 PHPのCOM拡張機能を使用すると、この組み合わせをマスターするための扉が開かれています。
このプログラミングの分野に興味がある場合は、コメントを残してください。このトピックに関する記事をさらに作成することを検討してください。このアプローチを使用して、より多くの現実世界アプリケーションが開発されたことを楽しみにしています。
php
を使用してMicrosoft Wordドキュメントの作成に関するよくある質問(FAQ)以上がPHPでMicrosoft Wordドキュメントの作成方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。