2016-12-29 1 views
1

は、総ページ数を取得するためにPOIのAPIで指定されたいずれかの方法がありますが、私は、文書のフッターにページ番号を追加することですが、私は、ページ値の合計数を追加することはできませんよ。 Wordapache poi apiを使って単語文書を作成する際に、Xの書式Xでページ番号を追加するには?

+2

残念ながら、単語にはファイルにページ番号が格納されず、テキスト、サイズなどに基づいてオンザフライで生成されます。 – Shank

答えて

5

ページ数は、その上の段落、トップ/ボトムマージンとパディング、プリンタ設定、手動で挿入改ページとフォントサイズのような多くのものを依存しています。したがって、ファイルに直接格納することはできません。 Wordがそのページをレンダリングしている間、それは即座に計算されます。

しかし、ページ番号と総ページ数も計算するフッタ内のフィールドを使用できます。

例:

import java.io.*; 

import org.apache.poi.xwpf.usermodel.*; 

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; 

public class CreateWordHeaderFooter { 

public static void main(String[] args) throws Exception { 

    XWPFDocument doc= new XWPFDocument(); 

    // the body content 
    XWPFParagraph paragraph = doc.createParagraph(); 
    XWPFRun run=paragraph.createRun(); 
    run.setText("The Body:"); 

    paragraph = doc.createParagraph(); 
    run=paragraph.createRun(); 
    run.setText("Lorem ipsum.... page 1"); 

    paragraph = doc.createParagraph(); 
    run=paragraph.createRun(); 
    run.addBreak(BreakType.PAGE); 
    run.setText("Lorem ipsum.... page 2"); 

    paragraph = doc.createParagraph(); 
    run=paragraph.createRun(); 
    run.addBreak(BreakType.PAGE); 
    run.setText("Lorem ipsum.... page 3"); 

    // create header-footer 
    XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy(); 
    if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy(); 

    // create header start 
    XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); 

    paragraph = header.getParagraphArray(0); 
    if (paragraph == null) paragraph = header.createParagraph(); 
    paragraph.setAlignment(ParagraphAlignment.LEFT); 

    run = paragraph.createRun(); 
    run.setText("The Header:"); 

    // create footer start 
    XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT); 

    paragraph = footer.getParagraphArray(0); 
    if (paragraph == null) paragraph = footer.createParagraph(); 
    paragraph.setAlignment(ParagraphAlignment.CENTER); 

    run = paragraph.createRun(); 
    run.setText("Page "); 
    paragraph.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT"); 
    run = paragraph.createRun(); 
    run.setText(" of "); 
    paragraph.getCTP().addNewFldSimple().setInstr("NUMPAGES \\* MERGEFORMAT"); 

    doc.write(new FileOutputStream("CreateWordHeaderFooter.docx")); 

} 
} 

Wordのフィールドは、次に{PAGE \* MERGEFORMAT}{NUMPAGES \* MERGEFORMAT}あります。

+0

この回答からインスピレーションを得て、現在のページとフッター。しかし、私は文書の本文に同じ種類の情報を追加することに失敗しました。私はまったく同じコードを使用していますが、フッターでは動作しますが、ドキュメントの本体では動作しない理由はありますか?追加情報:私はYYYY-MM-DD \「\\ * MERGEFORMAT」\「@ \\ DATE」と「* \\ MERGEFORMATをPAGE」を置換し、この場合には、コードが期待通りに動作していて、内部の現在の日付を追加します文書の本文 – rlar

+0

私が書いたコードが実際に動作していることに気がつきました。唯一の問題は、フィールドが自動的に更新されず、空のままであることです。手動ですべてのフィールドの更新をトリガーすると、ページ数が文書の本文にも表示されます。 DATE変数にフィールドの更新を手動でトリガする必要はないのはなぜですか? – rlar

+0

@rlar:問題はかなり明確です。 Wordは、最初にドキュメントの本文部分とヘッダーとフッター部分をレンダリングします。ページの実際のページ数と合計数は、すでに知られていない文書の体の部分をレンダリングしながら、そう。どちらもレンダリングプロセスの結果です。もちろん、日付はレンダリングプロセスに関係なく知られています。 –

関連する問題