PHPでMicrosoft Wordドキュメントの作成方法
キーテイクアウト
PHP開発者は、PHPとそのInterop拡張を使用して、HTMLフォームの入力に基づいてMicrosoft Wordドキュメントを生成できます。
統合を成功させるには、Microsoft OfficeとInteropアプリケーション(PIA、プライマリインタートップアセンブリ)を開発するための図書館とともに、典型的なWAMP環境が必要です。
PHP拡張PHP_COM_DOTNET.DLLは、PHP.iniファイルで有効にする必要があり、プログラミングを進める前にサーバーを再起動しました。- バックエンドのPHPファイルはコーディングプロセスの焦点であり、PHPでのcom操作では、「アセンブリ」内に「クラス」のインスタンス化が必要です。
- コーディング速度とPIAの理解を改善するために、開発者は最初にC#で機能を開発し、次にコードをPHPに移動させることができます。 MicrosoftのOfficePiaに関する公式ドキュメントは貴重な参考資料です。
- 準備
- 最初に、Windows開発マシンに典型的なWAMP環境が設定されていることを確認してください。 Interopは純粋にWindows機能であるため、Windowsの下でApacheとPHPをホストする必要があります。この例では、Easyphp 14.1を使用しています。これは、インストールと構成が非常に簡単です。 次に、Microsoft Officeをインストールする必要があります。そのバージョンはそれほど重要ではありません。私はOffice 2013 Proを使用していますが、2007年以降のオフィスバージョンは機能するはずです。
- 次に、InteroPアプリケーション(PIA、プライマリインタープットアセンブリと呼ばれる)を開発するライブラリがインストールされていることを確認する必要があります。これを確認するために、Windows Explorerを開いて
microsoft.office.interop.wordエントリ(スナップショットに下線が付けられています)が表示されます。これは、このデモで使用するPIAになります。 「アセンブリ名」、「バージョン」、「公開キートークン」に特に注意してください。これらはすぐに私たちのPHPスクリプトで使用されます。 このディレクトリでは、プログラミング(PHPだけでなく、VB.NET、C#など)に利用できる他のPIA(オフィスファミリー全体を含む)も見ることができます
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フォーム
このデモの焦点はバックエンド処理にあるので、単純なHTMLフォームを備えたシンプルなフロントエンドを作成します。これは以下の図のようになります。
「名前」のテキストフィールド、「性別」のラジオボタングループ、「年齢」の範囲コントロール、「メッセージ」のテキスト領域があります。そして最後に、もちろん、「送信」ボタン
このファイルを仮想ホストのルートディレクトリの下のディレクトリに「index.html」として保存して、http:// test/test/interop。のようなURIでアクセスできるように
バックエンドのPHPファイルは、私たちの議論の焦点です。最初にこのファイルのコードをリストし、次に段階的に説明します。
フォームから投稿された値を保持するために$ inputs変数を設定し、printdateのダミー値を作成した後、これが必要な理由について説明します。これらの4つの重要な行に出会います。
PHPでのcom操作には、「アセンブリ」内の「クラス」のインスタンス化が必要です。私たちの場合、私たちは言葉で動作することです。私たちが示した最初のスクリーンショットを振り返ると、PIAという言葉の完全な署名を構築することができます。「名前」、「バージョン」、「公開キートークン」はすべて、「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つのパラメーターを設定すると、単語オブジェクトをインスタンス化できます。- このオブジェクトは、バックグラウンドにとどまることができます。または、目に見える属性をtrueに設定することで前景に持ち込むことができます。
- 次に、処理するドキュメントを開き、「ドキュメント」インスタンスを$ d変数に割り当てます。 そのドキュメントでは、HTMLフォームからの入力に基づいてコンテンツを作成するために、いくつかのオプションがあります。
- 柔軟性はありません。出力の変更には、PHPスクリプトの変更が必要です。
- コントロールとプレゼンテーションの分離に違反します。
- ドキュメントコンテンツ(アライメント、フォント、スタイルなど)にスタイルを適用する場合、コードの行が大幅に増加します。プログラム的に変化するスタイルは面倒すぎます。
もう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ドキュメントを示しています。
についてもっと理解します
PHPは、型と型切れの言語です。 comオブジェクトはタイプオブジェクトです。 PHPコーディング中に、単語アプリケーション、ドキュメント、フィールドなど、オブジェクトから意味のあるコード洞察を取得する方法はありません。それがどのようなプロパティを持っているのか、それがどのような方法をサポートするかはわかりません。これにより、開発速度が大幅に低下します。より速くするために、最初に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つのアプリケーションは次のとおりです
- excel 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v = office.15).aspx
- Word 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
- PowerPoint 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v = office.15).aspx
結論
この記事では、PHP COMライブラリとMicrosoft Office Interop機能を使用してWordドキュメントを入力する方法を示しました。窓とオフィスは、日常生活で広く使用されています。 PHP Windowsプログラマーにとって、オフィス/WindowsとPHPの両方のパワーに関する知識を持つことは、
に不可欠です。 PHPのCOM拡張機能を使用すると、この組み合わせをマスターするための扉が開かれています。
このプログラミングの分野に興味がある場合は、コメントを残してください。このトピックに関する記事をさらに作成することを検討してください。このアプローチを使用して、より多くの現実世界アプリケーションが開発されたことを楽しみにしています。
php
を使用してMicrosoft Wordドキュメントの作成に関するよくある質問(FAQ)
phpを使用してWordドキュメントに画像を追加することは、簡単なプロセスです。 phpwordライブラリによって提供されるaddimage()関数を使用できます。この関数を使用すると、追加する画像ファイルへのパスを指定できます。また、幅、高さ、アラインメントなどの追加のパラメーターを指定して、ドキュメント内の画像の外観をカスタマイズすることもできます。 PHPスクリプトに必要なヘッダーを含めて、画像がWordドキュメントに正しく解釈および表示されるようにすることを忘れないでください。 PHPを使用してWordドキュメントでテーブルを作成します。 PHPWordライブラリは、ドキュメントにテーブルを作成するために使用できるAddTable()という関数を提供します。その後、addrow()およびaddcell()関数を使用して、テーブルに行と列を追加できます。また、テーブルとそのセルの幅、高さ、アライメントを指定して外観をカスタマイズすることもできます。 PHPWordライブラリでは、PHPを使用してWordドキュメントにテキストメッセージを送信することは簡単です。 AddText()関数を使用してドキュメントにテキストを追加でき、この関数の2番目のパラメーターとしてスタイル配列を指定できます。このスタイルアレイには、フォントサイズ、フォントの色、太字、斜体、下線などのプロパティが含まれます。また、AddTitleStyle()またはAddParagraphStyle()機能を使用してスタイルオブジェクトを作成して、テキストに適用することもできます。以上がPHPでMicrosoft Wordドキュメントの作成方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

php8.1の列挙関数は、指定された定数を定義することにより、コードの明確さとタイプの安全性を高めます。 1)列挙は、整数、文字列、またはオブジェクトであり、コードの読みやすさとタイプの安全性を向上させることができます。 2)列挙はクラスに基づいており、トラバーサルや反射などのオブジェクト指向の機能をサポートします。 3)列挙を比較と割り当てに使用して、タイプの安全性を確保できます。 4)列挙は、複雑なロジックを実装するためのメソッドの追加をサポートします。 5)厳密なタイプのチェックとエラー処理は、一般的なエラーを回避できます。 6)列挙は魔法の価値を低下させ、保守性を向上させますが、パフォーマンスの最適化に注意してください。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。
