代码之家  ›  专栏  ›  技术社区  ›  addohm

具有多个字段的Word互操作页眉和页脚

  •  1
  • addohm  · 技术社区  · 6 年前

    我正在尝试解决如何更新/更改模板上的字段。到目前为止,我发现的每一个好的信息都会导致当前的页眉或页脚被完全覆盖。很明显。问题是我找不到如何特别修改页脚中的某些字段,而不是整个页脚。

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

    在这段代码中,我试图让“机密”这个词重写中间的字段。当前中间字段为空。左边和右边的字段分别是页码和日期。一旦我运行代码,它就会被“机密”代码所取代。它还完全删除了作为页脚背景色的形状。

    enter image description here 止动片位于3.25英寸和6.5英寸处

    enter image description here

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

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

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

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  0
  •   addohm    6 年前

    我只是继续做,并手动取得最好的结果。

            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;
            }
    
        2
  •  0
  •   Cindy Meister Prabhuprasad NG    6 年前

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

    关键是找到两个制表位 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;
        }
    }