通过 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 }
那是因为每一段都会覆盖前一段。
以下示例在文档开头创建新段落
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();
}
我正在尝试通过循环将几个空字段(即 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 }
那是因为每一段都会覆盖前一段。
以下示例在文档开头创建新段落
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();
}