1

我正在尝试使用 C# 4 从 Word 文档中删除页脚。页脚如下所示:

第 1 页 2012 年 4 月 18 日

实际上,这是在 Word VBA 中显示时的页脚文本:

第 1 页 ( 2012 年 4 月 18 日

“Page 1”和“April”之间实际上有一个项目符号字符。最后,页脚应如下所示:

2012 年 4 月 18 日

无论如何,在 Word VBA 中,我可以使用以下代码来做到这一点:

Dim rngFtr As Range
Set rngFtr = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range
rngFtr.Collapse wdCollapseStart
rngFtr.MoveStart wdParagraph, 1
rngFtr.MoveEnd wdWord, 4
rngFtr.Delete

我在 C# 中尝试了同样的事情,但它完全删除了页脚。这是我在 C# 4 中的代码: using Microsoft.Office.Interop.Word;

Microsoft.Office.Interop.Word.Application ap = new Microsoft.Office.Interop.Word.Application();
Document doc = ap.Documents.Open(docFile.FullName, ReadOnly: false, Visible: false);
doc.Activate();
Microsoft.Office.Interop.Word.Range ftrRng =
    doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
ftrRng.Collapse(WdCollapseDirection.wdCollapseEnd);
ftrRng.MoveStart(WdUnits.wdParagraph, 1);
ftrRng.MoveEnd(WdUnits.wdWord, 4);
ftrRng.Delete();

ap.Documents.Close(SaveChanges: false, OriginalFormat: false, RouteDocument: false);

((_Application) ap).Quit(SaveChanges: false, OriginalFormat: false, RouteDocument: false);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ap);

我什至尝试了其他方法来摆脱“第 1 页”和项目符号,例如:

var replaceText = string.Empty;
object mis = System.Type.Missing;
var targetFooterText =
    doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.ToString().Substring(1, 10);
doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Find.Execute(
    targetFooterText,
    ref mis, ref mis, ref mis, ref mis, ref mis, ref mis, ref mis, ref mis,
    replaceText,
    ref mis, ref mis, ref mis, ref mis, ref mis);

这没有任何作用。

请让我知道我做错了什么。先感谢您。

我不确定这是否重要,但项目符号是 Unicode-2022。

这是文档页脚的屏幕截图。我只需要删除文本“第 1 页”和项目符号并将其替换为日期。其余的应该保持原样。

在此处输入图像描述

4

2 回答 2

0

试试下面的例子,它执行以下操作:

  • 从页脚范围中提取所有文本
  • 从文本中删除“页面”字符串
  • 将页脚范围文本设置为前一个值减去“页面”

        using Word = Microsoft.Office.Interop.Word;
    
        Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;
    
        Word.Range footerRange =
            document.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    
        string rangeText = footerRange.Text;
    
        if (!String.IsNullOrEmpty(rangeText) && rangeText.Contains("Page"))
        {
            //Now set the footer Range Text to the new value minus the "Page"
            //Note: Edit as required because the page number may not always be one character
            string newValue = rangeText.Remove(rangeText.IndexOf("Page"), 6);
            footerRange.Text = newValue;
        }
    
于 2012-04-20T06:19:15.273 回答
0

经过一番挖掘和使用 Word VBA 后,我找到了替代解决方案。这是我的最终代码:

Microsoft.Office.Interop.Word.Application ap = new Microsoft.Office.Interop.Word.Application();

Document doc = ap.Documents.Open(docFile.FullName, ReadOnly: false, Visible: false);
doc.Activate();

// These 3 lines did the trick.
doc.ActiveWindow.ActivePane.View.SeekView = WdSeekView.wdSeekPrimaryFooter;
doc.Application.Selection.MoveRight(WdUnits.wdCharacter, 1);
doc.Application.Selection.Delete(WdUnits.wdCharacter, 9);

ap.Documents.Close(SaveChanges: false, OriginalFormat: false, RouteDocument: false);

((_Application) ap).Quit(SaveChanges: false, OriginalFormat: false, RouteDocument: false);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ap);
于 2012-04-24T14:50:43.470 回答