Apache POI - 在同一行上添加多个段落到页眉/页脚

时间:2015-11-26 13:31:49

标签: java apache-poi xwpf

我正在使用Apace POI处理一些文档,我想添加一个由多个段落组成的页眉/页脚,但我希望它们显示在同一行。

这是我到目前为止的尝试:

users_currently_visible

然而,到目前为止,最终结果是我得到一个右对齐文本,它由两个连接的XWPFParagraph组成。

我还在Stack Overflow上检查了一些其他示例(有一个用于Header,但我没有设法让它工作)。

我想要实现的基本想法是:http://imgur.com/jrwVO0F

关于我做错的任何想法?

谢谢,

2 个答案:

答案 0 :(得分:2)

添加Tabstops并使用它们

这是我的草稿 - 在A4文件上打印我的名字左,中,右。我不知道如何计算这些位置元素...添加tabstops的代码来自Java Apache POI Tab Stop word document

import java.awt.Desktop;
import java.io.*;
import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class POIExample {
    public static void main(String[] args) {
        try {
            XWPFDocument document = new XWPFDocument();
            XWPFParagraph paragraph = document.createParagraph();

            XWPFRun tmpRun = paragraph.createRun();
            tmpRun.setText("JAN");
            tmpRun.addTab();
            tmpRun.setText("JAN");
            tmpRun.addTab();
            tmpRun.setText("JAN");

            BigInteger pos1 = BigInteger.valueOf(4500);
            setTabStop(paragraph, STTabJc.Enum.forString("center"), pos1);
            BigInteger pos2 = BigInteger.valueOf(9000);
            setTabStop(paragraph, STTabJc.Enum.forString("right"), pos2);

            File f = File.createTempFile("poi", ".docx");
            try (FileOutputStream fo = new FileOutputStream(f)) {
                document.write(fo);
            }
            Desktop.getDesktop().open(f);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void setTabStop(XWPFParagraph oParagraph, STTabJc.Enum oSTTabJc, BigInteger oPos) {
        CTP oCTP = oParagraph.getCTP();
        CTPPr oPPr = oCTP.getPPr();
        if (oPPr == null) {
            oPPr = oCTP.addNewPPr();
        }

        CTTabs oTabs = oPPr.getTabs();
        if (oTabs == null) {
            oTabs = oPPr.addNewTabs();
        }

        CTTabStop oTabStop = oTabs.addNewTab();
        oTabStop.setVal(oSTTabJc);
        oTabStop.setPos(oPos);
    }
}

答案 1 :(得分:1)

所以,经过一些修补,我终于有了一个功能正常的版本。这里希望它对其他用户也有用。

创建页脚对象代码

    // create footer components
    XWPFDocument document = new XWPFDocument();
    CTP footerCtp = CTP.Factory.newInstance();
    CTR footerCtr = footerCtp.addNewR();
    XWPFParagraph footerCopyrightParagraph = new XWPFParagraph(footerCtp, document);
    document.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();
    XWPFRun run = footerCopyrightParagraph.getRun(footerCtr);
    run.setText("My Website.com");
    run.addTab();
    run.setText("\u00A9" + " My Website - " + Calendar.getInstance().get(Calendar.YEAR));
    run.addTab();
    run.setText("Right Side Text");

    setTabStop(footerCtp, STTabJc.Enum.forString("right"), BigInteger.valueOf(9000));

    XWPFParagraph[] footerParagraphs = {footerCopyrightParagraph};
    CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
    XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
    headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, footerParagraphs);

SetTabStop方法

private static void setTabStop(CTP oCTP, STTabJc.Enum oSTTabJc, BigInteger oPos) {
    CTPPr oPPr = oCTP.getPPr();
    if (oPPr == null) {
        oPPr = oCTP.addNewPPr();
    }

    CTTabs oTabs = oPPr.getTabs();
    if (oTabs == null) {
        oTabs = oPPr.addNewTabs();
    }

    CTTabStop oTabStop = oTabs.addNewTab();
    oTabStop.setVal(oSTTabJc);
    oTabStop.setPos(oPos);
}