web-dev-qa-db-ja.com

XMLファイルのデータを使用してWord文書(docx)を生成する/テンプレートに基づいてXMLをWord文書に変換する

Word文書に入力する必要があるデータを含むXMLファイルがあります。

XMLファイルからデータを取り込み、出力ドキュメントを作成するためのベースラインとして使用できるテンプレートを定義する方法を見つける必要があります。

これを行うには2つの方法があると思います。

  1. 「テンプレート」となるXSLTファイルを作成し、これを使用してXMLファイルと組み合わせて使用​​してWord文書を生成します。
  2. Wordのコンテンツコントロールを使用してテンプレートドキュメントを作成し、何らかの方法でXMLファイルにマップします。

どちらの方法を実装するかの詳細がわからないだけです。または、このタスクを実行する別の簡単な方法があるかどうかわからない。

誰かがこれを実装する方法の例を示すことができますか。簡単な例で十分です。

コーディングにはC#が好きです。私はWord 2016を使用していますが、Word 2007からWord 2016までの互換性が必要です。ユーザーはこれらのバージョンを使用するため、可能であればその間のすべてのものを使用します。ありがとうございました!

5
slayernoah

コンテンツコントロールを使用してドキュメントを生成する方法と、XMLからコンテンツコントロールにデータを入力する方法を理解しました。これを2つの部分に分けました。

  • パート1:ドキュメント生成用のテンプレートドキュメントを作成する
  • パート2:C#のコードを使用して、テンプレートに基づいてドキュメントを生成する

パート1:ドキュメント生成用のテンプレートドキュメントを作成する

  1. ドキュメント生成用のWordテンプレートを作成できるサンプルXMLを作成します。できれば、それほど複雑でないバージョンから始めて、それを理解してください。

テストには次のXMLを使用しました。テストのために、繰り返しセクション、写真などを持っていませんでした。

<?xml version="1.0" encoding="utf-8"?>
<mydata xmlns="http://CustomDemoXML.htm">
    <field1>This is the value in field1 from the XML file</field1>
    <field2>This is the value in field2 from the XML file</field2>
    <field3>This is the value in field3 from the XML file</field3>
</mydata>

注1:これは単なるサンプルXMLになりますWordテンプレート。この同じ形式の実際のデータを含むXMLファイルは、テンプレートからWord文書を生成するときに後で適用できます。

注2xmlns属性には文字通り必要なものを含めることができ、httpで始まるURLである必要はありません。

サンプルXMLファイルを任意の場所に保存して、作成するテンプレートにインポートできるようにします。

  1. Wordのコピーで[Developer]タブが有効になっていることを確認してください[File-> Options-> Customize Ribbon-> Customize the Ribbonの下で、 Developerが選択されている-> OK]。詳細: 方法:リボンに[開発]タブを表示する

  2. 文書生成のテンプレートとなる新しいWord文書を作成します(または既存のWord文書を使用します)。

  3. Developerタブで、XML Mapping Paneをクリックします。これにより、ドキュメントの右側にあるXML Mapping Paneが開きます。

  4. [XMLマッピング]ペインで、[Custom XML Part]ドロップダウンを選択します-> [(Add new part)]を選択します。

  5. ステップ1-> Openで保存したXMLファイルを選択します。

  6. [XMLマッピング]ペインで[Custom XML Part]ドロップダウンを選択します->カスタムXMLファイルのxmlns属性にあるテキストが含まれるアイテムを選択します。上記のサンプルファイルを使用する場合、http://CustomDemoXML.htmになります。

  7. 静的テキストをWord文書に追加し、その隣にPlain Text Content Controlを追加します(Developerタブ-> Controlsセクション。追加する必要があるすべてのフィールドについて繰り返します。

上記のサンプルXMLには、次のWord文書がありました。

sample Word document template

  1. 最初のPlain Text Content Controlをクリックします-> XMLマッピングペインで、そのコンテンツコントロールにマップするフィールドを右クリックします-> Map to Selected Content Controlをクリックします。マップするすべてのフィールドに対して繰り返します。

注:または、ステップ#8の開発者タブからPlain Text Content Controlアイテムを追加する代わりに、目的のフィールドを右クリックすることもできます。 [XMLマッピング]ペインにマップするには-> [Insert Content Control]をクリックし、[Plain Text]をクリックします。

同様に、チェックボックス、日付ピッカー、繰り返しセクション(ネストされた繰り返しセクションもサポートしています!-Word 2013以降)などの他のタイプのコントロールを追加し、XMLからネイティブのWord機能のみを使用してサードパーティなしでデータをXMLからマップすることもできますツール!

  1. テンプレートドキュメントを保存します。

パート2:C#のコードを使用して、テンプレートに基づいてドキュメントを生成する

これは、Microsoftの推奨 OpenXML SDK を使用して、実際のデータを含むXMLファイルを使用してドキュメントを生成します。

  1. XMLファイルを作成するか、既存のXMLファイルを開いて、上記で作成したテンプレートからドキュメントを生成します。これは、テンプレートの作成に使用されるサンプルXMLファイルと同じ形式である必要があります。

  2. OpenXML SDKを使用して、ドキュメントからCustomXMLPart要素を削除します。この例では、ドキュメント内で他のカスタムXMLパーツが使用されていないことを前提としています。複雑なシナリオでは、必要に応じて特定のXMLパーツを削除できます。

  3. OpenXML SDKを使用して、上記の手順1のXMLファイルに基づいて新しいCustomXMLPartを追加します。

テンプレートのサンプルデータを実際のデータを含むXMLファイルのデータで「更新」/「再読み込み」する必要があるサンプルコードを次に示します(ドキュメントの生成に使用されるXMLファイルが既に作成および保存されていると仮定)。

using System.IO;
using DocumentFormat.OpenXml.Packaging;

namespace SampleNamespace
{
    public static class SampleClass
    {
        public static void GenerateDocument()
        {
            string rootPath = @"C:\Temp";
            string xmlDataFile = rootPath + @"\MyNewData.xml";
            string templateDocument = rootPath + @"\MyTemplate.docx";
            string outputDocument = rootPath + @"\MyGeneratedDocument.docx";

            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templateDocument, true))
            {
                //get the main part of the document which contains CustomXMLParts
                MainDocumentPart mainPart = wordDoc.MainDocumentPart;

                //delete all CustomXMLParts in the document. If needed only specific CustomXMLParts can be deleted using the CustomXmlParts IEnumerable
                mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts);

                //add new CustomXMLPart with data from new XML file
                CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
                using (FileStream stream = new FileStream(xmlDataFile, FileMode.Open))
                {
                    myXmlPart.FeedData(stream);
                }
            }

        }
    }
}

それでおしまい!

13
slayernoah

ここで、XSLTをテンプレートとして使用してWord文書を生成する詳細なガイドを見つけました: XSLTとOpen XMLを使用してWord 2007文書を作成する

この記事はWord 2007向けですが、Word 2016でも完全に機能します。

このメソッドの唯一の問題は、後でテンプレートを変更する必要がある場合、xsltファイルを更新するのに多大な労力が必要であり、Word自体とドキュメントの実際のXMLで更新できないため、ユーザーフレンドリーではありません操作する必要があります。

プラス面では、ドキュメント生成は非常に柔軟であり、XSLを介してすべてのパワーを使用できます(foreach、変数、if条件など)。

4
slayernoah