【问题标题】:Word Interop Header & Footer with Multiple Fields具有多个字段的 Word 互操作页眉和页脚
【发布时间】:2018-12-18 16:11:32
【问题描述】:

我正在尝试研究如何更新\更改模板上的字段。到目前为止,我发现的每条好消息都导致当前页眉或页脚被完全覆盖。这很明显。问题是我找不到如何专门修改页脚中的某些字段而不是整个页脚。

        // Set headers
        foreach (Word.Section section in doc.Sections)
        {
            Word.Range headerRange = section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
            headerRange.Fields.Add(headerRange, Word.WdFieldType.wdFieldPage);
            headerRange.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
        }

        // Set footers
        foreach (Word.Section wordSection in doc.Sections)
        {
            Word.Range footerRange = wordSection.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
            footerRange.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
            footerRange.Font.ColorIndex = Word.WdColorIndex.wdDarkRed;
            footerRange.Font.Size = 20;
            footerRange.Text = "Confidential";
        }

在这段代码中,我试图让“机密”一词覆盖中间字段。目前中间字段为空白。左右字段分别是页码和日期。一旦我运行代码,它就会被“机密”代码替换。它还完全删除了作为页脚背景颜色强调的形状。

制表位在 3.25 英寸和 6.5 英寸处

如何修改现有字段?这样会删除形状吗?

更新: 以下代码是在我觉得自己在兜圈子之前得到的。这一切看起来都非常有序,就好像您在物理上键入\编辑文档一样。伊克。不管怎样,这很接近。但是由于某种原因,格式被忽略了,我不能让它只应用于中心文本。另外,如果我取消注释日期字段行,整个页脚都会被删除。

        // Set footers
        foreach (Word.Section wordSection in doc.Sections)
        {
            Word.Range footerRange = wordSection.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
            footerRange.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
            footerRange.Paragraphs.TabStops.Add(wordApp.InchesToPoints(3.25F), Word.WdTabAlignment.wdAlignTabCenter);
            footerRange.Paragraphs.TabStops.Add(wordApp.InchesToPoints(6.5F), Word.WdTabAlignment.wdAlignTabRight);

            footerRange.Fields.Add(footerRange, Word.WdFieldType.wdFieldPage, "\t", true);
            footerRange.Font.ColorIndex = Word.WdColorIndex.wdDarkRed;
            footerRange.Font.Size = 20;
            footerRange.Text = "\tCONFIDENTIAL\t";
            footerRange.InsertBefore("01-DEC-18");
            //footerRange.Fields.Add(footerRange, Word.WdFieldType.wdFieldDate);
        }

【问题讨论】:

  • 请详细说明如何识别“中间字段”?如果这是一个“标准”页脚,它使用制表符和制表位来对齐内容。如果是这种情况,打开非打印字符的显示可以帮助我们在屏幕截图中看到这一点。如果没有识别信息,就只能猜测什么可行……
  • 我还提醒您,根据网站政策,一个问题应该只包含一个查询,而不是更多。请为第二个查询发布一个单独的问题。并包括所有详细信息,例如日期/时间字段在文档中的位置...
  • @CindyMeister 我更新了图片。
  • 感谢您在半夜提供的最新信息。我的方法贴在下面。

标签: c# .net ms-word office-interop


【解决方案1】:

以下内容用指定格式替换“机密”以替换文档中每个主要页脚范围的第二部分中当前的内容。 (“第二部分”是指第一个和第二个制表位之间的内容)。

关键是找到两个制表位的Range 位置,并将内容的目标Range 设置在第一个制表位之后的一个字符和第二个制表位之前的一个字符处。

Word.Range ftr = null;
Word.Paragraph para = null;
Word.Range paraRng = null;
Word.Range tStop1 = null;
Word.Range tStop2 = null;
int nrTabs;

