如何在 NPOI - Docx 中添加与默认页脚不同的第一页页脚?

问题描述

我正在使用 NPOI 2.5.2 生成一个 docx 文件,并且我坚持使用第一页的页眉/页脚。 我想要一个第一页自定义页脚并从第二页开始编号。

这是我的第一页页脚代码

// First page
doc.Document.body.sectPr = new CT_SectPr();
var footer = new CT_Ftr();
var footerParagraph = footer.AddNewP();
footerParagraph.AddNewR().AddNewT().Value = $"FirsT PAGE CUSTOM FOOTER";
var footerPar = new XWPFParagraph(footerParagraph,doc);
var parsFooter = new XWPFParagraph[1];
parsFooter[0] = footerPar;
var headerfooterPolicy = doc.GetheaderfooterPolicy();
if (headerfooterPolicy == null)
    headerfooterPolicy = doc.CreateheaderfooterPolicy();
headerfooterPolicy.CreateFooter(XWPFheaderfooterPolicy.FirsT,parsFooter);

这是我的带有页码认页脚代码

// Other pages
footerParagraph = footer.AddNewP();
footerParagraph.AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.begin;
footerParagraph.AddNewR().AddNewInstrText().Value = " PAGE ";
footerParagraph.AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.separate;
footerParagraph.AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.end;
footerPar = new XWPFParagraph(footerParagraph,doc);
parsFooter = new XWPFParagraph[1];
parsFooter[0] = footerPar;
headerfooterPolicy.CreateFooter(XWPFheaderfooterPolicy.DEFAULT,parsFooter);

使用上面的代码,我看不到第一页的自定义页脚,但可以看到每一页中的页码。我做错了什么?

我找到了 this similar question,但在 NPOI 中找不到 addNewTitlePg 方法

关于 NPOI 是否有任何适当的文档和示例?

解决方法

这是我的第一个页脚工作的代码。 (使用 NPOI 2.5.3)

var doc = new XWPFDocument();
using (var sw = File.Create("fileformat.docx"))
{
    
    XWPFParagraph p1 = doc.CreateParagraph();
    XWPFParagraph p2 = doc.CreateParagraph();
    XWPFRun r1 = p1.CreateRun();
    XWPFRun r2 = p2.CreateRun();


    r1.SetText("The quick brown fox");
    r1.AddBreak(BreakType.PAGE);
    r2.SetText("Next page: The quick brown fox");

    doc.Document.body.sectPr = new CT_SectPr();

    var policy = doc.CreateHeaderFooterPolicy();
    var ctSectPr = doc.Document.body.sectPr;
    if (ctSectPr.titlePg == null)
    {
        ctSectPr.titlePg = new CT_OnOff() { val = true };
    }
    var firstFooter = policy.CreateFooter(ST_HdrFtr.first);
    
    var paragraph = firstFooter.CreateParagraph();
    var run = paragraph.CreateRun();
    run.SetText("First page footer...");

    var defaultFooter = policy.CreateFooter(ST_HdrFtr.@default);

    paragraph = defaultFooter.CreateParagraph();
    run = paragraph.CreateRun();

    paragraph.Alignment = ParagraphAlignment.RIGHT;
    paragraph.GetCTP().AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.begin;
    paragraph.GetCTP().AddNewR().AddNewInstrText().Value = " PAGE ";
    paragraph.GetCTP().AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.separate;
    paragraph.GetCTP().AddNewR().AddNewFldChar().fldCharType = ST_FldCharType.end;

    run = paragraph.CreateRun();


    doc.Write(sw);
    
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...