ホームページ バックエンド開発 PHPチュートリアル Windows システムで PHP を使用して Word ドキュメントを生成するチュートリアル

Windows システムで PHP を使用して Word ドキュメントを生成するチュートリアル

Jul 25, 2016 am 08:45 AM

準備

まず、一般的な WAMP 環境が Windows システムにインストールされ、構成されていることを確認してください。 Interop は純粋に Windows の機能であるため、Apache と PHP を Windows プラットフォームで構築します。この例では、インストールと設定が非常に簡単な EasyPHP 14.1 を使用しました。

次に、Microsoft Officeをインストールします。バージョンは厳密には必須ではありません。 Office 2013 Professional を使用していますが、2007 以降のどのバージョンの Office でも動作するはずです。

次に、Interop アプリケーションを開発するためのライブラリ (PIA、Priority Interaction Components とも呼ばれます) がインストールされていることを確認する必要があります。これを確認するには、エクスプローラーを開いて アセンブリを見つけます。次のインストールされた PIA ブランチが表示されます。

201573144223171.png (1050×656)

Microsoft.Office.Interop.Word エントリが表示されます (このスクリーンショットでは下線が付いています)。 これは、この例で使用する PIA です。 「名前」、「バージョン」、「公開鍵トークン」には特に注意してください。これらを PHP スクリプトで使用します。

