Adding page number in word header table C#

心不动则不痛 提交于 2021-02-05 08:08:33

问题


I have created a 1x3 table as my header in word. This is how I want it to look like.

LeftText MiddleText PageNumber:

I want the PageNumber cell to look like this -

Page: X of Y

I have managed to do cell (1,1) and (1,2). I found this to help me with cell (1,3) but it is not working as I like. I know how to get the total count of the document. I'm not sure how to implement it properly.

Range rRange = restheaderTable.Cell(1, 3).Range;
rRange.End = rRange.End - 1;
oDoc.Fields.Add(rRange, Type: WdFieldType.wdFieldPage, Text: "Page Number: ");

I can't even get the Text "Page Number: " to display in the cell. All it has is a number right now.


回答1:


The field enumeration you're looking for is WordWdFieldType.wdFieldNumPages.

The next hurdle is how to construct field + text + field as Word doesn't behave "logically" when things are added in this order. The target point remains before the field that's inserted. So it's either necessary to work backwards, or to move the target range after each bit of content.

Here's some code I have the demonstrates the latter approach. Inserting text and inserting fields are in two separate procedures that take the target Range and the text (whether literal or the field text) as parameters. This way the field code can be built up logically (Page x of n). The target Range is returned from both procedures, already collapsed to its end-point, ready for appending further content.

Note that I prefer to construct a field using the field's text (including any field switches) rather than specifying a field type (the WdFieldType enumeration). This provides greater flexibility. I also highly recommend setting the PreserveFormatting parameter to false as the true setting can result in very odd formatting when fields are updated. It should only be used in very specific instances (usually involving linked tables).

private void btnInsertPageNr_Click(object sender, EventArgs e)
{
    getWordInstance();
    Word.Document doc = null;
    if (wdApp.Documents.Count > 0)
    {
        doc = wdApp.ActiveDocument;
        Word.Range rngHeader = doc.Sections[1].Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
        if (rngHeader.Tables.Count > 0)
        {
            Word.Table tbl = rngHeader.Tables[1];
            Word.Range rngPageNr = tbl.Range.Cells[tbl.Range.Cells.Count].Range;
            //Collapse the range so that it's within the cell and 
            //doesn't include the end-of-cell markers
            object oCollapseStart = Word.WdCollapseDirection.wdCollapseStart;
            rngPageNr.Collapse(ref oCollapseStart);
            rngPageNr = InsertNewText(rngPageNr, "Page ");
            rngPageNr = InsertAField(rngPageNr, "Page");
            rngPageNr = InsertNewText(rngPageNr, " of ");
            rngPageNr = InsertAField(rngPageNr, "NumPages");
        }
    }
}

private Word.Range InsertNewText(Word.Range rng, string newText)
{
    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    rng.Text = newText;
    rng.Collapse(ref oCollapseEnd);
    return rng;
}

private Word.Range InsertAField(Word.Range rng,
                      string fieldText)
{
    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    object unitCharacter = Word.WdUnits.wdCharacter;
    object oOne = 1;
    Word.Field fld = rng.Document.Fields.Add(rng, missing, fieldText, false);

    Word.Range rngField = fld.Result;
    rngField.Collapse(ref oCollapseEnd);
    rngField.MoveStart(ref unitCharacter, ref oOne);
    return rngField;
}


来源:https://stackoverflow.com/questions/57228742/adding-page-number-in-word-header-table-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!