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

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

WBOY
WBOYオリジナル
2016-07-25 08:45:00956ブラウズ

準備

まず、一般的な 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 までご連絡ください。