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

时间:2017-04-13 14:49:16

标签: c# ms-word vsto

我正在尝试通过循环将几个空字段(即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

4 个答案:

答案 0 :(得分:2)

它工作正常,但很难看到。问题是所有5个字段都在彼此之上。也许是因为很快就停下来而且你不清楚你想怎么做。任意地,将此代码附加到for循环体以使字段更加可见:

print(..)

答案 1 :(得分:1)

那是因为每个段落都覆盖了前一个段落 以下示例在文档的结尾处创建新段落

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");
        }
    }
}

答案 2 :(得分:0)

Environment.NewLine连接到循环中的文本

答案 3 :(得分:0)

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

    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);

输出: {test1 test2 test3 test4}

或者您也可以尝试使用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();
    }