foreach (Word.Section sec in doc.Sections)
        {
    ftr = sec.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    para = ftr.Paragraphs[1];
    nrTabs = para.TabStops.Count;
    if (nrTabs == 2)
    {
        paraRng = para.Range;
        tStop1 = paraRng.Duplicate;
        tStop1.Find.Execute("^t", missing, missing, missing, missing, missing,
            missing, missing, Word.WdFindWrap.wdFindStop);
        tStop1.MoveStart(Word.WdUnits.wdCharacter, 1); //put it after the tab character
        tStop2 = tStop1.Duplicate;
        tStop2.Find.Execute("^t", missing, missing, missing, missing, missing,
            missing, missing, Word.WdFindWrap.wdFindStop);
        tStop2.MoveEnd(Word.WdUnits.wdCharacter, -1); //put it before the tab character
        tStop1.End = tStop2.End;
        tStop1.Text = "Confidential";
        tStop1.Font.ColorIndex = Word.WdColorIndex.wdDarkRed;
        tStop1.Font.Size = 20f;
    }
}

【讨论】:

  • if 比较失败。 nrTabs 最终是 13。这很有趣,因为模板当前不包含制表位 - 至少在我以编程方式添加它们之前不会。我希望我更了解这个图书馆。如何快速确定软件认为 ftr.Paragraph[1] 是什么?将 if 评估更改为 13 - 语句的其余部分会更改页脚。短语“机密”最终位于页脚的最左侧。那是唯一的事情。你有工作日期字段代码吗?
  • 嗯。此方法基于使用默认页脚样式的假设。我很难想象为什么(以及如何)页脚将包含 13 个制表位。在你的位置(并且不比我知道更多)我会在 Word 中打开该模板并非常仔细地检查它。任何解决方案都需要基于它运行的文档,只有提出请求的人才能分析。要找出 ftr.Paragraphs[1] 是什么,我会做 ftr.Paragraphs[1].Range.Select();并让代码结束(注释掉其他所有内容),以便我可以看到它。或者我会在 VBA 中测试我的基本概念(更舒适和宽容)
  • 我不知道你所说的“工作日期字段代码”是什么意思,但确实认为这是一个不同的问题会更好,因为它与“......我不能了解如何专门修改页脚中的某些字段而不是整个页脚。”
  • 如果这是一个正在设置的模板,我会在需要由代码更改的位置放置一个书签。我的假设是这可能是“任何”文档,因此需要更通用的方法。
【解决方案2】:

我只是继续手动操作以获得最佳结果。

        string tab = "\t";
        string note = "Confidential";
        string dt = DateTime.Today.Date.ToString("d");
        int pg = 0;
        // Set footers
        foreach (Word.Section wordSection in doc.Sections)
        {
            pg += 1;
            Word.Range footerRange = wordSection.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
            footerRange.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
            footerRange.Paragraphs.TabStops.Add(wordApp.InchesToPoints(3.25F), Word.WdTabAlignment.wdAlignTabCenter);
            footerRange.Paragraphs.TabStops.Add(wordApp.InchesToPoints(6.5F), Word.WdTabAlignment.wdAlignTabRight);
            string footerString = $"pg. {pg.ToString()}{tab}{note}{tab}{dt}";
            footerRange.Text = footerString;
        }

【讨论】:

  • Word 确实有一个页脚样式,它会自动应用于文档中的所有页脚。该样式包含两个制表位。如果这些不是您想要/需要的,那么更改样式定义比将制表位直接添加到页脚范围“更好”。一方面,您最终可能会得到四个而不是两个制表位。另一方面,代码将更有效率,因为更改只需应用一次(对样式),而不是对每个部分单独应用。而且,如果需要(再次)更改,可以在一次(样式)完成,而不是(再次)更改所有部分
  • 另外,在这段代码中,页码在所有页面上都是静态的,而不是一个会自动增加的 Word 字段。上面的代码只有在每一页都是一个部分并且只有一页长度时才有意义......
  • @CindyMeister 这就是我想要的,本质上是我低效地重新创建的。相信我,我试图不惜一切代价避免手动操作,这让我花了一天的大部分时间。我想用 Word 自动化的方式来做这件事,但我就是找不到资源让我去那里。我很乐意使用您发布的代码来看看我想出了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2021-07-21
  • 2011-03-19
  • 2011-04-07
  • 2018-08-17
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多