【问题标题】:word interop / adding new field to footer deletes existing fields单词互操作/向页脚添加新字段会删除现有字段
【发布时间】:2013-11-20 20:00:50
【问题描述】:

我一直在使用互操作来编辑现有的 Word 文档。我的问题是;我需要在文档页脚中添加一个新字段,令我惊讶的是,它删除了现有的页脚字段,因此只保留了新添加的字段。没有关于它的明确文档,结果相当出乎意料。以下是我的代码:

foreach (Microsoft.Office.Interop.Word.Section wordSection in wordDocument.Sections)
        {
            Microsoft.Office.Interop.Word.HeadersFooters footers = wordSection.Footers;
            foreach (HeaderFooter footer in footers)
            {
                footer.Range.Select();
                Field f = appWord.ActiveWindow.Selection.Fields.Add(appWord.ActiveWindow.Selection.Range);
                appWord.Selection.TypeText(footerText);
            }
        }

【问题讨论】:

  • 好的,我认为如果您能提供一个现有页脚包含的内容以及您希望它看起来像什么的示例,将会有所帮助。例如,假设您现有的页脚在页脚的左侧包含文本“myexistingfooter”。你的页脚应该是什么?

标签: c# ms-word interop


【解决方案1】:

您描述的是预期行为,因为“.Add”不是“.Append”或“.InsertAfter”,您可能有理由希望该字段被添加到选择的末尾。如果您在 Word 中选择一段文本并发出 VBA 命令

Selection.Fields.Add Selection.Range

你会看到很多相同的东西。

您需要做的是确定需要插入字段的精确范围,然后将其添加到那里。理想情况下,完全避免使用选择。因此,如果您需要该字段位于页脚的开头,您可以从以下 VBA 示例开始并将其翻译成 C#(抱歉,我现在没有精力)。

Sub insertFieldAtStartOfSec1Footers()
Dim footer As HeaderFooter
Dim rng As Word.Range
For Each footer In ActiveDocument.Sections(1).Footers
  Set rng = footer.Range
  rng.Collapse wdCollapseStart
  ' Insert a simple SECTION field 
  rng.Fields.Add rng, WdFieldType.wdFieldEmpty, "SECTION", False
  Set rng = Nothing
Next
End Sub

【讨论】:

  • Field 部分甚至没有必要。 footer.Range.Text = footer.Range.Text + "New Text";footer.Range.InsertAfter("New Text"); 就足够了(正在写我自己的答案,但你的答案基本相同,所以...+1 :))。
  • @varocarbas - 如果您想插入一个字段,而不仅仅是一段文本,则字段部分是两个主要选项之一。但不确定 .typetext() OP 问题中的行是否是 OP 真正想要做的,或者只是某种人工制品(例如测试代码):-)
  • 是的,我知道他的意图是添加一个字段;虽然,从他的代码来看,在我看来,一个简单的文本添加就足够了(实际上,这就是代码正在做的事情:创建字段但随后忽略它并只是添加文本;尽管不尊重现有的)。这就是为什么我的建议(更关注真正的意图而不是实际的代码/请求......从来没有真正喜欢过 Fields)。
  • @bibadia 我意识到范围类。但是,当我尝试您的代码时,我的 word 文件中出现“错误!书签未定义”。我使用:object direction = WdCollapseDirection.wdCollapseStart; r.Collapse(direction); Field f = r.Fields.Add(r, WdFieldType.wdFieldEmpty, footerText);
  • @varocarbas 我想要的是有两个单独的字段,一个对齐到中心,另一个对齐到左边。我尝试了 Field 和 TypeText 但没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多