Apache POI:如何设置字段的字体样式(PAGE、PAGENUM、PAGEREF...)
Apache POI: How to set font style for a field (PAGE, PAGENUM, PAGEREF...)
从另一个(已回答的)问题中,我了解了如何将页面计数器添加到 Word 文档中。此外,我需要在字段(即页面计数器)上设置字体系列样式(颜色、粗体、斜体、下划线……)。如何实现?
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"));
}
}
为了能够格式化,我们需要 Word
中的 运行s。但是要使用 运行 创建字段,每个字段需要三个 运行。一个 运行 标记 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"));
}
}
从另一个(已回答的)问题中,我了解了如何将页面计数器添加到 Word 文档中。此外,我需要在字段(即页面计数器)上设置字体系列样式(颜色、粗体、斜体、下划线……)。如何实现?
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"));
}
}
为了能够格式化,我们需要 Word
中的 运行s。但是要使用 运行 创建字段,每个字段需要三个 运行。一个 运行 标记 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"));
}
}