2014-12-10 3 views
4

POI 3.10을 사용하여 Word 문서 (XWPF)를 만들었습니다. 대부분의 작업은 간단하지만 페이지 번호를 추가하는 방법을 알지 못합니다. 바닥 글을 추가했지만 바닥 글의 텍스트가 모든 페이지에서 동일합니다.Apache POI 페이지 번호 추가 방법

+2

현재 바닥 글에 페이지 번호를 어떻게 추가하고 있습니까? 시도한 코드를 보여줄 수 있습니까? – Gagravarr

+0

나도 필요합니다 - 바닥 글에 페이지 번호를 추가하는 중 ...이 중 하나가 제안 할 수 ... –

답변

8

오른쪽에있는 바닥 글에 LibreOffice를 만들고 XML 파일을 조사했습니다 (MS Word-Std-Objects는 지원되지 않음). POI에서는 페이지 번호로 사용됩니다).

이 더 복잡 꼬리말을 만들 수있게된다 ..

대신 STJc.RIGHT의 ctjc에 대한 다른 값을 설정하는 다른 포지션 수를 설정 ...

결과는 다음과 같다 :

// create footer 
XWPFHeaderFooterPolicy policy = doc.getHeaderFooterPolicy(); 
CTP ctpFooter = CTP.Factory.newInstance(); 

XWPFParagraph[] parsFooter; 

// add style (s.th.) 
CTPPr ctppr = ctpFooter.addNewPPr(); 
CTString pst = ctppr.addNewPStyle(); 
pst.setVal("style21"); 
CTJc ctjc = ctppr.addNewJc(); 
ctjc.setVal(STJc.RIGHT); 
ctppr.addNewRPr(); 

// Add in word "Page " 
CTR ctr = ctpFooter.addNewR(); 
CTText t = ctr.addNewT(); 
t.setStringValue("Page "); 
t.setSpace(Space.PRESERVE); 

// add everything from the footerXXX.xml you need 
ctr = ctpFooter.addNewR(); 
ctr.addNewRPr(); 
CTFldChar fch = ctr.addNewFldChar(); 
fch.setFldCharType(STFldCharType.BEGIN); 

ctr = ctpFooter.addNewR(); 
ctr.addNewInstrText().setStringValue(" PAGE "); 

ctpFooter.addNewR().addNewFldChar().setFldCharType(STFldCharType.SEPARATE); 

ctpFooter.addNewR().addNewT().setStringValue("1"); 

ctpFooter.addNewR().addNewFldChar().setFldCharType(STFldCharType.END); 

XWPFParagraph footerParagraph = new XWPFParagraph(ctpFooter, doc); 

parsFooter = new XWPFParagraph[1]; 

parsFooter[0] = footerParagraph; 

policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter); 
+0

나는 이것을 사용하고 표시 할 페이지 번호가있어! 하지만 나는 PAGE라는 단어를 표시 할 수 없다. 너 hep? @Sempfer –

+0

편집 된 답변에서 'PAGE' 단어를 추가하십시오. – jmarkmurphy

+0

방금 ​​저를 구해 줬습니다! ... JDK 6에서 작동 중입니다. po5 3.15 –

0
CTP ctp = CTP.Factory.newInstance(); 
//this add page number incremental 
ctp.addNewR().addNewPgNum(); 

XWPFParagraph codePara = new XWPFParagraph(ctp, document); 
XWPFParagraph[] paragraphs = new XWPFParagraph[1]; 
paragraphs[0] = codePara; 
//position of number 
codePara.setAlignment(ParagraphAlignment.CENTER); 

CTSectPr sectPr = document.getDocument().getBody().addNewSectPr(); 

try { 
    XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr); 
    headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, paragraphs); 
} catch (IOException | XmlException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+0

headerFooterPolicy.createFooter (STHdrFtr.DEFAULT, 단락); 이 행은 다음과 같습니다. headerFooterPolicy.createHeader (STHdrFtr.DEFAULT, paragraphs); –

+0

사양에서 :주의 : pgNum 블록은 오래된 워드 프로세서와의 호환성을 위해 사용되는 레거시 구조이며, 문서를 읽는 동안 소비되지 않는 한 생성해서는 안됩니다. ' – jmarkmurphy