12

ヘッダー/フッターの「FIELD」を置き換える方法は?

例: ファイル名と日付を含む Word doc ファイル。ファイル パスの代わりに - [FilePath] の代わりに C://Documents/Location/Filename.doc 、[Date] の代わりに 18/07/2013。

任意のテキストを範囲に置き換えることができます。

foreach (Microsoft.Office.Interop.Word.Section section in wordDocument.Sections)
{
   section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.Replace(sourceDocPath, "[File Path]");

   section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.Replace(sourceDocPath, "[File Path]"); 
}

これはファイル名では問題なく機能しますが、日付では、置き換える形式を推測することはできません。これはすべて、置換する正確なフィールド情報を取得できないためです。

以下のコードも使用できません

wordApp.Selection.Find.Execute(ref textToReplace, ref typeMissing, 
        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing, 
        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing, 
        ref replaceTextWith, ref replaceAll, ref typeMissing, ref typeMissing, 
        ref typeMissing, ref typeMissing);

私が今見ている唯一の方法は、可能なすべての日付形式を処理して置き換えることですが、これは私にとって良いアプローチとは思えません。

Storyrange を使用して与えられたコメントに従って更新します。

[DATE] という正確なフィールド情報が得られません。ストーリーの範囲を反復処理すると、セクション情報に関する wdstorytype が得られます。フィールド情報に関するものではありません。

foreach (Microsoft.Office.Interop.Word.Range tmpRange in wordDocument.StoryRanges)
                    {
                        string strtype = tmpRange.StoryType.ToString();
                        tmpRange.Find.Text = "18/07/2013";
                        tmpRange.Find.Replacement.Text = "";
                        tmpRange.Find.Replacement.ParagraphFormat.Alignment =
                            Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphJustify;

                        tmpRange.Find.Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue;
                        object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;

                        tmpRange.Find.Execute(ref missing, ref missing, ref missing,
                            ref missing, ref missing, ref missing, ref missing,
                            ref missing, ref missing, ref missing, ref replaceAll,
                            ref missing, ref missing, ref missing, ref missing);
                    }

更新: ここで私を助けるもののように見えますが、機能していないようです。エクスポートする前に、ドキュメントオブジェクトに以下を使用させる方法を教えてください。

field.ShowCodes = true;
4

3 に答える 3

15

最後に、introp.wordに関する貧弱なドキュメントを調べた後、解決策を得ました

// Loop through all sections
foreach (Microsoft.Office.Interop.Word.Section section in wordDocument.Sections) {

    wordDocument.TrackRevisions = false; //Disable Tracking for the Field replacement operation

    //Get all Headers
    Microsoft.Office.Interop.Word.HeadersFooters headers = section.Headers;

    //Section headerfooter loop for all types enum WdHeaderFooterIndex. wdHeaderFooterEvenPages/wdHeaderFooterFirstPage/wdHeaderFooterPrimary;                          
    foreach (Microsoft.Office.Interop.Word.HeaderFooter header in headers)
    {
        Fields fields = header.Range.Fields;

        foreach (Field field in fields)
        {
            if (field.Type == WdFieldType.wdFieldDate)
            {
                field.Select ();
                field.Delete ();
                wordApplication.Selection.TypeText ("[DATE]");
            }
            else if (field.Type == WdFieldType.wdFieldFileName)
            {
                field.Select ();
                field.Delete ();
                wordApplication.Selection.TypeText ("[FILE NAME]");

            }
        }
    }

    //Get all Footers
    Microsoft.Office.Interop.Word.HeadersFooters footers = section.Footers;

    //Section headerfooter loop for all types enum WdHeaderFooterIndex. wdHeaderFooterEvenPages/wdHeaderFooterFirstPage/wdHeaderFooterPrimary; 
    foreach (Microsoft.Office.Interop.Word.HeaderFooter footer in footers)
    {
        Fields fields = footer.Range.Fields;

        foreach (Field field in fields)
        {
            if (field.Type == WdFieldType.wdFieldDate)
            {
                field.Select ();
                field.Delete ();
                wordApplication.Selection.TypeText ("[DATE]");
            }
            else if (field.Type == WdFieldType.wdFieldFileName)
            {
                field.Select ();
                field.Delete ();
                wordApplication.Selection.TypeText ("[FILE NAME]");

            }
        }
    }
}
于 2013-07-19T04:53:57.530 に答える
3

ジェイ、

少し遅いかもしれませんがとにかく...

コメントできないのでお答えします。

現在受け入れられている回答に関して、いつかあなた(または他の人)に役立つかもしれないことはほとんどありません。

  1. 前回のUpdateからの質問に答えるには、次のようなものを使用してフィールド コードをオンにし、[検索] を使用してフィールドのものを検索できます。

    wordDocument.ActiveWindow.View.ShowFieldCodes = true;
    

    したがって、検索する前にそれをオンにし (既にオンになっていない場合)、完了したら元に戻します。

  2. あなたが自分自身に提供したソリューションは、ほとんどのシナリオで機能し、私はしばらくの間そのようなものを使用しました. しかし、2000 セクションのドキュメントに出くわしました。そして、これらのセクションをループすると、同じヘッダーを何度もループします。私の場合、ドキュメントの処理がタイムアウトしました(許容可能な処理時間を考えると)

  3. StoryRanges を使用したソリューションは、より良いアプローチになる可能性があります (フィールド コードの切り替えと組み合わせます
    ) .wwco.com/blog/2010/07/03/find-and-replace-in-word-using-c-net/

  4. 覚えておくべきことの 1 つは、Shapes of Range で検索することを忘れないことです。

  5. フィールドを置き換える方法を理解したと思います。いずれにせよ、実際には単純なテキストをフィールドに変換しています。

    Find.Execute がヒットすると、範囲が選択されます。

    theDoc.Fields.Add(range, WdFieldType.wdFieldDocVariable, "myDocVar");
    

TL;DR: ドキュメントの形式が予測可能で、セクションの数が少なく、テキストが図形内にない場合は、これらすべてについて心配する必要はありません。

于 2016-12-06T00:40:34.413 に答える
1
object replaceAll = MSWord.WdReplace.wdReplaceAll;
foreach (Microsoft.Office.Interop.Word.Section section in oDoc.Sections)
{
    Microsoft.Office.Interop.Word.Range footerRange =  section.Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    footerRange.Find.Text = "Some Text";
    footerRange.Find.Replacement.Text = "Replace Text";
    footerRange.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceAll, ref missing, ref missing, ref missing, ref missing);
}

oDoc は、現在のドキュメントを持つ「MSWord.Document」オブジェクトです。

oDoc = oMSWord.Documents.Open(ref "DocPath", ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

次に、現在の oDoc オブジェクトの「セクション」にループを適用します。「セクション」に基づいて、フッターの範囲を取得します。次に、フッターのテキストを見つけて置き換えることができます。

于 2016-02-03T07:43:21.067 に答える