首页 文章

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

提问于
浏览
2

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

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

XWPFDocument document = new XWPFDocument();

// adding header and footer
CTP ctp = CTP.Factory.newInstance();
CTR ctr = ctp.addNewR();

// create footer components
CTText footerCopyrightText = ctr.addNewT();
footerCopyrightText.setStringValue("\u00A9" + " My Website - " + Calendar.getInstance().get(Calendar.YEAR));

CTText footerPageText = ctr.addNewT();
footerPageText.setStringValue(document.getProperties().getExtendedProperties().getUnderlyingProperties().getPages() + "");

XWPFParagraph footerCopyrightParagraph = new XWPFParagraph( ctp, document );
footerCopyrightParagraph.setAlignment(ParagraphAlignment.CENTER);

XWPFParagraph footerPageParagraph = new XWPFParagraph(ctp, document);
footerPageParagraph.setAlignment(ParagraphAlignment.RIGHT);

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

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

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

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

关于我做错的任何想法?

谢谢,

2 回答

  • 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

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

    Creating footer object code

    // 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 method

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

相关问题