通过 C# Interop 将空字段添加到 word 文档

Add empty fields to a word document via C# Interop

我正在尝试通过循环将几个空字段(即 ctrl+F9 快捷方式)添加到 word 文档(通过 VSTO),但由于某些原因只有最后一个出现在文档中。

谁能帮帮我?

这是我使用的代码:

        Document doc = Globals.ThisAddIn.Application.ActiveDocument;
        if (doc == null)
            return;

        for (int i = 0; i < 5; i++)
        {
            Paragraph para = doc.Paragraphs.Add();
            object fieldType = WdFieldType.wdFieldEmpty;
            object text = "test" + i;
            object preserve = false;
            Field f = doc.Fields.Add(para.Range , ref fieldType, ref text, ref preserve);

        }

输出为:

{ test4 } 

MSDN Reference link here

那是因为每一段都会覆盖前一段。
以下示例在文档开头创建新段落

using Microsoft.Office.Interop.Word;

namespace ConsoleWord
{
    class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            for (int i = 0; i < 5; i++)
            {
               var  range = doc.Range(0, 0);

                object text = "test" + i;
                object fieldType = WdFieldType.wdFieldAuthor;

                Paragraph para = doc.Paragraphs.Add(range);
                doc.Fields.Add(range, ref fieldType, ref text);

            }
            doc.SaveAs2(@"C:\tmpc\aa.docx");
        }
    }
}

它工作得很好,但很难看到。问题是所有 5 个字段都在彼此之上。可能是由于即将停止而引起的,并且不清楚您想如何进行。任意地,将此代码附加到 for 循环主体以使字段更加可见:

f.ShowCodes = true;
para.Range.InsertAfter("\r\n");

concat Environment.NewLine 到循环内的文本

如果你想在循环中显示所有文本对象,那么试试这个....`

    object text = "";
    for (int i = 0; i < 5; i++)
    {
        Paragraph para = doc.Paragraphs.Add();
        object fieldType = WdFieldType.wdFieldEmpty;
        if(text.toString() != "")
        text = text + "test" + i;
        else
        text = "test" + i;
        object preserve = false;
    }
    Field f = doc.Fields.Add(para.Range , ref fieldType, ref text, ref preserve);

输出: { 测试1 测试2 测试3 测试4 }

或者您也可以尝试在任何需要的地方有策略地使用 Field.Update() 以更新正在填充的字段。有时是缓冲问题。

foreach (Field field in doc.Fields)
field.Update();

所以你可以试试....

for (int i = 0; i < 5; i++)
    {
        Paragraph para = doc.Paragraphs.Add();
        object fieldType = WdFieldType.wdFieldEmpty;
        object text = "test" + i;
        object preserve = false;
        Field f = doc.Fields.Add(para.Range , ref fieldType, ref text, ref preserve);
        foreach (Field field in doc.Fields)
          field.Update();
    }