2017-08-21 281 views
1

从另一个(已回答)问题中,我学到了如何将页计数器添加到Word文档中。此外,我需要在字段(即页面计数器)上设置字体家族样式(颜色,粗体,斜体,下划线...)。这怎么能实现?Apache POI:如何为字段设置字体样式(PAGE,PAGENUM,PAGEREF ...)

CTSimpleField ctSimpleField = paragraph.getCTP().addNewFldSimple(); 

CTSimpleField不提供直接设置这些属性的方法。

原题:How to add page numbers in format X of Y while creating a word document using apache poi api?

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 "); 
    // this adds the page counter 
    paragraph.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT"); 
    run = paragraph.createRun(); 
    run.setText(" of "); 
    // this adds the page total number 
    paragraph.getCTP().addNewFldSimple().setInstr("NUMPAGES \\* MERGEFORMAT"); 

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

} 
} 
+0

格式仅格式 “页” “Y的页x” 和 “的”,但不能x或y。
XWPFRun run = paragraph.createRun(); run.setText(“Page”); run.setBold(true); run.setFontFamily(“Arial”); –

回答

2

为了能够格式化,我们需要在Word运行。但要使用运行创建字段,我们需要为每个字段运行三次。一次运行标记FldChar开始,然后一次运行标记字段InstrText和第三次运行标记FldChar结束。每次运行都可以,但也必须根据需要进行格式化。

实施例:

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.setBold(true); 
    run.setText("Page "); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewFldChar().setFldCharType(org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType.BEGIN); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewInstrText().setStringValue("PAGE \\* MERGEFORMAT"); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewFldChar().setFldCharType(org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType.END); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.setText(" of "); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewFldChar().setFldCharType(org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType.BEGIN); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewInstrText().setStringValue("NUMPAGES \\* MERGEFORMAT"); 

    run = paragraph.createRun(); 
    run.setBold(true); 
    run.getCTR().addNewFldChar().setFldCharType(org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType.END); 

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

} 
}