13

プレースホルダーとして何かが必要です。私は最初、解決策としてコンテンツコントロールを検討しましたが、いくつか問題があります。

次に、CustomXMLを.docxに追加することを検討しましたが、i4i訴訟のためにそれを避けました。

次に、OpenXML SDK 2.0を使用してコンテンツコントロールのテキストを単純に変更することにしましたが、そのようにマークされていても、コンテンツコントロールは消えません。単語の中で起こらない限り、テキストが変わったことを知らないと思います。

CCを削除して代わりにテキストを配置することもできますが、CCがもたらす可能性のあるフォーマットとスタイルに問題があり、コンテンツコントロールの目的に反することもあります。

それから、Wordが認識できる自分のプレースホルダーを定義できるかどうか疑問に思い始めました。おそらくビルディングブロックを通して。OpenXMLを使用して簡単に見つけられ、どういうわけかタグ付け可能である以外は何もする必要がないので、何に置き換えるかがわかります。ビルディングブロックで何ができるかはよくわかりませんが、実行可能であることを望んでいます。

どのソリューションが私に最適かはわかりませんが、必要なのは次のとおりです。

a)テンプレートに簡単に配置できるもの。おそらく、事前定義されたコンテンツコントロールのプレースホルダーで、好きな場所に配置してスタイルを設定できます。

b)データが追加されると、すべてのプレースホルダーが削除され、再度変更されることはありません。プレースホルダーで定義されたスタイル/フォーマットを保持します。

要約すると、私はどちらかに答える必要があります

OpenXML SDKでコンテンツコントロールを編集して、テキストが追加された後に削除されるようにするにはどうすればよいですか。

-また-

Wordドキュメント用に独自のカスタムOpenXMLタグを定義して、それを置き換えることはできますか?

4

3 に答える 3

7

多分これはあなたを助けることができます、

private void DeleteSdtBlockAndKeepContent(MainDocumentPart mainDocumentPart, string sdtBlockTag)
    {
        List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList();
        SdtBlock sdtA = null;

        foreach (SdtBlock sdt in sdtList)
        {
            if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag)
            {
                sdtA = sdt;
                break;
            }
        }


        OpenXmlElement sdtc = sdtA.GetFirstChild<SdtContentBlock>();
        OpenXmlElement parent = sdtA.Parent;

        OpenXmlElementList elements = sdtc.ChildElements;

        var mySdtc = new SdtContentBlock(sdtc.OuterXml);

        foreach (OpenXmlElement elem in elements)
        {

            string text = parent.FirstChild.InnerText;
            parent.Append((OpenXmlElement)elem.Clone());
        }

        sdtA.Remove();
    }
于 2010-08-19T08:39:56.037 に答える
1

OpenXML SDK を使用して ContentControl/SDT を変更したときに ContentControl/SDT を自動的に削除するソリューションにのみ関心があるのか​​、それともコンテンツがプログラムまたはユーザーによって変更された後にそれを消したいのか、あなたの質問からはわかりません。

前者の場合は、ビレルが提案したように、自分で削除する必要があると思います。後者の場合は、次のプロパティを確認する必要があります: ContentControl.Temporary ("ユーザーがコントロールに入力したとき、またはコントロール内のテキストがプログラムによって変更されたときに、ContentControl は自動的に削除されます。ContentControl がドキュメントから自動的に削除されると、コントロール内のテキストはドキュメント内に残ります。")

于 2011-12-30T00:44:40.377 に答える
1

フィールドの使用を見てみましょう。差し込み印刷フィールドは、まさにこの目的のために設計されています。

于 2011-06-10T01:41:11.103 に答える