Apache poi Java:如何更改WORD文档中列表编号的字体名称和大小



我写了一个方法来为word文档的某些段落添加编号,但我似乎无法自定义列表编号的字体名称和字体大小(例如:a.我的项目1,b.我的项目2(。我可以自定义段落中的字体,但无法自定义列表编号的字体名称和字体大小。下面的代码中有我可能缺少的东西吗?

public static BigInteger listNumbering(XWPFDocument doc, BigInteger abstractNumID) {
CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
cTAbstractNum.setAbstractNumId(abstractNumID);
CTLvl cTLvl = cTAbstractNum.addNewLvl();
cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
cTLvl.addNewLvlText().setVal("%1.");
cTLvl.addNewStart().setVal(BigInteger.valueOf(1));
XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
XWPFNumbering numbering = doc.createNumbering();
abstractNumID = numbering.addAbstractNum(abstractNum);
BigInteger numID = numbering.addNum(abstractNumID);
return numID;
}

您的代码只为文档创建一个十进制编号格式,并获得适当的NumIDNumID需要应用于文件中应编号的段落。格式由段落决定。

编号本身的格式由段落的运行属性决定。遗憾的是,到目前为止,XWPFParagraph中还没有设置段落运行属性的方法。所以我们需要使用低级别的ooxml-schemas类来实现这一点。在下面的代码中,方法setParagraphRunProperties(XWPFParagraph paragraph, String fontFamily, int fontSize)就是这样做的。

编号段落的格式由其文本运行的格式决定。

完整示例:

import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;
import java.math.BigInteger;
public class CreateWordNumberingsFormatted {
static BigInteger getNewDecimalNumberingId(XWPFDocument document, BigInteger abstractNumID) {
CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
cTAbstractNum.setAbstractNumId(abstractNumID);
CTLvl cTLvl = cTAbstractNum.addNewLvl();
cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
cTLvl.addNewLvlText().setVal("%1.");
cTLvl.addNewStart().setVal(BigInteger.valueOf(1));
XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
XWPFNumbering numbering = document.createNumbering();
abstractNumID = numbering.addAbstractNum(abstractNum);
BigInteger numID = numbering.addNum(abstractNumID);
return numID;
}
static void setParagraphRunProperties(XWPFParagraph paragraph, String fontFamily, int fontSize) {
if (!paragraph.getCTP().isSetPPr()) paragraph.getCTP().addNewPPr();
if (!paragraph.getCTP().getPPr().isSetRPr()) paragraph.getCTP().getPPr().addNewRPr();
if (!paragraph.getCTP().getPPr().getRPr().isSetRFonts()) paragraph.getCTP().getPPr().getRPr().addNewRFonts();
if (!paragraph.getCTP().getPPr().getRPr().isSetSz()) paragraph.getCTP().getPPr().getRPr().addNewSz();
if (!paragraph.getCTP().getPPr().getRPr().isSetSzCs()) paragraph.getCTP().getPPr().getRPr().addNewSzCs();
paragraph.getCTP().getPPr().getRPr().getRFonts().setAscii(fontFamily);
paragraph.getCTP().getPPr().getRPr().getRFonts().setHAnsi(fontFamily);
paragraph.getCTP().getPPr().getRPr().getSz().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
paragraph.getCTP().getPPr().getRPr().getSzCs().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
}

public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();  
run.setText("The paragraph before first numbering:");
int abstractNumID = 0;
//get NumID for first decimal numbering
BigInteger numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID++));
//now apply that NumID to first list
String fontFamily = "Times New Roman";
int fontSize = 24;
//first paragraph
paragraph = document.createParagraph();
//apply NumID
paragraph.setNumID(numID);
//set paragraph run properties
setParagraphRunProperties(paragraph, fontFamily, fontSize);
//create text runs and format
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("One");
//further numbered paragraphs
paragraph = document.createParagraph();
paragraph.setNumID(numID);
setParagraphRunProperties(paragraph, fontFamily, fontSize);
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("Two");
paragraph = document.createParagraph();
paragraph.setNumID(numID);
setParagraphRunProperties(paragraph, fontFamily, fontSize);
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("Three");
paragraph = document.createParagraph();
//get NumID forsecond decimal numbering
numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID++));
//now apply that NumID to second list having different font
fontFamily = "Courier New";
fontSize = 32;
paragraph = document.createParagraph();
paragraph.setNumID(numID);
setParagraphRunProperties(paragraph, fontFamily, fontSize);
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("One");
paragraph = document.createParagraph();
paragraph.setNumID(numID);
setParagraphRunProperties(paragraph, fontFamily, fontSize);
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("Two");
paragraph = document.createParagraph();
paragraph.setNumID(numID);
setParagraphRunProperties(paragraph, fontFamily, fontSize);
run = paragraph.createRun(); 
run.setFontFamily(fontFamily); 
run.setFontSize(fontSize); 
run.setText("Three");
paragraph = document.createParagraph();
FileOutputStream out = new FileOutputStream("CreateWordNumberingsFormatted.docx");
document.write(out);
out.close();
document.close();
}
}

最新更新