このディレクトリには、プログラミング (PHP だけでなく、VB.net、C# など) に使用される他の PIA (Office ファミリ全体を含む) も表示されます。

このリストに Microsoft.Office.Interop のパッケージ全体が含まれていない場合は、Office を再インストールし、インストールに PIA を含めることもできます。このパッケージを手動でダウンロードしてインストールすることもできます。詳しいインストール手順については、この MSDN ページをご覧ください。

注: Microsoft Office 2010 PIA 再頒布可能パッケージのみを個別にダウンロードしてインストールできます。このパッケージの PIA バージョンは 14.0.0 です。バージョン 15 は、Office をインストールすることによってのみ使用できます。

最後に、php.ini ファイル内の PHP 拡張機能 php_com_dotnet.dll を有効にして、サーバーを再起動する必要があります。

これでプログラミングを始めることができます。

HTMLフォーム

このデモは主にバックエンドの処理に焦点を当てているため、シンプルな HTML フォームを使用してフロントエンドを表示すると次のようになります。


「名前」を入力するためのテキストボックス、「性別」のためのラジオボタングループ、「年齢」のためのフィールド値コントロール、そして「メッセージ」を書くためのテキストフィールドがあります。最後に「送信」ボタンが必要です。 201573144251848.png (889×757)

ファイルに「index.html」という名前を付けて、仮想ホストのルート ディレクトリに保存します。これにより、URL (例: http://test/test/interop) を通じてファイルに直接アクセスできるようになります。

バックステージ

バックエンド PHP ファイルは、これから説明するコア部分です。最初に以下のコードを投稿し、それからステップバイステップで説明します



    $inputs = $_POST;
  1. $inputs['printdate']='';
  2. // 「printdate」がないため、PHP 通知を回避するためのダミー値POST 変数
  3. $w = 新しい DOTNET($assembly, $class);
  4. $w->visible = true;
  5. $fn = __DIR__ '\template.docx';
  6. $d = $w->Documents- >Open($fn);
  7. echo "ドキュメントが開きました。

    ";
  8. $flds = $d->フィールド;
  9. $count = $flds->Count;
  10. echo "このドキュメントには $count フィールドがあります。
    ";
  11. echo "
      ";
    • $mapping = setupfields();
    • foreach ($flds as $index => $f)
    • {
    • $f->Select();
    • $key = $mapping[$index];
    • $value = $inputs[$key];
    • if ($key == '性別')
    • {
    • if ($value == 'm')
    • $value = 'さん';
    • else
    • $value = 'さん';
    • }
    • if($key=='printdate')
    • $value= date ('Y-m-d H: i:s');
    • $w->Selection->TypeText($value);
    • echo "
    • Mappig フィールド $index: $key 値 $value
    • ";
    • }
    • echo "
    ";
  12. echo "マッピングが完了しました!

    ";
  13. echo "印刷中です。しばらくお待ちください...
    ";
  14. $d->PrintOut ();
  15. sleep(3);
  16. echo "完了!";
  17. $w->Quit(false);
  18. $w=null;
  19. function setupfields()
  20. {
  21. $mapping = array( );
  22. $mapping[0] = '性別';
  23. $mapping[1] = '名前';
  24. $mapping[2] = '年齢';
  25. $mapping[3] = 'メッセージ';
  26. $mapping[ 4] = 'printdate';
  27. return $mapping;
  28. }
  29. コードをコピー
  30. フォームに渡される値を取得するために使用される変数 $inputs を設定した後、printdate を保存するためのダミー値を作成する必要があります - この変数が必要な理由については後ほど説明します - ここで、次の 4 行が表示されます。コード:

    1. $assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
    2. $class = 'Microsoft.Office.Interop.Word.ApplicationClass';
    3. $w = new DOTNET($assembly, $class);
    4. $w->visible = true;
    コードをコピー

    PHP での COM 操作には、アセンブリ内のクラスのインスタンスを要求する必要があります。私たちの場合は、Word を使用して作業します。前のスクリーンショットに示されているコードを考慮すると、完全に署名された Word PIA を構築できます。

      「名前」、「バージョン」、「公開鍵トークン」は「c:Windowsassembly」を閲覧した際に表示される情報です
    • 「文化」は常に中立です。

    呼び出しクラスのコンパイル済みファイルのサフィックスは、通常、ApplicationClass です。

    次の 2 つの手順を設定することで、単語オブジェクトを初期化できます:

    まず、visible 属性を true に設定することで、単語オブジェクトをバックグラウンドで保存したり、フォアグラウンドで表示したりすることができます。

    次に、処理対象のドキュメントを開き、それを $d 変数としてインスタンス化します。

    ドキュメントオブジェクトに、HTMLフォームのテキストに基づいてドキュメントのコンテンツを追加します。ここでいくつかのパラメータを設定できます。

    最悪の方法は、php ページ上のすべてをハードコーディングしてから、それらを word オブジェクトに追加することです。次の理由により、この方法は使用しないことを強くお勧めします:

    1 コードは柔軟ではないため、PHP コンテンツを変更するにはスクリプトの再修正が必要になります。

    2 制御層と表示層の分離に違反します
    3. Word コンテンツの形式 (配置、フォント、スタイルなど) を設定する必要がある場合、この方法ではコードの行数が大幅に増加し、プログラムでスタイルを変更するのは非常に面倒です。

    もう 1 つの方法は、「検索置換」を使用することです。 PHP に組み込まれているこの機能は非常に強力です。 Word 文書を作成し、置換する必要があるプレースホルダーのコンテンツの周囲にセパレーターを配置します。たとえば、次の内容を含むドキュメントを作成します:

    1. {{名前}}
    コードをコピー
    PHP では、フォームの送信から取得した「名前」の値に単純に置き換えます。このアプローチにより、最初のオプションの欠点が回避されます。正しいセパレータを見つける必要があるだけです。この例では、使用されるテンプレートが Word ドキュメントであることを除けば、テンプレートのレンダリングを行うことに似ています。

    3 番目のオプションは私の推奨事項で、Word のプレミアム テーマです。プレースホルダーを表すためにフィールドを使用し、PHP コードでは、対応するフォーム値でフィールドを直接更新します。

    この方法は柔軟かつ高速で、Word のベスト プラクティスに準拠しています。これにより、ファイルの全文検索も回避され、パフォーマンスの向上に役立ちます。このオプションには欠点もあることに注意してください。

    つまり、Word はデビュー以来、名前付きインデックス付きフィールドをサポートしたことがありません。 Word 文書内に作成するフィールドには名前を付けますが、各フィールドにアクセスするには数値の下付き文字を使用します。これは、フィールドインデックスとフォームフィールドの名前の間のマッピングマニュアルを行うために専用の関数 (setupfields) を使用する必要がある理由も説明しています

    Word 文書にフィールドを挿入する方法 (カスタマイズされたバージョンを表示するにはここをクリック) については、関連する Word ヘルプ トピックとマニュアルを参照してください。このデモでは、5 つの MERGEFIELD フィールドを含むドキュメントがあります。さらに、簡単にアクセスできるように、ドキュメントと PHP スクリプトを 1 つのディレクトリに配置しました。

    printdate フィールドには、対応するフォーム フィールドがないことに注意してください。これが、偽の printdate を $inputs 配列のキーとして追加する理由です。このキーがなくてもスクリプトは実行できますが、インデックス printdate が $inputs 配列に存在しないことを示すプロンプトが表示されます。

    フォームデータを使用してフィールド値を更新した後、次のコマンドを使用してドキュメントを印刷します:



    1. $d->PrintOut();
    コードをコピー

    PrintOut メソッドにはいくつかのオプションのパラメーターがありますが、ここでは最も単純な形式を使用します。これにより、Windows マシンにリンクされているデフォルトのプリンタにコピーが印刷されます。


    PrintPreviewを使用して印刷プレビューを行うことができます。もちろん、純粋に自動化されたシナリオでは、印刷に PrintOut を直接使用します。

    印刷ジョブがバックグラウンドを完全に終了するまでに時間がかかるため、Word アプリケーションを終了する前に少し待つ必要もあります。遅延(3)がなければ、$w->Quit が即時に実行され、印刷ジョブは即時に終了します。

    最後に、$w->Quit(false) を呼び出して、PHP スクリプト呼び出しを通じて Word アプリケーションを閉じることを選択します。ここで提供される唯一のパラメータは、終了する前に変更を保存するかどうかを示すことです。ドキュメントに変更を加えますが、他のユーザーの入力用にクリーンなテンプレートを用意したいため、変更は保存しません。

    コーディングが完了したら、フォームページをロードし、コンテンツを入力してフォームを送信できます。以下のスクリーンショットは、Word ドキュメントの更新中の PHP スクリプトの出力を示しています。

    201573144442664.png (889×757)

    201573144502426.png (1663×843)

    コーディング速度を向上させ、PIA をより深く理解します

    PHP は弱く型付けされた言語です。 COM オブジェクトはオブジェクト型です。 PHP コーディング プロセスでは、オブジェクト内でコードの自動提案と補完機能を使用できません。同様のことが Word アプリケーション、ドキュメント、さらにはフィールドにも当てはまります。どのような機能があるのか​​、どのようなメソッドがサポートされているのかはわかりません。


    これにより、開発速度が大幅に低下します。開発を迅速化するために、まず、C# で開発した関数を PHP コーディングに移行することをお勧めします。ここからダウンロードできる「#develop」という無料の C# IDE をお勧めします。 #develop の方が小さく、シンプルで、応答性が高いため、私は VS よりもこのソフトウェアを好みます。

    C# コードを PHP に移行することはまったく怖いことではありません。まずは C# コードをいくつか紹介します:
    コードをコピーします コードは次のとおりです: Word.Application w=new Word.Application();
    w.Visible=true;

    文字列パス=Application.StartupPath+"\template.docx";

    Word.Document d=w.Documents.Open(path) as Word.Document;

    Word.Fields flds=d.Fields;
    int len=flds.Count;

    foreach (Word.Field f in flds)
    {
    f.Select();
    int i=f.Index;
    w.Selection.TypeText("...");
    }

    C# コードは、前に示した PHP コード ベースとまったく同じであることがわかります。 C# は厳密に型指定された言語であるため、いくつかの型変換ステートメントが見られ、変数に明示的に型を割り当てる必要があります。

    コードタイプを使用すると、コードの自動プロンプト機能と自動コード補完機能を利用できるため、開発速度が大幅に向上します。


    PHP 開発を迅速化できるもう 1 つの方法は、Word マクロを使用することです。まず繰り返す必要があるアクションを実行し、それからマクロを使用して記録します。マクロは実際には Visual Basic であり、非常に簡単に PHP に変換することもできます。

    最も重要なことは、Office PIA の Microsoft の公式ドキュメント、特にドキュメント内の各 Office アプリケーションの名前空間が常に必要な最も重要なリファレンスになるということです。最もよく使用される 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
    • PowerPoint2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

    結論

    この記事では、PHP COM ライブラリと Microsoft Office Interop 機能を使用して Word ドキュメントを編集する方法を説明します。

    WindowsとOfficeは私たちの日常生活で広く使われていると言えます。 Windows プラットフォームで PHP を開発するプログラマーにとって、Office、Windows、および PHP の能力を知り、理解できることは非常に必要です。

    PHP の COM 拡張機能を使用すると、この組み合わせをマスターするための扉が開きます。

    プログラミングのこの部分に興味がある場合は、コメントを残してください。このトピックについてさらに記事を書くことを検討します。このアプローチを使用して、より実際のアプリケーション開発が行われることを本当に楽しみにしています。

Windows、PHP、Word


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

See all articles