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

ApachePOIJava:如何更改WORD文档中列表编号的字体名称和大小?,java,apache-poi,Java,Apache Poi,我写了一个方法来为word文档的某些段落添加编号,但是我似乎无法自定义列表编号的字体名称和字体大小(例如:a.我的项目1,b.我的项目2)。我可以自定义段落中的字体,但无法自定义列表编号的字体名称和字体大小。下面的代码中是否有我可能缺少的内容 public static BigInteger listNumbering(XWPFDocument doc, BigInteger abstractNumID) { CTAbstractNum cTAbstractNum = CTA

我写了一个方法来为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;
     }

您的代码仅为文档创建十进制编号格式,并获取相应的
NumID
。然后,该
NumID
需要应用于文件中应编号的段落。格式由段落决定

编号本身的格式由段落的运行属性决定。不幸的是,到目前为止,
XWPFParagraph
中还没有设置段落运行属性的方法。因此,我们需要使用低级
ooxml模式
类来实现这一点。在下面的代码中,方法
setParagraphRunProperties(XWPFParagraph段落,字符串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();

 }
}

代码工作正常。我不仅能够添加编号,而且能够正确自定义列表编号的字体。谢谢