为Apache POIFS中的每个部分生成不同的标头

时间:2016-12-14 13:46:35

标签: java apache-poi

我正在尝试将差异文档(Docx)与Apache POIFS连接起来,但无法在每个部分上定义相应的标头。 我的第一页显示有自己的标题,然后我只有一个标题用于所有其他页面。 并且无法成功找到每个部分的不同标题。

如果有人知道怎么做,请 这是我的代码,它简单地将我的所有附加标题连接到原始标题(最后,我只有一个标题,其中所有不同的原始标题的所有值都连接在其中)。

    private void appendHeader(final XWPFDocument destDocx, final XWPFDocument additionalDocx) throws IOException, XmlException {
        ////// ==>  No matter how I create the policy, the result is the same
//        final XWPFHeaderFooterPolicy destPolicy = destDocx.createHeaderFooterPolicy();
        final XWPFHeaderFooterPolicy destPolicy = new XWPFHeaderFooterPolicy(destDocx);
        final List<XWPFHeader> destHeaders = destDocx.getHeaderList();
        LOGGER.trace("Dest header size: {}", destHeaders.size());
        LOGGER.trace("Additional header size: {}", additionalDocx.getHeaderList().size());

        // Loop on additional headers to add them to the dest doc.
        for (final XWPFHeader additionaHeader : additionalDocx.getHeaderList()) {
            // Get the new header I want for this section
            final String additionalXmlHeader = additionaHeader._getHdrFtr().xmlText();

            // Format it properly
            final CTHdrFtr newHeader = CTHdrFtr.Factory.parse(additionalXmlHeader);
            // And add it to the document
            ////// ==> No matter how I set my header...
//            destHeader.setHeaderFooter(newHeader);
            final XWPFHeader destHeader = new XWPFHeader(destDocx, newHeader);
        }

        // This simply increases each time I'm adding a new header while I would like to have specific header for each section of the document
        LOGGER.trace("New dest header size: {}", destHeaders.size());
    }

干杯。 奥利弗

1 个答案:

答案 0 :(得分:1)

这很困难,因为POI还不支持创建多个部分,并且它也不支持向默认部分以外的任何部分添加页眉和页脚(恰好是文档中的最后一部分)。您可以使用CT类做您想做的事情,但是您将不得不研究各部分是如何工作的,因为我还没有完成所有各种要求。

如果您打算使用CT课程,那么这就是需要发生的事情。您需要在每个分节符添加一个段落。然后,您需要在该段落中创建一个section属性元素。顺便说一下,默认部分可以在文档正文的末尾找到而没有段落包装,这是默认部分,它包含了前一部分段落之前的所有内容。因此,部分属性可以在本节末尾找到,而不是像您期望的那样在开头找到。除最后一节之外的所有节属性都包含在段落中。最后一节是默认部分。怪不是吗?现在,在您想要具有特殊标题的部分中,您需要添加页眉/页脚关系。看看最后一节,看看它是什么样的。你可以复制它。然后困难的部分是你必须手动为这些关系创建一个新的标题部分,因为如果你只是使用现有方法创建一个新的默认或第一页标题,它将返回默认部分的当前页眉或页脚(创建一个如果它还不存在)。这意味着您必须完成创建标题代码并将其概括为创建部件并将关系插入您想要页眉/页脚的部分。

现在,如果你想要的只是在文档的第一页上有一个不同的标题,你可以用POI做到这一点,因为它不需要多个部分。以下是你将如何做到这一点。

    XWPFDocument doc = new XWPFDocument();

    XWPFParagraph p = doc.createParagraph();

    XWPFRun r = p.createRun();
    r.setText("Some Text");
    r.setBold(true);
    r = p.createRun();
    r.setText("Goodbye");

    // create header/footer functions insert an empty paragraph
    XWPFHeader head = doc.createHeader(HeaderFooterType.FIRST);
    head.createParagraph().createRun().setText("First page header");

    XWPFFooter foot = doc.createFooter(HeaderFooterType.FIRST);
    foot.createParagraph().createRun().setText("First page footer");

    // create header/footer functions insert an empty paragraph
    XWPFHeader head = doc.createHeader(HeaderFooterType.DEFAULT);
    head.createParagraph().createRun().setText("header");

    XWPFFooter foot = doc.createFooter(HeaderFooterType.DEFAULT);
    foot.createParagraph().createRun().setText("footer");

    OutputStream os = new FileOutputStream(new File("header2.docx"));
    doc.write(os);
    doc.close();

即使存在枚举,即使/奇数页页眉和页脚也不支持(从3.16 beta 1开始)用于创建。